3 /*this is transmit call-back(BULK OUT)*/
4 static void write_bulk_callback(struct urb *urb/*, struct pt_regs *regs*/)
6 PUSB_TCB pTcb= (PUSB_TCB)urb->context;
7 PS_INTERFACE_ADAPTER psIntfAdapter = pTcb->psIntfAdapter;
8 CONTROL_MESSAGE *pControlMsg = (CONTROL_MESSAGE *)urb->transfer_buffer;
9 PMINI_ADAPTER psAdapter = psIntfAdapter->psAdapter ;
10 BOOLEAN bpowerDownMsg = FALSE ;
11 PMINI_ADAPTER Adapter = GET_BCM_ADAPTER(gblpnetdev);
16 if(urb->status != STATUS_SUCCESS)
18 if(urb->status == -EPIPE)
20 psIntfAdapter->psAdapter->bEndPointHalted = TRUE ;
21 wake_up(&psIntfAdapter->psAdapter->tx_packet_wait_queue);
25 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL,"Tx URB has got cancelled. status :%d", urb->status);
30 atomic_dec(&psIntfAdapter->uNumTcbUsed);
34 if(TRUE == psAdapter->bPreparingForLowPowerMode)
38 time_ms = tv.tv_sec *1000 + tv.tv_usec/1000;
39 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_PRINTK, 0, 0, " %s Idle Mode ACK_Sent got from device at time :0x%x", __FUNCTION__, time_ms);
42 if(((pControlMsg->szData[0] == GO_TO_IDLE_MODE_PAYLOAD) &&
43 (pControlMsg->szData[1] == TARGET_CAN_GO_TO_IDLE_MODE)))
46 bpowerDownMsg = TRUE ;
47 //This covers the bus err while Idle Request msg sent down.
48 if(urb->status != STATUS_SUCCESS)
50 psAdapter->bPreparingForLowPowerMode = FALSE ;
51 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL,"Idle Mode Request msg failed to reach to Modem");
52 //Signalling the cntrl pkt path in Ioctl
53 wake_up(&psAdapter->lowpower_mode_wait_queue);
54 StartInterruptUrb(psIntfAdapter);
58 if(psAdapter->bDoSuspend == FALSE)
60 psAdapter->IdleMode = TRUE;
61 //since going in Idle mode completed hence making this var false;
62 psAdapter->bPreparingForLowPowerMode = FALSE ;
64 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL, "Host Entered in Idle Mode State...");
65 //Signalling the cntrl pkt path in Ioctl
66 wake_up(&psAdapter->lowpower_mode_wait_queue);
70 else if((pControlMsg->Leader.Status == LINK_UP_CONTROL_REQ) &&
71 (pControlMsg->szData[0] == LINK_UP_ACK) &&
72 (pControlMsg->szData[1] == LINK_SHUTDOWN_REQ_FROM_FIRMWARE) &&
73 (pControlMsg->szData[2] == SHUTDOWN_ACK_FROM_DRIVER))
75 //This covers the bus err while shutdown Request msg sent down.
76 if(urb->status != STATUS_SUCCESS)
78 psAdapter->bPreparingForLowPowerMode = FALSE ;
79 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL,"Shutdown Request Msg failed to reach to Modem");
80 //Signalling the cntrl pkt path in Ioctl
81 wake_up(&psAdapter->lowpower_mode_wait_queue);
82 StartInterruptUrb(psIntfAdapter);
86 bpowerDownMsg = TRUE ;
87 if(psAdapter->bDoSuspend == FALSE)
89 psAdapter->bShutStatus = TRUE;
90 //since going in shutdown mode completed hence making this var false;
91 psAdapter->bPreparingForLowPowerMode = FALSE ;
92 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL,"Host Entered in shutdown Mode State...");
93 //Signalling the cntrl pkt path in Ioctl
94 wake_up(&psAdapter->lowpower_mode_wait_queue);
98 if(psAdapter->bDoSuspend && bpowerDownMsg)
100 //issuing bus suspend request
101 BCM_DEBUG_PRINT(Adapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL,"Issuing the Bus suspend request to USB stack");
102 psIntfAdapter->bPreparingForBusSuspend = TRUE;
103 schedule_work(&psIntfAdapter->usbSuspendWork);
110 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 35)
111 usb_buffer_free(urb->dev, urb->transfer_buffer_length,
112 urb->transfer_buffer, urb->transfer_dma);
114 usb_free_coherent(urb->dev, urb->transfer_buffer_length,
115 urb->transfer_buffer, urb->transfer_dma);
120 static PUSB_TCB GetBulkOutTcb(PS_INTERFACE_ADAPTER psIntfAdapter)
122 PUSB_TCB pTcb = NULL;
125 if((atomic_read(&psIntfAdapter->uNumTcbUsed) < MAXIMUM_USB_TCB) &&
126 (psIntfAdapter->psAdapter->StopAllXaction ==FALSE))
128 index = atomic_read(&psIntfAdapter->uCurrTcb);
129 pTcb = &psIntfAdapter->asUsbTcb[index];
131 pTcb->psIntfAdapter= psIntfAdapter;
132 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL, "Got Tx desc %d used %d",
133 index, atomic_read(&psIntfAdapter->uNumTcbUsed));
134 index = (index + 1) % MAXIMUM_USB_TCB;
135 atomic_set(&psIntfAdapter->uCurrTcb, index);
136 atomic_inc(&psIntfAdapter->uNumTcbUsed);
141 static int TransmitTcb(PS_INTERFACE_ADAPTER psIntfAdapter, PUSB_TCB pTcb, PVOID data, int len)
144 struct urb *urb = pTcb->urb;
147 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 35)
148 urb->transfer_buffer = usb_buffer_alloc(psIntfAdapter->udev, len,
149 GFP_ATOMIC, &urb->transfer_dma);
151 urb->transfer_buffer = usb_alloc_coherent(psIntfAdapter->udev, len,
152 GFP_ATOMIC, &urb->transfer_dma);
155 if (!urb->transfer_buffer)
157 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_PRINTK, 0, 0, "Error allocating memory\n");
160 memcpy(urb->transfer_buffer, data, len);
161 urb->transfer_buffer_length = len;
163 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL, "Sending Bulk out packet\n");
164 //For T3B,INT OUT end point will be used as bulk out end point
165 if((psIntfAdapter->psAdapter->chip_id == T3B) && (psIntfAdapter->bHighSpeedDevice == TRUE))
167 usb_fill_int_urb(urb, psIntfAdapter->udev,
168 psIntfAdapter->sBulkOut.bulk_out_pipe,
169 urb->transfer_buffer, len, write_bulk_callback, pTcb,
170 psIntfAdapter->sBulkOut.int_out_interval);
174 usb_fill_bulk_urb(urb, psIntfAdapter->udev,
175 psIntfAdapter->sBulkOut.bulk_out_pipe,
176 urb->transfer_buffer, len, write_bulk_callback, pTcb);
178 urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; /* For DMA transfer */
180 if(FALSE == psIntfAdapter->psAdapter->device_removed &&
181 FALSE == psIntfAdapter->psAdapter->bEndPointHalted &&
182 FALSE == psIntfAdapter->bSuspended &&
183 FALSE == psIntfAdapter->bPreparingForBusSuspend)
185 retval = usb_submit_urb(urb, GFP_ATOMIC);
188 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_TX, NEXT_SEND, DBG_LVL_ALL, "failed submitting write urb, error %d", retval);
191 psIntfAdapter->psAdapter->bEndPointHalted = TRUE ;
192 wake_up(&psIntfAdapter->psAdapter->tx_packet_wait_queue);
199 int InterfaceTransmitPacket(PVOID arg, PVOID data, UINT len)
203 PS_INTERFACE_ADAPTER psIntfAdapter = (PS_INTERFACE_ADAPTER)arg;
204 pTcb= GetBulkOutTcb(psIntfAdapter);
207 BCM_DEBUG_PRINT(psIntfAdapter->psAdapter,DBG_TYPE_PRINTK, 0, 0, "No URB to transmit packet, dropping packet");
210 return TransmitTcb(psIntfAdapter, pTcb, data, len);