drivers/net/wireless/realtek/rtlwifi/rtl8192du/hw.c

Source file repositories/reference/linux-study-clean/drivers/net/wireless/realtek/rtlwifi/rtl8192du/hw.c

File Facts

System
Linux kernel
Corpus path
drivers/net/wireless/realtek/rtlwifi/rtl8192du/hw.c
Extension
.c
Size
32937 bytes
Lines
1213
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (acm) {
			switch (e_aci) {
			case AC0_BE:
				acm_ctrl |= ACMHW_BEQEN;
				break;
			case AC2_VI:
				acm_ctrl |= ACMHW_VIQEN;
				break;
			case AC3_VO:
				acm_ctrl |= ACMHW_VOQEN;
				break;
			default:
				rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
					"HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
					acm);
				break;
			}
		} else {
			switch (e_aci) {
			case AC0_BE:
				acm_ctrl &= (~ACMHW_BEQEN);
				break;
			case AC2_VI:
				acm_ctrl &= (~ACMHW_VIQEN);
				break;
			case AC3_VO:
				acm_ctrl &= (~ACMHW_VOQEN);
				break;
			default:
				pr_err("%s:%d switch case %#x not processed\n",
				       __func__, __LINE__, e_aci);
				break;
			}
		}
		rtl_dbg(rtlpriv, COMP_QOS, DBG_TRACE,
			"SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n",
			acm_ctrl);
		rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl);
		break;
	}
	case HW_VAR_RCR:
		mac->rx_conf = ((u32 *)val)[0];
		rtl_write_dword(rtlpriv, REG_RCR, mac->rx_conf);
		break;
	case HW_VAR_H2C_FW_JOINBSSRPT: {
		u8 tmp_regcr, tmp_reg422;
		bool recover = false;
		u8 mstatus = *val;

		if (mstatus == RT_MEDIA_CONNECT) {
			rtlpriv->cfg->ops->set_hw_reg(hw,
						      HW_VAR_AID, NULL);
			tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
			rtl_write_byte(rtlpriv, REG_CR + 1,
				       tmp_regcr | ENSWBCN);
			_rtl92du_set_bcn_ctrl_reg(hw, 0, EN_BCN_FUNCTION);
			_rtl92du_set_bcn_ctrl_reg(hw, DIS_TSF_UDT, 0);
			tmp_reg422 = rtl_read_byte(rtlpriv,
						   REG_FWHW_TXQ_CTRL + 2);
			if (tmp_reg422 & (EN_BCNQ_DL >> 16))
				recover = true;
			rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2,
				       tmp_reg422 & ~(EN_BCNQ_DL >> 16));

			/* We don't implement FW LPS so this is not needed. */
			/* rtl92d_set_fw_rsvdpagepkt(hw, 0); */

			_rtl92du_set_bcn_ctrl_reg(hw, EN_BCN_FUNCTION, 0);
			_rtl92du_set_bcn_ctrl_reg(hw, 0, DIS_TSF_UDT);
			if (recover)
				rtl_write_byte(rtlpriv,
					       REG_FWHW_TXQ_CTRL + 2,
					       tmp_reg422);
			rtl_write_byte(rtlpriv, REG_CR + 1,
				       tmp_regcr & ~ENSWBCN);
		}
		rtl92d_set_fw_joinbss_report_cmd(hw, (*val));
		break;
	}
	case HW_VAR_CORRECT_TSF: {
		u8 btype_ibss = val[0];

		if (btype_ibss)
			rtl92d_stop_tx_beacon(hw);
		_rtl92du_set_bcn_ctrl_reg(hw, 0, EN_BCN_FUNCTION);
		rtl_write_dword(rtlpriv, REG_TSFTR,
				(u32)(mac->tsf & 0xffffffff));
		rtl_write_dword(rtlpriv, REG_TSFTR + 4,
				(u32)((mac->tsf >> 32) & 0xffffffff));
		_rtl92du_set_bcn_ctrl_reg(hw, EN_BCN_FUNCTION, 0);

Annotation

Implementation Notes