static void rx_event_task(unsigned long dev) { struct ks_wlan_private *priv = (struct ks_wlan_private *)dev; struct rx_device_buffer *rp; DPRINTK(4, "\n"); if (cnt_rxqbody(priv) > 0 && priv->dev_state >= DEVICE_STATE_BOOT) { rp = &priv->rx_dev.rx_dev_buff[priv->rx_dev.qhead]; hostif_receive(priv, rp->data, rp->size); inc_rxqhead(priv); if (cnt_rxqbody(priv) > 0) tasklet_schedule(&priv->rx_bh_task); } }
static void ks_wlan_hw_rx(struct ks_wlan_private *priv, uint16_t size) { int ret; struct rx_device_buffer *rx_buffer; struct hostif_hdr *hdr; unsigned short event = 0; DPRINTK(4, "\n"); /* receive data */ if (cnt_rxqbody(priv) >= (RX_DEVICE_BUFF_SIZE - 1)) { DPRINTK(1, "rx buffer overflow\n"); return; } rx_buffer = &priv->rx_dev.rx_dev_buff[priv->rx_dev.qtail]; ret = ks7010_sdio_read(priv, DATA_WINDOW, &rx_buffer->data[0], hif_align_size(size)); if (ret) return; /* length check */ if (size > 2046 || size == 0) { #ifdef KS_WLAN_DEBUG if (KS_WLAN_DEBUG > 5) print_hex_dump_bytes("INVALID DATA dump: ", DUMP_PREFIX_OFFSET, rx_buffer->data, 32); #endif ret = ks7010_sdio_writeb(priv, READ_STATUS, REG_STATUS_IDLE); if (ret) DPRINTK(1, " error : READ_STATUS\n"); /* length check fail */ return; } hdr = (struct hostif_hdr *)&rx_buffer->data[0]; rx_buffer->size = le16_to_cpu(hdr->size) + sizeof(hdr->size); event = le16_to_cpu(hdr->event); inc_rxqtail(priv); ret = ks7010_sdio_writeb(priv, READ_STATUS, REG_STATUS_IDLE); if (ret) DPRINTK(1, " error : READ_STATUS\n"); if (atomic_read(&priv->psstatus.confirm_wait)) { if (IS_HIF_CONF(event)) { DPRINTK(4, "IS_HIF_CONF true !!\n"); atomic_dec(&priv->psstatus.confirm_wait); } } tasklet_schedule(&priv->rx_bh_task); }
static void ks_wlan_hw_rx(void *dev, uint16_t size) { struct ks_wlan_private *priv = (struct ks_wlan_private *)dev; int retval; struct rx_device_buffer *rx_buffer; struct hostif_hdr *hdr; unsigned char read_status; unsigned short event = 0; DPRINTK(4, "\n"); /* receive data */ if (cnt_rxqbody(priv) >= (RX_DEVICE_BUFF_SIZE - 1)) { /* in case of buffer overflow */ DPRINTK(1, "rx buffer overflow \n"); goto error_out; } rx_buffer = &priv->rx_dev.rx_dev_buff[priv->rx_dev.qtail]; retval = ks7010_sdio_read(priv, DATA_WINDOW, &rx_buffer->data[0], hif_align_size(size)); if (retval) { goto error_out; } /* length check */ if (size > 2046 || size == 0) { #ifdef KS_WLAN_DEBUG if (KS_WLAN_DEBUG > 5) print_hex_dump_bytes("INVALID DATA dump: ", DUMP_PREFIX_OFFSET, rx_buffer->data, 32); #endif /* rx_status update */ read_status = READ_STATUS_IDLE; retval = ks7010_sdio_write(priv, READ_STATUS, &read_status, sizeof(read_status)); if (retval) { DPRINTK(1, " error : READ_STATUS=%02X\n", read_status); } goto error_out; } hdr = (struct hostif_hdr *)&rx_buffer->data[0]; rx_buffer->size = le16_to_cpu(hdr->size) + sizeof(hdr->size); event = hdr->event; inc_rxqtail(priv); /* read status update */ read_status = READ_STATUS_IDLE; retval = ks7010_sdio_write(priv, READ_STATUS, &read_status, sizeof(read_status)); if (retval) { DPRINTK(1, " error : READ_STATUS=%02X\n", read_status); } DPRINTK(4, "READ_STATUS=%02X\n", read_status); if (atomic_read(&priv->psstatus.confirm_wait)) { if (IS_HIF_CONF(event)) { DPRINTK(4, "IS_HIF_CONF true !!\n"); atomic_dec(&priv->psstatus.confirm_wait); } } /* rx_event_task((void *)priv); */ tasklet_schedule(&priv->ks_wlan_hw.rx_bh_task); error_out: return; }