diff options
Diffstat (limited to 'drivers/staging/gdm72xx/gdm_sdio.c')
-rw-r--r-- | drivers/staging/gdm72xx/gdm_sdio.c | 107 |
1 files changed, 51 insertions, 56 deletions
diff --git a/drivers/staging/gdm72xx/gdm_sdio.c b/drivers/staging/gdm72xx/gdm_sdio.c index 7398d451ccc..7a0a0f22141 100644 --- a/drivers/staging/gdm72xx/gdm_sdio.c +++ b/drivers/staging/gdm72xx/gdm_sdio.c @@ -38,9 +38,6 @@ #define TX_HZ 2000 #define TX_INTERVAL (1000000/TX_HZ) -static int init_sdio(struct sdiowm_dev *sdev); -static void release_sdio(struct sdiowm_dev *sdev); - static struct sdio_tx *alloc_tx_struct(struct tx_cxt *tx) { struct sdio_tx *t = kzalloc(sizeof(*t), GFP_ATOMIC); @@ -124,6 +121,43 @@ static void put_rx_struct(struct rx_cxt *rx, struct sdio_rx *r) list_add_tail(&r->list, &rx->free_list); } +static void release_sdio(struct sdiowm_dev *sdev) +{ + struct tx_cxt *tx = &sdev->tx; + struct rx_cxt *rx = &sdev->rx; + struct sdio_tx *t, *t_next; + struct sdio_rx *r, *r_next; + + kfree(tx->sdu_buf); + + list_for_each_entry_safe(t, t_next, &tx->free_list, list) { + list_del(&t->list); + free_tx_struct(t); + } + + list_for_each_entry_safe(t, t_next, &tx->sdu_list, list) { + list_del(&t->list); + free_tx_struct(t); + } + + list_for_each_entry_safe(t, t_next, &tx->hci_list, list) { + list_del(&t->list); + free_tx_struct(t); + } + + kfree(rx->rx_buf); + + list_for_each_entry_safe(r, r_next, &rx->free_list, list) { + list_del(&r->list); + free_rx_struct(r); + } + + list_for_each_entry_safe(r, r_next, &rx->req_list, list) { + list_del(&r->list); + free_rx_struct(r); + } +} + static int init_sdio(struct sdiowm_dev *sdev) { int ret = 0, i; @@ -176,43 +210,6 @@ fail: return ret; } -static void release_sdio(struct sdiowm_dev *sdev) -{ - struct tx_cxt *tx = &sdev->tx; - struct rx_cxt *rx = &sdev->rx; - struct sdio_tx *t, *t_next; - struct sdio_rx *r, *r_next; - - kfree(tx->sdu_buf); - - list_for_each_entry_safe(t, t_next, &tx->free_list, list) { - list_del(&t->list); - free_tx_struct(t); - } - - list_for_each_entry_safe(t, t_next, &tx->sdu_list, list) { - list_del(&t->list); - free_tx_struct(t); - } - - list_for_each_entry_safe(t, t_next, &tx->hci_list, list) { - list_del(&t->list); - free_tx_struct(t); - } - - kfree(rx->rx_buf); - - list_for_each_entry_safe(r, r_next, &rx->free_list, list) { - list_del(&r->list); - free_rx_struct(r); - } - - list_for_each_entry_safe(r, r_next, &rx->req_list, list) { - list_del(&r->list); - free_rx_struct(r); - } -} - static void send_sdio_pkt(struct sdio_func *func, u8 *data, int len) { int n, blocks, ret, remain; @@ -275,14 +272,14 @@ static void send_sdu(struct sdio_func *func, struct tx_cxt *tx) aggr_len = pos; hci = (struct hci_s *)(tx->sdu_buf + TYPE_A_HEADER_SIZE); - hci->cmd_evt = H2B(WIMAX_TX_SDU_AGGR); - hci->length = H2B(aggr_len - TYPE_A_HEADER_SIZE - HCI_HEADER_SIZE); + hci->cmd_evt = cpu_to_be16(WIMAX_TX_SDU_AGGR); + hci->length = cpu_to_be16(aggr_len - TYPE_A_HEADER_SIZE - + HCI_HEADER_SIZE); spin_unlock_irqrestore(&tx->lock, flags); - print_hex_dump_debug("sdio_send: ", DUMP_PREFIX_NONE, 16, 1, - tx->sdu_buf + TYPE_A_HEADER_SIZE, - aggr_len - TYPE_A_HEADER_SIZE, false); + dev_dbg(&func->dev, "sdio_send: %*ph\n", aggr_len - TYPE_A_HEADER_SIZE, + tx->sdu_buf + TYPE_A_HEADER_SIZE); for (pos = TYPE_A_HEADER_SIZE; pos < aggr_len; pos += TX_CHUNK_SIZE) { len = aggr_len - pos; @@ -317,9 +314,9 @@ static void send_hci(struct sdio_func *func, struct tx_cxt *tx, { unsigned long flags; - print_hex_dump_debug("sdio_send: ", DUMP_PREFIX_NONE, 16, 1, - t->buf + TYPE_A_HEADER_SIZE, - t->len - TYPE_A_HEADER_SIZE, false); + dev_dbg(&func->dev, "sdio_send: %*ph\n", t->len - TYPE_A_HEADER_SIZE, + t->buf + TYPE_A_HEADER_SIZE); + send_sdio_pkt(func, t->buf, t->len); spin_lock_irqsave(&tx->lock, flags); @@ -390,7 +387,8 @@ static int gdm_sdio_send(void *priv_dev, void *data, int len, u16 cmd_evt; unsigned long flags; - BUG_ON(len > TX_BUF_SIZE - TYPE_A_HEADER_SIZE); + if (len > TX_BUF_SIZE - TYPE_A_HEADER_SIZE) + return -EINVAL; spin_lock_irqsave(&tx->lock, flags); @@ -439,9 +437,7 @@ static int gdm_sdio_send(void *priv_dev, void *data, int len, return 0; } -/* - * Handle the HCI, WIMAX_SDU_TX_FLOW. - */ +/* Handle the HCI, WIMAX_SDU_TX_FLOW. */ static int control_sdu_tx_flow(struct sdiowm_dev *sdev, u8 *hci_data, int len) { struct tx_cxt *tx = &sdev->tx; @@ -462,8 +458,7 @@ static int control_sdu_tx_flow(struct sdiowm_dev *sdev, u8 *hci_data, int len) tx->stop_sdu_tx = 0; if (tx->can_send) schedule_work(&sdev->ws); - /* - * If free buffer for sdu tx doesn't exist, then tx queue + /* If free buffer for sdu tx doesn't exist, then tx queue * should not be woken. For this reason, don't pass the command, * START_SDU_TX. */ @@ -553,8 +548,8 @@ static void gdm_sdio_irq(struct sdio_func *func) } end_io: - print_hex_dump_debug("sdio_receive: ", DUMP_PREFIX_NONE, 16, 1, - rx->rx_buf, len, false); + dev_dbg(&func->dev, "sdio_receive: %*ph\n", len, rx->rx_buf); + len = control_sdu_tx_flow(sdev, rx->rx_buf, len); spin_lock_irqsave(&rx->lock, flags); |