/* send stop request to MAC */ static int send_stop_request(struct sdio_func *func) { struct hostif_stop_request_t *pp; struct ks_sdio_card *card; size_t size; card = sdio_get_drvdata(func); pp = kzalloc(hif_align_size(sizeof(*pp)), GFP_KERNEL); if (!pp) { DPRINTK(3, "allocate memory failed..\n"); return -ENOMEM; } size = sizeof(*pp) - sizeof(pp->header.size); pp->header.size = cpu_to_le16((uint16_t)size); pp->header.event = cpu_to_le16((uint16_t)HIF_STOP_REQ); sdio_claim_host(func); write_to_device(card->priv, (unsigned char *)pp, hif_align_size(sizeof(*pp))); sdio_release_host(func); kfree(pp); return 0; }
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; }
static void ks7010_sdio_remove(struct sdio_func *func) { int ret; struct ks_sdio_card *card; struct ks_wlan_private *priv; struct net_device *netdev; DPRINTK(1, "ks7010_sdio_remove()\n"); card = sdio_get_drvdata(func); if (card == NULL) return; DPRINTK(1, "priv = card->priv\n"); priv = card->priv; netdev = priv->net_dev; if (priv) { ks_wlan_net_stop(netdev); DPRINTK(1, "ks_wlan_net_stop\n"); /* interrupt disable */ sdio_claim_host(func); sdio_writeb(func, 0, INT_ENABLE, &ret); sdio_writeb(func, 0xff, INT_PENDING, &ret); sdio_release_host(func); DPRINTK(1, "interrupt disable\n"); /* send stop request to MAC */ { struct hostif_stop_request_t *pp; pp = (struct hostif_stop_request_t *) kzalloc(hif_align_size(sizeof(*pp)), GFP_KERNEL); if (pp == NULL) { DPRINTK(3, "allocate memory failed..\n"); return; /* to do goto ni suru */ } pp->header.size = cpu_to_le16((uint16_t) (sizeof(*pp) - sizeof(pp->header.size))); pp->header.event = cpu_to_le16((uint16_t) HIF_STOP_REQ); sdio_claim_host(func); write_to_device(priv, (unsigned char *)pp, hif_align_size(sizeof(*pp))); sdio_release_host(func); kfree(pp); } DPRINTK(1, "STOP Req\n"); if (priv->ks_wlan_hw.ks7010sdio_wq) { flush_workqueue(priv->ks_wlan_hw.ks7010sdio_wq); destroy_workqueue(priv->ks_wlan_hw.ks7010sdio_wq); } DPRINTK(1, "destroy_workqueue(priv->ks_wlan_hw.ks7010sdio_wq);\n"); hostif_exit(priv); DPRINTK(1, "hostif_exit\n"); unregister_netdev(netdev); trx_device_exit(priv); if (priv->ks_wlan_hw.read_buf) { kfree(priv->ks_wlan_hw.read_buf); } free_netdev(priv->net_dev); card->priv = NULL; } sdio_claim_host(func); sdio_release_irq(func); DPRINTK(1, "sdio_release_irq()\n"); sdio_disable_func(func); DPRINTK(1, "sdio_disable_func()\n"); sdio_release_host(func); sdio_set_drvdata(func, NULL); kfree(card); DPRINTK(1, "kfree()\n"); DPRINTK(5, " Bye !!\n"); return; }