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.
- 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
wifi.hcore.husb.hbase.hps.hrtl8192c/fw_common.hlinux/export.hlinux/module.h
Detected Declarations
function _usbctrl_vendorreq_syncfunction _usb_read_syncfunction _usb_write_syncfunction _usb_read8_syncfunction _usb_read16_syncfunction _usb_read32_syncfunction _usb_write8_syncfunction _usb_write16_syncfunction _usb_write32_syncfunction _usb_write_chunk_syncfunction _rtl_usb_io_handler_initfunction _rtl_usb_io_handler_releasefunction _rtl_usb_init_txfunction _rtl_usb_init_rxfunction _rtl_usb_initfunction rtl_usb_init_swfunction _rtl_prep_rx_urbfunction _rtl_usb_rx_process_aggfunction _rtl_usb_rx_process_noaggfunction _rtl_rx_pre_processfunction _rtl_rx_workfunction _rtl_rx_get_paddingfunction _rtl_rx_completedfunction _rtl_usb_cleanup_rxfunction _rtl_usb_receivefunction rtl_usb_startfunction _rtl_usb_cleanup_txfunction rtl_usb_cleanupfunction rtl_usb_deinitfunction rtl_usb_stopfunction _rtl_submit_tx_urbfunction _usb_tx_postfunction _rtl_tx_completefunction _rtl_usb_transmitfunction _rtl_usb_tx_preprocessfunction rtl_usb_txfunction rtl_usb_tx_chk_waitq_insertfunction rtl_fill_h2c_cmd_work_callbackfunction rtl_usb_probefunction rtl_usb_disconnectexport rtl_usb_probeexport rtl_usb_disconnect
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
- Immediate include surface: `wifi.h`, `core.h`, `usb.h`, `base.h`, `ps.h`, `rtl8192c/fw_common.h`, `linux/export.h`, `linux/module.h`.
- Detected declarations: `function _usbctrl_vendorreq_sync`, `function _usb_read_sync`, `function _usb_write_sync`, `function _usb_read8_sync`, `function _usb_read16_sync`, `function _usb_read32_sync`, `function _usb_write8_sync`, `function _usb_write16_sync`, `function _usb_write32_sync`, `function _usb_write_chunk_sync`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.