drivers/net/wireless/realtek/rtw88/sdio.c
Source file repositories/reference/linux-study-clean/drivers/net/wireless/realtek/rtw88/sdio.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/wireless/realtek/rtw88/sdio.c- Extension
.c- Size
- 35059 bytes
- Lines
- 1444
- 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.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/module.hlinux/mmc/host.hlinux/mmc/sdio_func.hmain.hmac.hdebug.hfw.hps.hreg.hrx.hsdio.htx.h
Detected Declarations
function Copyrightfunction rtw_sdio_bus_claim_neededfunction rtw_sdio_to_bus_offsetfunction rtw_sdio_use_memcpy_iofunction rtw_sdio_writelfunction rtw_sdio_writewfunction rtw_sdio_readlfunction rtw_sdio_readwfunction rtw_sdio_to_io_addressfunction rtw_sdio_use_direct_iofunction rtw_sdio_indirect_reg_cfgfunction rtw_sdio_indirect_read8function rtw_sdio_indirect_read_bytesfunction rtw_sdio_indirect_read16function rtw_sdio_indirect_read32function rtw_sdio_read8function rtw_sdio_read16function rtw_sdio_read32function rtw_sdio_indirect_write8function rtw_sdio_indirect_write16function rtw_sdio_indirect_write32function rtw_sdio_write8function rtw_sdio_write16function rtw_sdio_write32function rtw_sdio_get_tx_addrfunction rtw_sdio_read_portfunction rtw_sdio_check_free_txpgfunction rtw_sdio_write_portfunction rtw_sdio_initfunction rtw_sdio_enable_rx_aggregationfunction rtw_sdio_enable_interruptfunction rtw_sdio_disable_interruptfunction rtw_sdio_get_tx_qselfunction rtw_sdio_setupfunction rtw_sdio_startfunction rtw_sdio_stopfunction rtw_sdio_deep_ps_enterfunction rtw_sdio_deep_ps_leavefunction rtw_sdio_deep_psfunction rtw_sdio_tx_kick_offfunction rtw_sdio_link_psfunction rtw_sdio_tx_skb_preparefunction rtw_sdio_write_datafunction rtw_sdio_write_data_rsvd_pagefunction rtw_sdio_write_data_h2cfunction rtw_sdio_tx_writefunction rtw_sdio_tx_err_isrfunction rtw_sdio_rx_skb
Annotated Snippet
if (err) {
rtw_warn(rtwdev,
"Failed to read %zu byte(s) from SDIO port 0x%08x: %d",
bytes, rxaddr, err);
/* Signal to the caller that reading did not work and
* that the data in the buffer is short/corrupted.
*/
ret = err;
/* Don't stop here - instead drain the remaining data
* from the card's buffer, else the card will return
* corrupt data for the next rtw_sdio_read_port() call.
*/
}
count -= bytes;
buf += bytes;
}
if (bus_claim)
sdio_release_host(rtwsdio->sdio_func);
return ret;
}
static int rtw_sdio_check_free_txpg(struct rtw_dev *rtwdev, u8 queue,
size_t count)
{
unsigned int pages_free, pages_needed;
if (rtw_chip_wcpu_8051(rtwdev)) {
u32 free_txpg;
free_txpg = rtw_sdio_read32(rtwdev, REG_SDIO_FREE_TXPG);
switch (queue) {
case RTW_TX_QUEUE_BCN:
case RTW_TX_QUEUE_H2C:
case RTW_TX_QUEUE_HI0:
case RTW_TX_QUEUE_MGMT:
/* high */
pages_free = free_txpg & 0xff;
break;
case RTW_TX_QUEUE_VI:
case RTW_TX_QUEUE_VO:
/* normal */
pages_free = (free_txpg >> 8) & 0xff;
break;
case RTW_TX_QUEUE_BE:
case RTW_TX_QUEUE_BK:
/* low */
pages_free = (free_txpg >> 16) & 0xff;
break;
default:
rtw_warn(rtwdev, "Unknown mapping for queue %u\n", queue);
return -EINVAL;
}
/* add the pages from the public queue */
pages_free += (free_txpg >> 24) & 0xff;
} else {
u32 free_txpg[3];
free_txpg[0] = rtw_sdio_read32(rtwdev, REG_SDIO_FREE_TXPG);
free_txpg[1] = rtw_sdio_read32(rtwdev, REG_SDIO_FREE_TXPG + 4);
free_txpg[2] = rtw_sdio_read32(rtwdev, REG_SDIO_FREE_TXPG + 8);
switch (queue) {
case RTW_TX_QUEUE_BCN:
case RTW_TX_QUEUE_H2C:
case RTW_TX_QUEUE_HI0:
/* high */
pages_free = free_txpg[0] & 0xfff;
break;
case RTW_TX_QUEUE_VI:
case RTW_TX_QUEUE_VO:
/* normal */
pages_free = (free_txpg[0] >> 16) & 0xfff;
break;
case RTW_TX_QUEUE_BE:
case RTW_TX_QUEUE_BK:
/* low */
pages_free = free_txpg[1] & 0xfff;
break;
case RTW_TX_QUEUE_MGMT:
/* extra */
pages_free = free_txpg[2] & 0xfff;
break;
default:
Annotation
- Immediate include surface: `linux/module.h`, `linux/mmc/host.h`, `linux/mmc/sdio_func.h`, `main.h`, `mac.h`, `debug.h`, `fw.h`, `ps.h`.
- Detected declarations: `function Copyright`, `function rtw_sdio_bus_claim_needed`, `function rtw_sdio_to_bus_offset`, `function rtw_sdio_use_memcpy_io`, `function rtw_sdio_writel`, `function rtw_sdio_writew`, `function rtw_sdio_readl`, `function rtw_sdio_readw`, `function rtw_sdio_to_io_address`, `function rtw_sdio_use_direct_io`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: integration implementation candidate.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
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.