drivers/net/wireless/realtek/rtlwifi/usb.c

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

File Facts

System
Linux kernel
Corpus path
drivers/net/wireless/realtek/rtlwifi/usb.c
Extension
.c
Size
28587 bytes
Lines
1076
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: exported/initcall integration point
Status
integration 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 (status < 0) {
			/* firmware download is checksumed, don't retry */
			if ((value >= FW_8192C_START_ADDRESS &&
			    value <= FW_8192C_END_ADDRESS))
				break;
		} else {
			break;
		}
	} while (++vendorreq_times < MAX_USBCTRL_VENDORREQ_TIMES);

	if (status < 0 && count++ < 4)
		dev_err(&udev->dev, "reg 0x%x, usbctrl_vendorreq TimeOut! status:0x%x value=0x%x reqtype=0x%x\n",
		       value, status, *(u32 *)pdata, reqtype);
}

static u32 _usb_read_sync(struct rtl_priv *rtlpriv, u32 addr, u16 len)
{
	struct device *dev = rtlpriv->io.dev;
	struct usb_device *udev = to_usb_device(dev);
	u16 wvalue;
	__le32 *data;
	unsigned long flags;

	spin_lock_irqsave(&rtlpriv->locks.usb_lock, flags);
	if (++rtlpriv->usb_data_index >= RTL_USB_MAX_RX_COUNT)
		rtlpriv->usb_data_index = 0;
	data = &rtlpriv->usb_data[rtlpriv->usb_data_index];
	spin_unlock_irqrestore(&rtlpriv->locks.usb_lock, flags);

	wvalue = (u16)addr;
	_usbctrl_vendorreq_sync(udev, REALTEK_USB_VENQT_READ, wvalue, data, len);
	return le32_to_cpu(*data);
}


static void _usb_write_sync(struct rtl_priv *rtlpriv, u32 addr, u32 val, u16 len)
{
	struct device *dev = rtlpriv->io.dev;
	struct usb_device *udev = to_usb_device(dev);
	unsigned long flags;
	__le32 *data;
	u16 wvalue;

	spin_lock_irqsave(&rtlpriv->locks.usb_lock, flags);
	if (++rtlpriv->usb_data_index >= RTL_USB_MAX_RX_COUNT)
		rtlpriv->usb_data_index = 0;
	data = &rtlpriv->usb_data[rtlpriv->usb_data_index];
	spin_unlock_irqrestore(&rtlpriv->locks.usb_lock, flags);

	wvalue = (u16)(addr & 0x0000ffff);
	*data = cpu_to_le32(val);

	_usbctrl_vendorreq_sync(udev, REALTEK_USB_VENQT_WRITE, wvalue, data, len);
}

static u8 _usb_read8_sync(struct rtl_priv *rtlpriv, u32 addr)
{
	return (u8)_usb_read_sync(rtlpriv, addr, 1);
}

static u16 _usb_read16_sync(struct rtl_priv *rtlpriv, u32 addr)
{
	return (u16)_usb_read_sync(rtlpriv, addr, 2);
}

static u32 _usb_read32_sync(struct rtl_priv *rtlpriv, u32 addr)
{
	return _usb_read_sync(rtlpriv, addr, 4);
}

static void _usb_write8_sync(struct rtl_priv *rtlpriv, u32 addr, u8 val)
{
	_usb_write_sync(rtlpriv, addr, val, 1);
}

static void _usb_write16_sync(struct rtl_priv *rtlpriv, u32 addr, u16 val)
{
	_usb_write_sync(rtlpriv, addr, val, 2);
}

static void _usb_write32_sync(struct rtl_priv *rtlpriv, u32 addr, u32 val)
{
	_usb_write_sync(rtlpriv, addr, val, 4);
}

static void _usb_write_chunk_sync(struct rtl_priv *rtlpriv, u32 addr,
				  u32 length, u8 *data)
{
	struct usb_device *udev = to_usb_device(rtlpriv->io.dev);

Annotation

Implementation Notes