diff options
| -rw-r--r-- | drivers/staging/otus/wwrap.c | 968 |
1 files changed, 446 insertions, 522 deletions
diff --git a/drivers/staging/otus/wwrap.c b/drivers/staging/otus/wwrap.c index b02eb42cd796..fcd3da07155b 100644 --- a/drivers/staging/otus/wwrap.c +++ b/drivers/staging/otus/wwrap.c | |||
| @@ -29,24 +29,24 @@ | |||
| 29 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
| 30 | #include <net/iw_handler.h> | 30 | #include <net/iw_handler.h> |
| 31 | 31 | ||
| 32 | extern void zfiRecv80211(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo); | 32 | extern void zfiRecv80211(zdev_t *dev, zbuf_t *buf, struct zsAdditionInfo *addInfo); |
| 33 | extern void zfCoreRecv(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo); | 33 | extern void zfCoreRecv(zdev_t *dev, zbuf_t *buf, struct zsAdditionInfo *addInfo); |
| 34 | extern void zfIdlChkRsp(zdev_t* dev, u32_t* rsp, u16_t rspLen); | 34 | extern void zfIdlChkRsp(zdev_t *dev, u32_t *rsp, u16_t rspLen); |
| 35 | extern void zfIdlRsp(zdev_t* dev, u32_t *rsp, u16_t rspLen); | 35 | extern void zfIdlRsp(zdev_t *dev, u32_t *rsp, u16_t rspLen); |
| 36 | 36 | ||
| 37 | 37 | ||
| 38 | 38 | ||
| 39 | //extern struct zsWdsStruct wds[ZM_WDS_PORT_NUMBER]; | 39 | /*extern struct zsWdsStruct wds[ZM_WDS_PORT_NUMBER];*/ |
| 40 | extern struct zsVapStruct vap[ZM_VAP_PORT_NUMBER]; | 40 | extern struct zsVapStruct vap[ZM_VAP_PORT_NUMBER]; |
| 41 | 41 | ||
| 42 | u32_t zfLnxUsbSubmitTxData(zdev_t* dev); | 42 | u32_t zfLnxUsbSubmitTxData(zdev_t *dev); |
| 43 | u32_t zfLnxUsbIn(zdev_t* dev, urb_t *urb, zbuf_t *buf); | 43 | u32_t zfLnxUsbIn(zdev_t *dev, urb_t *urb, zbuf_t *buf); |
| 44 | u32_t zfLnxSubmitRegInUrb(zdev_t *dev); | 44 | u32_t zfLnxSubmitRegInUrb(zdev_t *dev); |
| 45 | u32_t zfLnxUsbSubmitBulkUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction, | 45 | u32_t zfLnxUsbSubmitBulkUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction, |
| 46 | void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context); | 46 | void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context); |
| 47 | u32_t zfLnxUsbSubmitIntUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction, | 47 | u32_t zfLnxUsbSubmitIntUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction, |
| 48 | void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context, | 48 | void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context, |
| 49 | u32_t interval); | 49 | u32_t interval); |
| 50 | 50 | ||
| 51 | u16_t zfLnxGetFreeTxUrb(zdev_t *dev) | 51 | u16_t zfLnxGetFreeTxUrb(zdev_t *dev) |
| 52 | { | 52 | { |
| @@ -56,22 +56,19 @@ u16_t zfLnxGetFreeTxUrb(zdev_t *dev) | |||
| 56 | 56 | ||
| 57 | spin_lock_irqsave(&macp->cs_lock, irqFlag); | 57 | spin_lock_irqsave(&macp->cs_lock, irqFlag); |
| 58 | 58 | ||
| 59 | //idx = ((macp->TxUrbTail + 1) & (ZM_MAX_TX_URB_NUM - 1)); | 59 | /*idx = ((macp->TxUrbTail + 1) & (ZM_MAX_TX_URB_NUM - 1));*/ |
| 60 | 60 | ||
| 61 | //if (idx != macp->TxUrbHead) | 61 | /*if (idx != macp->TxUrbHead)*/ |
| 62 | if (macp->TxUrbCnt != 0) | 62 | if (macp->TxUrbCnt != 0) { |
| 63 | { | 63 | idx = macp->TxUrbTail; |
| 64 | idx = macp->TxUrbTail; | 64 | macp->TxUrbTail = ((macp->TxUrbTail + 1) & (ZM_MAX_TX_URB_NUM - 1)); |
| 65 | macp->TxUrbTail = ((macp->TxUrbTail + 1) & (ZM_MAX_TX_URB_NUM - 1)); | 65 | macp->TxUrbCnt--; |
| 66 | macp->TxUrbCnt--; | 66 | } else { |
| 67 | } | 67 | /*printk(KERN_ERR "macp->TxUrbCnt: %d\n", macp->TxUrbCnt);*/ |
| 68 | else | 68 | idx = 0xffff; |
| 69 | { | 69 | } |
| 70 | //printk(KERN_ERR "macp->TxUrbCnt: %d\n", macp->TxUrbCnt); | ||
| 71 | idx = 0xffff; | ||
| 72 | } | ||
| 73 | 70 | ||
| 74 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); | 71 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); |
| 75 | return idx; | 72 | return idx; |
| 76 | } | 73 | } |
| 77 | 74 | ||
| @@ -85,16 +82,13 @@ void zfLnxPutTxUrb(zdev_t *dev) | |||
| 85 | 82 | ||
| 86 | idx = ((macp->TxUrbHead + 1) & (ZM_MAX_TX_URB_NUM - 1)); | 83 | idx = ((macp->TxUrbHead + 1) & (ZM_MAX_TX_URB_NUM - 1)); |
| 87 | 84 | ||
| 88 | //if (idx != macp->TxUrbTail) | 85 | /*if (idx != macp->TxUrbTail)*/ |
| 89 | if (macp->TxUrbCnt < ZM_MAX_TX_URB_NUM) | 86 | if (macp->TxUrbCnt < ZM_MAX_TX_URB_NUM) { |
| 90 | { | 87 | macp->TxUrbHead = idx; |
| 91 | macp->TxUrbHead = idx; | 88 | macp->TxUrbCnt++; |
| 92 | macp->TxUrbCnt++; | 89 | } else { |
| 93 | } | 90 | printk("UsbTxUrbQ inconsistent: TxUrbHead: %d, TxUrbTail: %d\n", |
| 94 | else | 91 | macp->TxUrbHead, macp->TxUrbTail); |
| 95 | { | ||
| 96 | printk("UsbTxUrbQ inconsistent: TxUrbHead: %d, TxUrbTail: %d\n", | ||
| 97 | macp->TxUrbHead, macp->TxUrbTail); | ||
| 98 | } | 92 | } |
| 99 | 93 | ||
| 100 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); | 94 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); |
| @@ -125,24 +119,20 @@ UsbTxQ_t *zfLnxGetUsbTxBuffer(zdev_t *dev) | |||
| 125 | 119 | ||
| 126 | idx = ((macp->TxBufHead+1) & (ZM_MAX_TX_BUF_NUM - 1)); | 120 | idx = ((macp->TxBufHead+1) & (ZM_MAX_TX_BUF_NUM - 1)); |
| 127 | 121 | ||
| 128 | //if (idx != macp->TxBufTail) | 122 | /*if (idx != macp->TxBufTail)*/ |
| 129 | if (macp->TxBufCnt > 0) | 123 | if (macp->TxBufCnt > 0) { |
| 130 | { | 124 | /*printk("CWY - zfwGetUsbTxBuffer ,macp->TxBufCnt = %d\n", macp->TxBufCnt);*/ |
| 131 | //printk("CWY - zfwGetUsbTxBuffer ,macp->TxBufCnt = %d\n", macp->TxBufCnt); | 125 | TxQ = (UsbTxQ_t *)&(macp->UsbTxBufQ[macp->TxBufHead]); |
| 132 | TxQ = (UsbTxQ_t *)&(macp->UsbTxBufQ[macp->TxBufHead]); | 126 | macp->TxBufHead = ((macp->TxBufHead+1) & (ZM_MAX_TX_BUF_NUM - 1)); |
| 133 | macp->TxBufHead = ((macp->TxBufHead+1) & (ZM_MAX_TX_BUF_NUM - 1)); | 127 | macp->TxBufCnt--; |
| 134 | macp->TxBufCnt--; | 128 | } else { |
| 135 | } | 129 | if (macp->TxBufHead != macp->TxBufTail) { |
| 136 | else | 130 | printk(KERN_ERR "zfwGetUsbTxBuf UsbTxBufQ inconsistent: TxBufHead: %d, TxBufTail: %d\n", |
| 137 | { | 131 | macp->TxBufHead, macp->TxBufTail); |
| 138 | if (macp->TxBufHead != macp->TxBufTail) | 132 | } |
| 139 | { | 133 | |
| 140 | printk(KERN_ERR "zfwGetUsbTxBuf UsbTxBufQ inconsistent: TxBufHead: %d, TxBufTail: %d\n", | 134 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); |
| 141 | macp->TxBufHead, macp->TxBufTail); | 135 | return NULL; |
| 142 | } | ||
| 143 | |||
| 144 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); | ||
| 145 | return NULL; | ||
| 146 | } | 136 | } |
| 147 | 137 | ||
| 148 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); | 138 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); |
| @@ -150,8 +140,8 @@ UsbTxQ_t *zfLnxGetUsbTxBuffer(zdev_t *dev) | |||
| 150 | } | 140 | } |
| 151 | 141 | ||
| 152 | u16_t zfLnxPutUsbTxBuffer(zdev_t *dev, u8_t *hdr, u16_t hdrlen, | 142 | u16_t zfLnxPutUsbTxBuffer(zdev_t *dev, u8_t *hdr, u16_t hdrlen, |
| 153 | u8_t *snap, u16_t snapLen, u8_t *tail, u16_t tailLen, | 143 | u8_t *snap, u16_t snapLen, u8_t *tail, u16_t tailLen, |
| 154 | zbuf_t *buf, u16_t offset) | 144 | zbuf_t *buf, u16_t offset) |
| 155 | { | 145 | { |
| 156 | struct usbdrv_private *macp = dev->ml_priv; | 146 | struct usbdrv_private *macp = dev->ml_priv; |
| 157 | u16_t idx; | 147 | u16_t idx; |
| @@ -163,32 +153,29 @@ u16_t zfLnxPutUsbTxBuffer(zdev_t *dev, u8_t *hdr, u16_t hdrlen, | |||
| 163 | idx = ((macp->TxBufTail+1) & (ZM_MAX_TX_BUF_NUM - 1)); | 153 | idx = ((macp->TxBufTail+1) & (ZM_MAX_TX_BUF_NUM - 1)); |
| 164 | 154 | ||
| 165 | /* For Tx debug */ | 155 | /* For Tx debug */ |
| 166 | //zm_assert(macp->TxBufCnt >= 0); // deleted because of always true | 156 | /*zm_assert(macp->TxBufCnt >= 0); // deleted because of always true*/ |
| 167 | 157 | ||
| 168 | //if (idx != macp->TxBufHead) | 158 | /*if (idx != macp->TxBufHead)*/ |
| 169 | if (macp->TxBufCnt < ZM_MAX_TX_BUF_NUM) | 159 | if (macp->TxBufCnt < ZM_MAX_TX_BUF_NUM) { |
| 170 | { | 160 | /*printk("CWY - zfwPutUsbTxBuffer ,macp->TxBufCnt = %d\n", macp->TxBufCnt);*/ |
| 171 | //printk("CWY - zfwPutUsbTxBuffer ,macp->TxBufCnt = %d\n", macp->TxBufCnt); | 161 | TxQ = (UsbTxQ_t *)&(macp->UsbTxBufQ[macp->TxBufTail]); |
| 172 | TxQ = (UsbTxQ_t *)&(macp->UsbTxBufQ[macp->TxBufTail]); | 162 | memcpy(TxQ->hdr, hdr, hdrlen); |
| 173 | memcpy(TxQ->hdr, hdr, hdrlen); | 163 | TxQ->hdrlen = hdrlen; |
| 174 | TxQ->hdrlen = hdrlen; | 164 | memcpy(TxQ->snap, snap, snapLen); |
| 175 | memcpy(TxQ->snap, snap, snapLen); | 165 | TxQ->snapLen = snapLen; |
| 176 | TxQ->snapLen = snapLen; | 166 | memcpy(TxQ->tail, tail, tailLen); |
| 177 | memcpy(TxQ->tail, tail, tailLen); | 167 | TxQ->tailLen = tailLen; |
| 178 | TxQ->tailLen = tailLen; | 168 | TxQ->buf = buf; |
| 179 | TxQ->buf = buf; | 169 | TxQ->offset = offset; |
| 180 | TxQ->offset = offset; | 170 | |
| 181 | 171 | macp->TxBufTail = ((macp->TxBufTail+1) & (ZM_MAX_TX_BUF_NUM - 1)); | |
| 182 | macp->TxBufTail = ((macp->TxBufTail+1) & (ZM_MAX_TX_BUF_NUM - 1)); | 172 | macp->TxBufCnt++; |
| 183 | macp->TxBufCnt++; | 173 | } else { |
| 184 | } | 174 | printk(KERN_ERR "zfLnxPutUsbTxBuffer UsbTxBufQ inconsistent: TxBufHead: %d, TxBufTail: %d, TxBufCnt: %d\n", |
| 185 | else | 175 | macp->TxBufHead, macp->TxBufTail, macp->TxBufCnt); |
| 186 | { | 176 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); |
| 187 | printk(KERN_ERR "zfLnxPutUsbTxBuffer UsbTxBufQ inconsistent: TxBufHead: %d, TxBufTail: %d, TxBufCnt: %d\n", | 177 | return 0xffff; |
| 188 | macp->TxBufHead, macp->TxBufTail, macp->TxBufCnt); | 178 | } |
| 189 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); | ||
| 190 | return 0xffff; | ||
| 191 | } | ||
| 192 | 179 | ||
| 193 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); | 180 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); |
| 194 | return 0; | 181 | return 0; |
| @@ -197,28 +184,25 @@ u16_t zfLnxPutUsbTxBuffer(zdev_t *dev, u8_t *hdr, u16_t hdrlen, | |||
| 197 | zbuf_t *zfLnxGetUsbRxBuffer(zdev_t *dev) | 184 | zbuf_t *zfLnxGetUsbRxBuffer(zdev_t *dev) |
| 198 | { | 185 | { |
| 199 | struct usbdrv_private *macp = dev->ml_priv; | 186 | struct usbdrv_private *macp = dev->ml_priv; |
| 200 | //u16_t idx; | 187 | /*u16_t idx;*/ |
| 201 | zbuf_t *buf; | 188 | zbuf_t *buf; |
| 202 | unsigned long irqFlag; | 189 | unsigned long irqFlag; |
| 203 | 190 | ||
| 204 | spin_lock_irqsave(&macp->cs_lock, irqFlag); | 191 | spin_lock_irqsave(&macp->cs_lock, irqFlag); |
| 205 | 192 | ||
| 206 | //idx = ((macp->RxBufHead+1) & (ZM_MAX_RX_URB_NUM - 1)); | 193 | /*idx = ((macp->RxBufHead+1) & (ZM_MAX_RX_URB_NUM - 1));*/ |
| 207 | 194 | ||
| 208 | //if (idx != macp->RxBufTail) | 195 | /*if (idx != macp->RxBufTail)*/ |
| 209 | if (macp->RxBufCnt != 0) | 196 | if (macp->RxBufCnt != 0) { |
| 210 | { | 197 | buf = macp->UsbRxBufQ[macp->RxBufHead]; |
| 211 | buf = macp->UsbRxBufQ[macp->RxBufHead]; | 198 | macp->RxBufHead = ((macp->RxBufHead+1) & (ZM_MAX_RX_URB_NUM - 1)); |
| 212 | macp->RxBufHead = ((macp->RxBufHead+1) & (ZM_MAX_RX_URB_NUM - 1)); | 199 | macp->RxBufCnt--; |
| 213 | macp->RxBufCnt--; | 200 | } else { |
| 214 | } | 201 | printk("RxBufQ inconsistent: RxBufHead: %d, RxBufTail: %d\n", |
| 215 | else | 202 | macp->RxBufHead, macp->RxBufTail); |
| 216 | { | 203 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); |
| 217 | printk("RxBufQ inconsistent: RxBufHead: %d, RxBufTail: %d\n", | 204 | return NULL; |
| 218 | macp->RxBufHead, macp->RxBufTail); | 205 | } |
| 219 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); | ||
| 220 | return NULL; | ||
| 221 | } | ||
| 222 | 206 | ||
| 223 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); | 207 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); |
| 224 | return buf; | 208 | return buf; |
| @@ -234,61 +218,56 @@ u32_t zfLnxPutUsbRxBuffer(zdev_t *dev, zbuf_t *buf) | |||
| 234 | 218 | ||
| 235 | idx = ((macp->RxBufTail+1) & (ZM_MAX_RX_URB_NUM - 1)); | 219 | idx = ((macp->RxBufTail+1) & (ZM_MAX_RX_URB_NUM - 1)); |
| 236 | 220 | ||
| 237 | //if (idx != macp->RxBufHead) | 221 | /*if (idx != macp->RxBufHead)*/ |
| 238 | if (macp->RxBufCnt != ZM_MAX_RX_URB_NUM) | 222 | if (macp->RxBufCnt != ZM_MAX_RX_URB_NUM) { |
| 239 | { | 223 | macp->UsbRxBufQ[macp->RxBufTail] = buf; |
| 240 | macp->UsbRxBufQ[macp->RxBufTail] = buf; | 224 | macp->RxBufTail = idx; |
| 241 | macp->RxBufTail = idx; | 225 | macp->RxBufCnt++; |
| 242 | macp->RxBufCnt++; | 226 | } else { |
| 243 | } | 227 | printk("RxBufQ inconsistent: RxBufHead: %d, RxBufTail: %d\n", |
| 244 | else | 228 | macp->RxBufHead, macp->RxBufTail); |
| 245 | { | 229 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); |
| 246 | printk("RxBufQ inconsistent: RxBufHead: %d, RxBufTail: %d\n", | 230 | return 0xffff; |
| 247 | macp->RxBufHead, macp->RxBufTail); | 231 | } |
| 248 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); | ||
| 249 | return 0xffff; | ||
| 250 | } | ||
| 251 | 232 | ||
| 252 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); | 233 | spin_unlock_irqrestore(&macp->cs_lock, irqFlag); |
| 253 | return 0; | 234 | return 0; |
| 254 | } | 235 | } |
| 255 | 236 | ||
| 256 | void zfLnxUsbDataOut_callback(urb_t *urb) | 237 | void zfLnxUsbDataOut_callback(urb_t *urb) |
| 257 | { | 238 | { |
| 258 | zdev_t* dev = urb->context; | 239 | zdev_t *dev = urb->context; |
| 259 | //UsbTxQ_t *TxData; | 240 | /*UsbTxQ_t *TxData;*/ |
| 260 | 241 | ||
| 261 | /* Give the urb back */ | 242 | /* Give the urb back */ |
| 262 | zfLnxPutTxUrb(dev); | 243 | zfLnxPutTxUrb(dev); |
| 263 | 244 | ||
| 264 | /* Check whether there is any pending buffer needed */ | 245 | /* Check whether there is any pending buffer needed */ |
| 265 | /* to be sent */ | 246 | /* to be sent */ |
| 266 | if (zfLnxCheckTxBufferCnt(dev) != 0) | 247 | if (zfLnxCheckTxBufferCnt(dev) != 0) { |
| 267 | { | 248 | /*TxData = zfwGetUsbTxBuffer(dev); |
| 268 | //TxData = zfwGetUsbTxBuffer(dev); | 249 | //if (TxData == NULL) |
| 269 | 250 | //{ | |
| 270 | //if (TxData == NULL) | 251 | // printk("Get a NULL buffer from zfwGetUsbTxBuffer\n"); |
| 271 | //{ | 252 | // return; |
| 272 | // printk("Get a NULL buffer from zfwGetUsbTxBuffer\n"); | 253 | //} |
| 273 | // return; | 254 | //else |
| 274 | //} | 255 | //{ |
| 275 | //else | 256 | zfLnxUsbSubmitTxData(dev); |
| 276 | //{ | 257 | //}*/ |
| 277 | zfLnxUsbSubmitTxData(dev); | ||
| 278 | //} | ||
| 279 | } | 258 | } |
| 280 | } | 259 | } |
| 281 | 260 | ||
| 282 | void zfLnxUsbDataIn_callback(urb_t *urb) | 261 | void zfLnxUsbDataIn_callback(urb_t *urb) |
| 283 | { | 262 | { |
| 284 | zdev_t* dev = urb->context; | 263 | zdev_t *dev = urb->context; |
| 285 | struct usbdrv_private *macp = dev->ml_priv; | 264 | struct usbdrv_private *macp = dev->ml_priv; |
| 286 | zbuf_t *buf; | 265 | zbuf_t *buf; |
| 287 | zbuf_t *new_buf; | 266 | zbuf_t *new_buf; |
| 288 | int status; | 267 | int status; |
| 289 | 268 | ||
| 290 | #if ZM_USB_STREAM_MODE == 1 | 269 | #if ZM_USB_STREAM_MODE == 1 |
| 291 | static int remain_len = 0, check_pad = 0, check_len = 0; | 270 | static int remain_len, check_pad, check_len; |
| 292 | int index = 0; | 271 | int index = 0; |
| 293 | int chk_idx; | 272 | int chk_idx; |
| 294 | u16_t pkt_len; | 273 | u16_t pkt_len; |
| @@ -299,47 +278,45 @@ void zfLnxUsbDataIn_callback(urb_t *urb) | |||
| 299 | #endif | 278 | #endif |
| 300 | 279 | ||
| 301 | /* Check status for URB */ | 280 | /* Check status for URB */ |
| 302 | if (urb->status != 0){ | 281 | if (urb->status != 0) { |
| 303 | printk("zfLnxUsbDataIn_callback() : status=0x%x\n", urb->status); | 282 | printk("zfLnxUsbDataIn_callback() : status=0x%x\n", urb->status); |
| 304 | if ((urb->status != -ENOENT) && (urb->status != -ECONNRESET) | 283 | if ((urb->status != -ENOENT) && (urb->status != -ECONNRESET) |
| 305 | && (urb->status != -ESHUTDOWN)) | 284 | && (urb->status != -ESHUTDOWN)) { |
| 306 | { | 285 | if (urb->status == -EPIPE) { |
| 307 | if (urb->status == -EPIPE){ | 286 | /*printk(KERN_ERR "nonzero read bulk status received: -EPIPE");*/ |
| 308 | //printk(KERN_ERR "nonzero read bulk status received: -EPIPE"); | 287 | status = -1; |
| 309 | status = -1; | 288 | } |
| 310 | } | 289 | |
| 311 | 290 | if (urb->status == -EPROTO) { | |
| 312 | if (urb->status == -EPROTO){ | 291 | /*printk(KERN_ERR "nonzero read bulk status received: -EPROTO");*/ |
| 313 | //printk(KERN_ERR "nonzero read bulk status received: -EPROTO"); | 292 | status = -1; |
| 314 | status = -1; | 293 | } |
| 315 | } | 294 | } |
| 316 | } | 295 | |
| 317 | 296 | /*printk(KERN_ERR "urb->status: 0x%08x\n", urb->status);*/ | |
| 318 | //printk(KERN_ERR "urb->status: 0x%08x\n", urb->status); | 297 | |
| 319 | 298 | /* Dequeue skb buffer */ | |
| 320 | /* Dequeue skb buffer */ | 299 | buf = zfLnxGetUsbRxBuffer(dev); |
| 321 | buf = zfLnxGetUsbRxBuffer(dev); | 300 | dev_kfree_skb_any(buf); |
| 322 | dev_kfree_skb_any(buf); | 301 | #if 0 |
| 323 | #if 0 | 302 | /* Enqueue skb buffer */ |
| 324 | /* Enqueue skb buffer */ | 303 | zfLnxPutUsbRxBuffer(dev, buf); |
| 325 | zfLnxPutUsbRxBuffer(dev, buf); | ||
| 326 | |||
| 327 | /* Submit a Rx urb */ | ||
| 328 | zfLnxUsbIn(dev, urb, buf); | ||
| 329 | #endif | ||
| 330 | return; | ||
| 331 | } | ||
| 332 | 304 | ||
| 333 | if (urb->actual_length == 0) | 305 | /* Submit a Rx urb */ |
| 334 | { | 306 | zfLnxUsbIn(dev, urb, buf); |
| 335 | printk(KERN_ERR "Get an URB whose length is zero"); | 307 | #endif |
| 336 | status = -1; | 308 | return; |
| 309 | } | ||
| 310 | |||
| 311 | if (urb->actual_length == 0) { | ||
| 312 | printk(KERN_ERR "Get an URB whose length is zero"); | ||
| 313 | status = -1; | ||
| 337 | } | 314 | } |
| 338 | 315 | ||
| 339 | /* Dequeue skb buffer */ | 316 | /* Dequeue skb buffer */ |
| 340 | buf = zfLnxGetUsbRxBuffer(dev); | 317 | buf = zfLnxGetUsbRxBuffer(dev); |
| 341 | 318 | ||
| 342 | //zfwBufSetSize(dev, buf, urb->actual_length); | 319 | /*zfwBufSetSize(dev, buf, urb->actual_length);*/ |
| 343 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 320 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
| 344 | buf->tail = 0; | 321 | buf->tail = 0; |
| 345 | buf->len = 0; | 322 | buf->len = 0; |
| @@ -353,134 +330,122 @@ void zfLnxUsbDataIn_callback(urb_t *urb) | |||
| 353 | skb_put(buf, urb->actual_length); | 330 | skb_put(buf, urb->actual_length); |
| 354 | 331 | ||
| 355 | #if ZM_USB_STREAM_MODE == 1 | 332 | #if ZM_USB_STREAM_MODE == 1 |
| 356 | if (remain_len != 0) | 333 | if (remain_len != 0) { |
| 357 | { | 334 | zbuf_t *remain_buf = macp->reamin_buf; |
| 358 | zbuf_t *remain_buf = macp->reamin_buf; | ||
| 359 | 335 | ||
| 360 | index = remain_len; | 336 | index = remain_len; |
| 361 | remain_len -= check_pad; | 337 | remain_len -= check_pad; |
| 362 | 338 | ||
| 363 | /* Copy data */ | 339 | /* Copy data */ |
| 364 | memcpy(&(remain_buf->data[check_len]), buf->data, remain_len); | 340 | memcpy(&(remain_buf->data[check_len]), buf->data, remain_len); |
| 365 | check_len += remain_len; | 341 | check_len += remain_len; |
| 366 | remain_len = 0; | 342 | remain_len = 0; |
| 367 | 343 | ||
| 368 | rxBufPool[rxBufPoolIndex++] = remain_buf; | 344 | rxBufPool[rxBufPoolIndex++] = remain_buf; |
| 369 | } | 345 | } |
| 370 | 346 | ||
| 371 | while(index < urb->actual_length) | 347 | while (index < urb->actual_length) { |
| 372 | { | 348 | pkt_len = buf->data[index] + (buf->data[index+1] << 8); |
| 373 | pkt_len = buf->data[index] + (buf->data[index+1] << 8); | 349 | pkt_tag = buf->data[index+2] + (buf->data[index+3] << 8); |
| 374 | pkt_tag = buf->data[index+2] + (buf->data[index+3] << 8); | 350 | |
| 375 | 351 | if (pkt_tag == 0x4e00) { | |
| 376 | if (pkt_tag == 0x4e00) | 352 | int pad_len; |
| 377 | { | 353 | |
| 378 | int pad_len; | 354 | /*printk("Get a packet, index: %d, pkt_len: 0x%04x\n", index, pkt_len);*/ |
| 379 | 355 | #if 0 | |
| 380 | //printk("Get a packet, index: %d, pkt_len: 0x%04x\n", index, pkt_len); | 356 | /* Dump data */ |
| 381 | #if 0 | 357 | for (ii = index; ii < pkt_len+4;) { |
| 382 | /* Dump data */ | 358 | printk("%02x ", (buf->data[ii] & 0xff)); |
| 383 | for (ii = index; ii < pkt_len+4;) | 359 | |
| 384 | { | 360 | if ((++ii % 16) == 0) |
| 385 | printk("%02x ", (buf->data[ii] & 0xff)); | 361 | printk("\n"); |
| 386 | 362 | } | |
| 387 | if ((++ii % 16) == 0) | 363 | |
| 388 | printk("\n"); | 364 | printk("\n"); |
| 389 | } | 365 | #endif |
| 390 | 366 | ||
| 391 | printk("\n"); | 367 | pad_len = 4 - (pkt_len & 0x3); |
| 392 | #endif | 368 | |
| 393 | 369 | if (pad_len == 4) | |
| 394 | pad_len = 4 - (pkt_len & 0x3); | 370 | pad_len = 0; |
| 395 | 371 | ||
| 396 | if(pad_len == 4) | 372 | chk_idx = index; |
| 397 | pad_len = 0; | 373 | index = index + 4 + pkt_len + pad_len; |
| 398 | 374 | ||
| 399 | chk_idx = index; | 375 | if (index > ZM_MAX_RX_BUFFER_SIZE) { |
| 400 | index = index + 4 + pkt_len + pad_len; | 376 | remain_len = index - ZM_MAX_RX_BUFFER_SIZE; /* - pad_len;*/ |
| 401 | 377 | check_len = ZM_MAX_RX_BUFFER_SIZE - chk_idx - 4; | |
| 402 | if (index > ZM_MAX_RX_BUFFER_SIZE) | 378 | check_pad = pad_len; |
| 403 | { | 379 | |
| 404 | remain_len = index - ZM_MAX_RX_BUFFER_SIZE; // - pad_len; | 380 | /* Allocate a skb buffer */ |
| 405 | check_len = ZM_MAX_RX_BUFFER_SIZE - chk_idx - 4; | 381 | /*new_buf = zfwBufAllocate(dev, ZM_MAX_RX_BUFFER_SIZE);*/ |
| 406 | check_pad = pad_len; | 382 | new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE); |
| 407 | 383 | ||
| 408 | /* Allocate a skb buffer */ | 384 | /* Set skb buffer length */ |
| 409 | //new_buf = zfwBufAllocate(dev, ZM_MAX_RX_BUFFER_SIZE); | 385 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
| 410 | new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE); | 386 | new_buf->tail = 0; |
| 411 | 387 | new_buf->len = 0; | |
| 412 | /* Set skb buffer length */ | 388 | #else |
| 413 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 389 | new_buf->tail = new_buf->data; |
| 414 | new_buf->tail = 0; | 390 | new_buf->len = 0; |
| 415 | new_buf->len = 0; | 391 | #endif |
| 416 | #else | 392 | |
| 417 | new_buf->tail = new_buf->data; | 393 | skb_put(new_buf, pkt_len); |
| 418 | new_buf->len = 0; | 394 | |
| 419 | #endif | 395 | /* Copy the buffer */ |
| 420 | 396 | memcpy(new_buf->data, &(buf->data[chk_idx+4]), check_len); | |
| 421 | skb_put(new_buf, pkt_len); | 397 | |
| 422 | 398 | /* Record the buffer pointer */ | |
| 423 | /* Copy the buffer */ | 399 | macp->reamin_buf = new_buf; |
| 424 | memcpy(new_buf->data, &(buf->data[chk_idx+4]), check_len); | 400 | } else { |
| 425 | 401 | #ifdef ZM_DONT_COPY_RX_BUFFER | |
| 426 | /* Record the buffer pointer */ | 402 | if (rxBufPoolIndex == 0) { |
| 427 | macp->reamin_buf = new_buf; | 403 | new_buf = skb_clone(buf, GFP_ATOMIC); |
| 428 | } | 404 | |
| 429 | else | 405 | new_buf->data = &(buf->data[chk_idx+4]); |
| 430 | { | 406 | new_buf->len = pkt_len; |
| 431 | #ifdef ZM_DONT_COPY_RX_BUFFER | 407 | } else { |
| 432 | if (rxBufPoolIndex == 0) | 408 | #endif |
| 433 | { | 409 | /* Allocate a skb buffer */ |
| 434 | new_buf = skb_clone(buf, GFP_ATOMIC); | 410 | new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE); |
| 435 | 411 | ||
| 436 | new_buf->data = &(buf->data[chk_idx+4]); | 412 | /* Set skb buffer length */ |
| 437 | new_buf->len = pkt_len; | 413 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
| 438 | } | 414 | new_buf->tail = 0; |
| 439 | else | 415 | new_buf->len = 0; |
| 440 | { | 416 | #else |
| 441 | #endif | 417 | new_buf->tail = new_buf->data; |
| 442 | /* Allocate a skb buffer */ | 418 | new_buf->len = 0; |
| 443 | new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE); | 419 | #endif |
| 444 | 420 | ||
| 445 | /* Set skb buffer length */ | 421 | skb_put(new_buf, pkt_len); |
| 446 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 422 | |
| 447 | new_buf->tail = 0; | 423 | /* Copy the buffer */ |
| 448 | new_buf->len = 0; | 424 | memcpy(new_buf->data, &(buf->data[chk_idx+4]), pkt_len); |
| 449 | #else | 425 | |
| 450 | new_buf->tail = new_buf->data; | 426 | #ifdef ZM_DONT_COPY_RX_BUFFER |
| 451 | new_buf->len = 0; | 427 | } |
| 452 | #endif | 428 | #endif |
| 453 | 429 | rxBufPool[rxBufPoolIndex++] = new_buf; | |
| 454 | skb_put(new_buf, pkt_len); | 430 | } |
| 455 | 431 | } else { | |
| 456 | /* Copy the buffer */ | 432 | printk(KERN_ERR "Can't find tag, pkt_len: 0x%04x, tag: 0x%04x\n", pkt_len, pkt_tag); |
| 457 | memcpy(new_buf->data, &(buf->data[chk_idx+4]), pkt_len); | 433 | |
| 458 | 434 | /* Free buffer */ | |
| 459 | #ifdef ZM_DONT_COPY_RX_BUFFER | 435 | dev_kfree_skb_any(buf); |
| 460 | } | 436 | |
| 461 | #endif | 437 | /* Allocate a skb buffer */ |
| 462 | rxBufPool[rxBufPoolIndex++] = new_buf; | 438 | new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE); |
| 463 | } | 439 | |
| 464 | } | 440 | /* Enqueue skb buffer */ |
| 465 | else | 441 | zfLnxPutUsbRxBuffer(dev, new_buf); |
| 466 | { | 442 | |
| 467 | printk(KERN_ERR "Can't find tag, pkt_len: 0x%04x, tag: 0x%04x\n", pkt_len, pkt_tag); | 443 | /* Submit a Rx urb */ |
| 468 | 444 | zfLnxUsbIn(dev, urb, new_buf); | |
| 469 | /* Free buffer */ | 445 | |
| 470 | dev_kfree_skb_any(buf); | 446 | return; |
| 471 | 447 | } | |
| 472 | /* Allocate a skb buffer */ | 448 | } |
| 473 | new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE); | ||
| 474 | |||
| 475 | /* Enqueue skb buffer */ | ||
| 476 | zfLnxPutUsbRxBuffer(dev, new_buf); | ||
| 477 | |||
| 478 | /* Submit a Rx urb */ | ||
| 479 | zfLnxUsbIn(dev, urb, new_buf); | ||
| 480 | |||
| 481 | return; | ||
| 482 | } | ||
| 483 | } | ||
| 484 | 449 | ||
| 485 | /* Free buffer */ | 450 | /* Free buffer */ |
| 486 | dev_kfree_skb_any(buf); | 451 | dev_kfree_skb_any(buf); |
| @@ -496,9 +461,8 @@ void zfLnxUsbDataIn_callback(urb_t *urb) | |||
| 496 | zfLnxUsbIn(dev, urb, new_buf); | 461 | zfLnxUsbIn(dev, urb, new_buf); |
| 497 | 462 | ||
| 498 | #if ZM_USB_STREAM_MODE == 1 | 463 | #if ZM_USB_STREAM_MODE == 1 |
| 499 | for(ii = 0; ii < rxBufPoolIndex; ii++) | 464 | for (ii = 0; ii < rxBufPoolIndex; ii++) { |
| 500 | { | 465 | macp->usbCbFunctions.zfcbUsbRecv(dev, rxBufPool[ii]); |
| 501 | macp->usbCbFunctions.zfcbUsbRecv(dev, rxBufPool[ii]); | ||
| 502 | } | 466 | } |
| 503 | #else | 467 | #else |
| 504 | /* pass data to upper layer */ | 468 | /* pass data to upper layer */ |
| @@ -508,51 +472,48 @@ void zfLnxUsbDataIn_callback(urb_t *urb) | |||
| 508 | 472 | ||
| 509 | void zfLnxUsbRegOut_callback(urb_t *urb) | 473 | void zfLnxUsbRegOut_callback(urb_t *urb) |
| 510 | { | 474 | { |
| 511 | //dev_t* dev = urb->context; | 475 | /*dev_t* dev = urb->context;*/ |
| 512 | 476 | ||
| 513 | //printk(KERN_ERR "zfwUsbRegOut_callback\n"); | 477 | /*printk(KERN_ERR "zfwUsbRegOut_callback\n");*/ |
| 514 | } | 478 | } |
| 515 | 479 | ||
| 516 | void zfLnxUsbRegIn_callback(urb_t *urb) | 480 | void zfLnxUsbRegIn_callback(urb_t *urb) |
| 517 | { | 481 | { |
| 518 | zdev_t* dev = urb->context; | 482 | zdev_t *dev = urb->context; |
| 519 | u32_t rsp[64/4]; | 483 | u32_t rsp[64/4]; |
| 520 | int status; | 484 | int status; |
| 521 | struct usbdrv_private *macp = dev->ml_priv; | 485 | struct usbdrv_private *macp = dev->ml_priv; |
| 522 | 486 | ||
| 523 | /* Check status for URB */ | 487 | /* Check status for URB */ |
| 524 | if (urb->status != 0){ | 488 | if (urb->status != 0) { |
| 525 | printk("zfLnxUsbRegIn_callback() : status=0x%x\n", urb->status); | 489 | printk("zfLnxUsbRegIn_callback() : status=0x%x\n", urb->status); |
| 526 | if ((urb->status != -ENOENT) && (urb->status != -ECONNRESET) | 490 | if ((urb->status != -ENOENT) && (urb->status != -ECONNRESET) && (urb->status != -ESHUTDOWN)) { |
| 527 | && (urb->status != -ESHUTDOWN)) | 491 | if (urb->status == -EPIPE) { |
| 528 | { | 492 | /*printk(KERN_ERR "nonzero read bulk status received: -EPIPE");*/ |
| 529 | if (urb->status == -EPIPE){ | 493 | status = -1; |
| 530 | //printk(KERN_ERR "nonzero read bulk status received: -EPIPE"); | 494 | } |
| 531 | status = -1; | 495 | |
| 532 | } | 496 | if (urb->status == -EPROTO) { |
| 533 | 497 | /*printk(KERN_ERR "nonzero read bulk status received: -EPROTO");*/ | |
| 534 | if (urb->status == -EPROTO){ | 498 | status = -1; |
| 535 | //printk(KERN_ERR "nonzero read bulk status received: -EPROTO"); | 499 | } |
| 536 | status = -1; | 500 | } |
| 537 | } | 501 | |
| 538 | } | 502 | /*printk(KERN_ERR "urb->status: 0x%08x\n", urb->status);*/ |
| 539 | 503 | return; | |
| 540 | //printk(KERN_ERR "urb->status: 0x%08x\n", urb->status); | 504 | } |
| 541 | return; | ||
| 542 | } | ||
| 543 | 505 | ||
| 544 | if (urb->actual_length == 0) | 506 | if (urb->actual_length == 0) { |
| 545 | { | 507 | printk(KERN_ERR "Get an URB whose length is zero"); |
| 546 | printk(KERN_ERR "Get an URB whose length is zero"); | 508 | status = -1; |
| 547 | status = -1; | ||
| 548 | } | 509 | } |
| 549 | 510 | ||
| 550 | /* Copy data into respone buffer */ | 511 | /* Copy data into respone buffer */ |
| 551 | memcpy(rsp, macp->regUsbReadBuf, urb->actual_length); | 512 | memcpy(rsp, macp->regUsbReadBuf, urb->actual_length); |
| 552 | 513 | ||
| 553 | /* Notify to upper layer */ | 514 | /* Notify to upper layer */ |
| 554 | //zfIdlChkRsp(dev, rsp, (u16_t)urb->actual_length); | 515 | /*zfIdlChkRsp(dev, rsp, (u16_t)urb->actual_length);*/ |
| 555 | //zfiUsbRegIn(dev, rsp, (u16_t)urb->actual_length); | 516 | /*zfiUsbRegIn(dev, rsp, (u16_t)urb->actual_length);*/ |
| 556 | macp->usbCbFunctions.zfcbUsbRegIn(dev, rsp, (u16_t)urb->actual_length); | 517 | macp->usbCbFunctions.zfcbUsbRegIn(dev, rsp, (u16_t)urb->actual_length); |
| 557 | 518 | ||
| 558 | /* Issue another USB IN URB */ | 519 | /* Issue another USB IN URB */ |
| @@ -564,22 +525,22 @@ u32_t zfLnxSubmitRegInUrb(zdev_t *dev) | |||
| 564 | u32_t ret; | 525 | u32_t ret; |
| 565 | struct usbdrv_private *macp = dev->ml_priv; | 526 | struct usbdrv_private *macp = dev->ml_priv; |
| 566 | 527 | ||
| 567 | /* Submit a rx urb */ | 528 | /* Submit a rx urb |
| 568 | //ret = zfLnxUsbSubmitBulkUrb(macp->RegInUrb, macp->udev, | 529 | //ret = zfLnxUsbSubmitBulkUrb(macp->RegInUrb, macp->udev, |
| 569 | // USB_REG_IN_PIPE, USB_DIR_IN, macp->regUsbReadBuf, | 530 | // USB_REG_IN_PIPE, USB_DIR_IN, macp->regUsbReadBuf, |
| 570 | // ZM_USB_REG_MAX_BUF_SIZE, zfLnxUsbRegIn_callback, dev); | 531 | // ZM_USB_REG_MAX_BUF_SIZE, zfLnxUsbRegIn_callback, dev); |
| 571 | //CWYang(-) | 532 | //CWYang(-) |
| 572 | //if (ret != 0) | 533 | //if (ret != 0) |
| 573 | // printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret); | 534 | // printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret);*/ |
| 574 | 535 | ||
| 575 | ret = zfLnxUsbSubmitIntUrb(macp->RegInUrb, macp->udev, | 536 | ret = zfLnxUsbSubmitIntUrb(macp->RegInUrb, macp->udev, |
| 576 | USB_REG_IN_PIPE, USB_DIR_IN, macp->regUsbReadBuf, | 537 | USB_REG_IN_PIPE, USB_DIR_IN, macp->regUsbReadBuf, |
| 577 | ZM_USB_REG_MAX_BUF_SIZE, zfLnxUsbRegIn_callback, dev, 1); | 538 | ZM_USB_REG_MAX_BUF_SIZE, zfLnxUsbRegIn_callback, dev, 1); |
| 578 | 539 | ||
| 579 | return ret; | 540 | return ret; |
| 580 | } | 541 | } |
| 581 | 542 | ||
| 582 | u32_t zfLnxUsbSubmitTxData(zdev_t* dev) | 543 | u32_t zfLnxUsbSubmitTxData(zdev_t *dev) |
| 583 | { | 544 | { |
| 584 | u32_t i; | 545 | u32_t i; |
| 585 | u32_t ret; | 546 | u32_t ret; |
| @@ -600,39 +561,33 @@ u32_t zfLnxUsbSubmitTxData(zdev_t* dev) | |||
| 600 | freeTxUrb = zfLnxGetFreeTxUrb(dev); | 561 | freeTxUrb = zfLnxGetFreeTxUrb(dev); |
| 601 | 562 | ||
| 602 | /* If there is no any free Tx Urb */ | 563 | /* If there is no any free Tx Urb */ |
| 603 | if (freeTxUrb == 0xffff) | 564 | if (freeTxUrb == 0xffff) { |
| 604 | { | 565 | /*printk(KERN_ERR "Can't get free Tx Urb\n"); |
| 605 | //printk(KERN_ERR "Can't get free Tx Urb\n"); | 566 | //printk("CWY - Can't get free Tx Urb\n");*/ |
| 606 | //printk("CWY - Can't get free Tx Urb\n"); | 567 | return 0xffff; |
| 607 | return 0xffff; | ||
| 608 | } | 568 | } |
| 609 | 569 | ||
| 610 | #if ZM_USB_TX_STREAM_MODE == 1 | 570 | #if ZM_USB_TX_STREAM_MODE == 1 |
| 611 | usbTxAggCnt = zfLnxCheckTxBufferCnt(dev); | 571 | usbTxAggCnt = zfLnxCheckTxBufferCnt(dev); |
| 612 | 572 | ||
| 613 | if (usbTxAggCnt >= ZM_MAX_TX_AGGREGATE_NUM) | 573 | if (usbTxAggCnt >= ZM_MAX_TX_AGGREGATE_NUM) { |
| 614 | { | 574 | usbTxAggCnt = ZM_MAX_TX_AGGREGATE_NUM; |
| 615 | usbTxAggCnt = ZM_MAX_TX_AGGREGATE_NUM; | 575 | } else { |
| 616 | } | 576 | usbTxAggCnt = 1; |
| 617 | else | ||
| 618 | { | ||
| 619 | usbTxAggCnt = 1; | ||
| 620 | } | 577 | } |
| 621 | 578 | ||
| 622 | //printk("usbTxAggCnt: %d\n", usbTxAggCnt); | 579 | /*printk("usbTxAggCnt: %d\n", usbTxAggCnt);*/ |
| 623 | #endif | 580 | #endif |
| 624 | 581 | ||
| 625 | #if ZM_USB_TX_STREAM_MODE == 1 | 582 | #if ZM_USB_TX_STREAM_MODE == 1 |
| 626 | for(ii = 0; ii < usbTxAggCnt; ii++) | 583 | for (ii = 0; ii < usbTxAggCnt; ii++) { |
| 627 | { | ||
| 628 | #endif | 584 | #endif |
| 629 | /* Dequeue the packet from UsbTxBufQ */ | 585 | /* Dequeue the packet from UsbTxBufQ */ |
| 630 | TxData = zfLnxGetUsbTxBuffer(dev); | 586 | TxData = zfLnxGetUsbTxBuffer(dev); |
| 631 | if (TxData == NULL) | 587 | if (TxData == NULL) { |
| 632 | { | 588 | /* Give the urb back */ |
| 633 | /* Give the urb back */ | 589 | zfLnxPutTxUrb(dev); |
| 634 | zfLnxPutTxUrb(dev); | 590 | return 0xffff; |
| 635 | return 0xffff; | ||
| 636 | } | 591 | } |
| 637 | 592 | ||
| 638 | /* Point to the freeTxUrb buffer */ | 593 | /* Point to the freeTxUrb buffer */ |
| @@ -644,114 +599,103 @@ u32_t zfLnxUsbSubmitTxData(zdev_t* dev) | |||
| 644 | 599 | ||
| 645 | /* Add the packet length and tag information */ | 600 | /* Add the packet length and tag information */ |
| 646 | *pUsbTxHdr++ = TxData->hdrlen + TxData->snapLen + | 601 | *pUsbTxHdr++ = TxData->hdrlen + TxData->snapLen + |
| 647 | (TxData->buf->len - TxData->offset) + TxData->tailLen; | 602 | (TxData->buf->len - TxData->offset) + TxData->tailLen; |
| 648 | 603 | ||
| 649 | *pUsbTxHdr++ = 0x697e; | 604 | *pUsbTxHdr++ = 0x697e; |
| 650 | 605 | ||
| 651 | puTxBuf += 4; | 606 | puTxBuf += 4; |
| 652 | #endif // #ifdef ZM_USB_TX_STREAM_MODE | 607 | #endif /* #ifdef ZM_USB_TX_STREAM_MODE*/ |
| 653 | 608 | ||
| 654 | /* Copy WLAN header and packet buffer into USB buffer */ | 609 | /* Copy WLAN header and packet buffer into USB buffer */ |
| 655 | for(i = 0; i < TxData->hdrlen; i++) | 610 | for (i = 0; i < TxData->hdrlen; i++) { |
| 656 | { | 611 | *puTxBuf++ = TxData->hdr[i]; |
| 657 | *puTxBuf++ = TxData->hdr[i]; | ||
| 658 | } | 612 | } |
| 659 | 613 | ||
| 660 | /* Copy SNAP header */ | 614 | /* Copy SNAP header */ |
| 661 | for(i = 0; i < TxData->snapLen; i++) | 615 | for (i = 0; i < TxData->snapLen; i++) { |
| 662 | { | 616 | *puTxBuf++ = TxData->snap[i]; |
| 663 | *puTxBuf++ = TxData->snap[i]; | ||
| 664 | } | 617 | } |
| 665 | 618 | ||
| 666 | /* Copy packet buffer */ | 619 | /* Copy packet buffer */ |
| 667 | for(i = 0; i < TxData->buf->len - TxData->offset; i++) | 620 | for (i = 0; i < TxData->buf->len - TxData->offset; i++) { |
| 668 | { | 621 | /*puTxBuf++ = zmw_rx_buf_readb(dev, TxData->buf, i);*/ |
| 669 | //*puTxBuf++ = zmw_rx_buf_readb(dev, TxData->buf, i); | 622 | *puTxBuf++ = *(u8_t *)((u8_t *)TxData->buf->data+i+TxData->offset); |
| 670 | *puTxBuf++ = *(u8_t*)((u8_t*)TxData->buf->data+i+TxData->offset); | ||
| 671 | } | 623 | } |
| 672 | 624 | ||
| 673 | /* Copy tail */ | 625 | /* Copy tail */ |
| 674 | for(i = 0; i < TxData->tailLen; i++) | 626 | for (i = 0; i < TxData->tailLen; i++) { |
| 675 | { | 627 | *puTxBuf++ = TxData->tail[i]; |
| 676 | *puTxBuf++ = TxData->tail[i]; | ||
| 677 | } | 628 | } |
| 678 | 629 | ||
| 679 | len = TxData->hdrlen+TxData->snapLen+TxData->buf->len+TxData->tailLen-TxData->offset; | 630 | len = TxData->hdrlen+TxData->snapLen+TxData->buf->len+TxData->tailLen-TxData->offset; |
| 680 | 631 | ||
| 681 | #if 0 | 632 | #if 0 |
| 682 | if (TxData->hdrlen != 0) | 633 | if (TxData->hdrlen != 0) { |
| 683 | { | 634 | puTxBuf = macp->txUsbBuf[freeTxUrb]; |
| 684 | puTxBuf = macp->txUsbBuf[freeTxUrb]; | 635 | for (i = 0; i < len; i++) { |
| 685 | for (i = 0; i < len; i++) | 636 | printk("%02x ", puTxBuf[i]); |
| 686 | { | 637 | if (i % 16 == 15) |
| 687 | printk("%02x ", puTxBuf[i]); | 638 | printk("\n"); |
| 688 | if (i % 16 == 15) | 639 | } |
| 689 | printk("\n"); | 640 | printk("\n"); |
| 690 | } | 641 | } |
| 691 | printk("\n"); | ||
| 692 | } | ||
| 693 | #endif | 642 | #endif |
| 694 | #if 0 | 643 | #if 0 |
| 695 | /* For debug purpose */ | 644 | /* For debug purpose */ |
| 696 | if(TxData->hdr[9] & 0x40) | 645 | if (TxData->hdr[9] & 0x40) { |
| 697 | { | 646 | int i; |
| 698 | int i; | 647 | u16_t ctrlLen = TxData->hdr[0] + (TxData->hdr[1] << 8); |
| 699 | u16_t ctrlLen = TxData->hdr[0] + (TxData->hdr[1] << 8); | 648 | |
| 700 | 649 | if (ctrlLen != len + 4) { | |
| 701 | if (ctrlLen != len + 4) | 650 | /* Dump control setting */ |
| 702 | { | 651 | for (i = 0; i < 8; i++) { |
| 703 | /* Dump control setting */ | 652 | printk(KERN_ERR "0x%02x ", TxData->hdr[i]); |
| 704 | for(i = 0; i < 8; i++) | 653 | } |
| 705 | { | 654 | printk(KERN_ERR "\n"); |
| 706 | printk(KERN_ERR "0x%02x ", TxData->hdr[i]); | 655 | |
| 707 | } | 656 | printk(KERN_ERR "ctrLen: %d, hdrLen: %d, snapLen: %d\n", ctrlLen, TxData->hdrlen, TxData->snapLen); |
| 708 | printk(KERN_ERR "\n"); | 657 | printk(KERN_ERR "bufLen: %d, tailLen: %d, len: %d\n", TxData->buf->len, TxData->tailLen, len); |
| 709 | 658 | } | |
| 710 | printk(KERN_ERR "ctrLen: %d, hdrLen: %d, snapLen: %d\n", ctrlLen, TxData->hdrlen, TxData->snapLen); | ||
| 711 | printk(KERN_ERR "bufLen: %d, tailLen: %d, len: %d\n", TxData->buf->len, TxData->tailLen, len); | ||
| 712 | } | ||
| 713 | } | 659 | } |
| 714 | #endif | 660 | #endif |
| 715 | 661 | ||
| 716 | #if ZM_USB_TX_STREAM_MODE == 1 | 662 | #if ZM_USB_TX_STREAM_MODE == 1 |
| 717 | // Add the Length and Tag | 663 | /* Add the Length and Tag*/ |
| 718 | len += 4; | 664 | len += 4; |
| 719 | 665 | ||
| 720 | //printk("%d packet, length: %d\n", ii+1, len); | 666 | /*printk("%d packet, length: %d\n", ii+1, len);*/ |
| 721 | 667 | ||
| 722 | if (ii < (ZM_MAX_TX_AGGREGATE_NUM-1)) | 668 | if (ii < (ZM_MAX_TX_AGGREGATE_NUM-1)) { |
| 723 | { | 669 | /* Pad the buffer to firmware descriptor boundary */ |
| 724 | /* Pad the buffer to firmware descriptor boundary */ | 670 | offset += (((len-1) / 4) + 1) * 4; |
| 725 | offset += (((len-1) / 4) + 1) * 4; | ||
| 726 | } | 671 | } |
| 727 | 672 | ||
| 728 | if (ii == (ZM_MAX_TX_AGGREGATE_NUM-1)) | 673 | if (ii == (ZM_MAX_TX_AGGREGATE_NUM-1)) { |
| 729 | { | 674 | len += offset; |
| 730 | len += offset; | ||
| 731 | } | 675 | } |
| 732 | 676 | ||
| 733 | TxQPool[ii] = TxData; | 677 | TxQPool[ii] = TxData; |
| 734 | 678 | ||
| 735 | //DbgPrint("%d packet, offset: %d\n", ii+1, pUsbTxTransfer->offset); | 679 | /*DbgPrint("%d packet, offset: %d\n", ii+1, pUsbTxTransfer->offset);*/ |
| 736 | 680 | ||
| 737 | /* free packet */ | 681 | /* free packet */ |
| 738 | //zfBufFree(dev, txData->buf); | 682 | /*zfBufFree(dev, txData->buf);*/ |
| 739 | } | 683 | } |
| 740 | #endif | 684 | #endif |
| 741 | //printk("CWY - call zfwUsbSubmitBulkUrb(), len = 0x%d\n", len); | 685 | /*printk("CWY - call zfwUsbSubmitBulkUrb(), len = 0x%d\n", len);*/ |
| 742 | /* Submit a tx urb */ | 686 | /* Submit a tx urb */ |
| 743 | ret = zfLnxUsbSubmitBulkUrb(macp->WlanTxDataUrb[freeTxUrb], macp->udev, | 687 | ret = zfLnxUsbSubmitBulkUrb(macp->WlanTxDataUrb[freeTxUrb], macp->udev, |
| 744 | USB_WLAN_TX_PIPE, USB_DIR_OUT, macp->txUsbBuf[freeTxUrb], | 688 | USB_WLAN_TX_PIPE, USB_DIR_OUT, macp->txUsbBuf[freeTxUrb], |
| 745 | len, zfLnxUsbDataOut_callback, dev); | 689 | len, zfLnxUsbDataOut_callback, dev); |
| 746 | //CWYang(-) | 690 | /*CWYang(-) |
| 747 | //if (ret != 0) | 691 | //if (ret != 0) |
| 748 | // printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret); | 692 | // printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret);*/ |
| 749 | 693 | ||
| 750 | /* free packet */ | 694 | /* free packet */ |
| 751 | //dev_kfree_skb_any(TxData->buf); | 695 | /*dev_kfree_skb_any(TxData->buf);*/ |
| 752 | #if ZM_USB_TX_STREAM_MODE == 1 | 696 | #if ZM_USB_TX_STREAM_MODE == 1 |
| 753 | for(ii = 0; ii < usbTxAggCnt; ii++) | 697 | for (ii = 0; ii < usbTxAggCnt; ii++) |
| 754 | macp->usbCbFunctions.zfcbUsbOutComplete(dev, TxQPool[ii]->buf, 1, TxQPool[ii]->hdr); | 698 | macp->usbCbFunctions.zfcbUsbOutComplete(dev, TxQPool[ii]->buf, 1, TxQPool[ii]->hdr); |
| 755 | #else | 699 | #else |
| 756 | macp->usbCbFunctions.zfcbUsbOutComplete(dev, TxData->buf, 1, TxData->hdr); | 700 | macp->usbCbFunctions.zfcbUsbOutComplete(dev, TxData->buf, 1, TxData->hdr); |
| 757 | #endif | 701 | #endif |
| @@ -761,23 +705,23 @@ u32_t zfLnxUsbSubmitTxData(zdev_t* dev) | |||
| 761 | 705 | ||
| 762 | 706 | ||
| 763 | 707 | ||
| 764 | u32_t zfLnxUsbIn(zdev_t* dev, urb_t *urb, zbuf_t *buf) | 708 | u32_t zfLnxUsbIn(zdev_t *dev, urb_t *urb, zbuf_t *buf) |
| 765 | { | 709 | { |
| 766 | u32_t ret; | 710 | u32_t ret; |
| 767 | struct usbdrv_private *macp = dev->ml_priv; | 711 | struct usbdrv_private *macp = dev->ml_priv; |
| 768 | 712 | ||
| 769 | /* Submit a rx urb */ | 713 | /* Submit a rx urb */ |
| 770 | ret = zfLnxUsbSubmitBulkUrb(urb, macp->udev, USB_WLAN_RX_PIPE, | 714 | ret = zfLnxUsbSubmitBulkUrb(urb, macp->udev, USB_WLAN_RX_PIPE, |
| 771 | USB_DIR_IN, buf->data, ZM_MAX_RX_BUFFER_SIZE, | 715 | USB_DIR_IN, buf->data, ZM_MAX_RX_BUFFER_SIZE, |
| 772 | zfLnxUsbDataIn_callback, dev); | 716 | zfLnxUsbDataIn_callback, dev); |
| 773 | //CWYang(-) | 717 | /*CWYang(-) |
| 774 | //if (ret != 0) | 718 | //if (ret != 0) |
| 775 | // printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret); | 719 | // printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret);*/ |
| 776 | 720 | ||
| 777 | return ret; | 721 | return ret; |
| 778 | } | 722 | } |
| 779 | 723 | ||
| 780 | u32_t zfLnxUsbWriteReg(zdev_t* dev, u32_t* cmd, u16_t cmdLen) | 724 | u32_t zfLnxUsbWriteReg(zdev_t *dev, u32_t *cmd, u16_t cmdLen) |
| 781 | { | 725 | { |
| 782 | struct usbdrv_private *macp = dev->ml_priv; | 726 | struct usbdrv_private *macp = dev->ml_priv; |
| 783 | u32_t ret; | 727 | u32_t ret; |
| @@ -785,7 +729,7 @@ u32_t zfLnxUsbWriteReg(zdev_t* dev, u32_t* cmd, u16_t cmdLen) | |||
| 785 | #ifdef ZM_CONFIG_BIG_ENDIAN | 729 | #ifdef ZM_CONFIG_BIG_ENDIAN |
| 786 | int ii = 0; | 730 | int ii = 0; |
| 787 | 731 | ||
| 788 | for(ii=0; ii<(cmdLen>>2); ii++) | 732 | for (ii = 0; ii < (cmdLen>>2); ii++) |
| 789 | cmd[ii] = cpu_to_le32(cmd[ii]); | 733 | cmd[ii] = cpu_to_le32(cmd[ii]); |
| 790 | #endif | 734 | #endif |
| 791 | 735 | ||
| @@ -794,39 +738,38 @@ u32_t zfLnxUsbWriteReg(zdev_t* dev, u32_t* cmd, u16_t cmdLen) | |||
| 794 | /* Issue an USB Out transfer */ | 738 | /* Issue an USB Out transfer */ |
| 795 | /* Submit a tx urb */ | 739 | /* Submit a tx urb */ |
| 796 | ret = zfLnxUsbSubmitIntUrb(macp->RegOutUrb, macp->udev, | 740 | ret = zfLnxUsbSubmitIntUrb(macp->RegOutUrb, macp->udev, |
| 797 | USB_REG_OUT_PIPE, USB_DIR_OUT, macp->regUsbWriteBuf, | 741 | USB_REG_OUT_PIPE, USB_DIR_OUT, macp->regUsbWriteBuf, |
| 798 | cmdLen, zfLnxUsbRegOut_callback, dev, 1); | 742 | cmdLen, zfLnxUsbRegOut_callback, dev, 1); |
| 799 | 743 | ||
| 800 | return ret; | 744 | return ret; |
| 801 | } | 745 | } |
| 802 | 746 | ||
| 803 | 747 | ||
| 804 | u32_t zfLnxUsbOut(zdev_t* dev, u8_t *hdr, u16_t hdrlen, u8_t *snap, u16_t snapLen, | 748 | u32_t zfLnxUsbOut(zdev_t *dev, u8_t *hdr, u16_t hdrlen, u8_t *snap, u16_t snapLen, |
| 805 | u8_t *tail, u16_t tailLen, zbuf_t *buf, u16_t offset) | 749 | u8_t *tail, u16_t tailLen, zbuf_t *buf, u16_t offset) |
| 806 | { | 750 | { |
| 807 | u32_t ret; | 751 | u32_t ret; |
| 808 | struct usbdrv_private *macp = dev->ml_priv; | 752 | struct usbdrv_private *macp = dev->ml_priv; |
| 809 | 753 | ||
| 810 | /* Check length of tail buffer */ | 754 | /* Check length of tail buffer */ |
| 811 | //zm_assert((tailLen <= 16)); | 755 | /*zm_assert((tailLen <= 16));*/ |
| 812 | 756 | ||
| 813 | /* Enqueue the packet into UsbTxBufQ */ | 757 | /* Enqueue the packet into UsbTxBufQ */ |
| 814 | if (zfLnxPutUsbTxBuffer(dev, hdr, hdrlen, snap, snapLen, tail, tailLen, buf, offset) == 0xffff) | 758 | if (zfLnxPutUsbTxBuffer(dev, hdr, hdrlen, snap, snapLen, tail, tailLen, buf, offset) == 0xffff) { |
| 815 | { | 759 | /* free packet */ |
| 816 | /* free packet */ | 760 | /*printk("CWY - zfwPutUsbTxBuffer Error, free packet\n"); |
| 817 | //printk("CWY - zfwPutUsbTxBuffer Error, free packet\n"); | 761 | //dev_kfree_skb_any(buf);*/ |
| 818 | //dev_kfree_skb_any(buf); | 762 | macp->usbCbFunctions.zfcbUsbOutComplete(dev, buf, 0, hdr); |
| 819 | macp->usbCbFunctions.zfcbUsbOutComplete(dev, buf, 0, hdr); | 763 | return 0xffff; |
| 820 | return 0xffff; | 764 | } |
| 821 | } | ||
| 822 | 765 | ||
| 823 | //return 0; | 766 | /*return 0; |
| 824 | //printk("CWY - call zfwUsbSubmitTxData()\n"); | 767 | //printk("CWY - call zfwUsbSubmitTxData()\n");*/ |
| 825 | ret = zfLnxUsbSubmitTxData(dev); | 768 | ret = zfLnxUsbSubmitTxData(dev); |
| 826 | return ret; | 769 | return ret; |
| 827 | } | 770 | } |
| 828 | 771 | ||
| 829 | void zfLnxInitUsbTxQ(zdev_t* dev) | 772 | void zfLnxInitUsbTxQ(zdev_t *dev) |
| 830 | { | 773 | { |
| 831 | struct usbdrv_private *macp = dev->ml_priv; | 774 | struct usbdrv_private *macp = dev->ml_priv; |
| 832 | 775 | ||
| @@ -842,7 +785,7 @@ void zfLnxInitUsbTxQ(zdev_t* dev) | |||
| 842 | macp->TxUrbCnt = ZM_MAX_TX_URB_NUM; | 785 | macp->TxUrbCnt = ZM_MAX_TX_URB_NUM; |
| 843 | } | 786 | } |
| 844 | 787 | ||
| 845 | void zfLnxInitUsbRxQ(zdev_t* dev) | 788 | void zfLnxInitUsbRxQ(zdev_t *dev) |
| 846 | { | 789 | { |
| 847 | u16_t i; | 790 | u16_t i; |
| 848 | zbuf_t *buf; | 791 | zbuf_t *buf; |
| @@ -853,76 +796,65 @@ void zfLnxInitUsbRxQ(zdev_t* dev) | |||
| 853 | 796 | ||
| 854 | macp->RxBufHead = 0; | 797 | macp->RxBufHead = 0; |
| 855 | 798 | ||
| 856 | for (i = 0; i < ZM_MAX_RX_URB_NUM; i++) | 799 | for (i = 0; i < ZM_MAX_RX_URB_NUM; i++) { |
| 857 | { | 800 | /*buf = zfwBufAllocate(dev, ZM_MAX_RX_BUFFER_SIZE);*/ |
| 858 | //buf = zfwBufAllocate(dev, ZM_MAX_RX_BUFFER_SIZE); | 801 | buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE); |
| 859 | buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE); | 802 | macp->UsbRxBufQ[i] = buf; |
| 860 | macp->UsbRxBufQ[i] = buf; | 803 | } |
| 861 | } | ||
| 862 | 804 | ||
| 863 | //macp->RxBufTail = ZM_MAX_RX_URB_NUM - 1; | 805 | /*macp->RxBufTail = ZM_MAX_RX_URB_NUM - 1;*/ |
| 864 | macp->RxBufTail = 0; | 806 | macp->RxBufTail = 0; |
| 865 | 807 | ||
| 866 | /* Submit all Rx urbs */ | 808 | /* Submit all Rx urbs */ |
| 867 | for (i = 0; i < ZM_MAX_RX_URB_NUM; i++) | 809 | for (i = 0; i < ZM_MAX_RX_URB_NUM; i++) { |
| 868 | { | 810 | zfLnxPutUsbRxBuffer(dev, macp->UsbRxBufQ[i]); |
| 869 | zfLnxPutUsbRxBuffer(dev, macp->UsbRxBufQ[i]); | 811 | zfLnxUsbIn(dev, macp->WlanRxDataUrb[i], macp->UsbRxBufQ[i]); |
| 870 | zfLnxUsbIn(dev, macp->WlanRxDataUrb[i], macp->UsbRxBufQ[i]); | 812 | } |
| 871 | } | ||
| 872 | } | 813 | } |
| 873 | 814 | ||
| 874 | 815 | ||
| 875 | 816 | ||
| 876 | u32_t zfLnxUsbSubmitBulkUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction, | 817 | u32_t zfLnxUsbSubmitBulkUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction, |
| 877 | void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context) | 818 | void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context) |
| 878 | { | 819 | { |
| 879 | u32_t ret; | 820 | u32_t ret; |
| 880 | 821 | ||
| 881 | if(direction == USB_DIR_OUT) | 822 | if (direction == USB_DIR_OUT) { |
| 882 | { | 823 | usb_fill_bulk_urb(urb, usb, usb_sndbulkpipe(usb, epnum), |
| 883 | usb_fill_bulk_urb(urb, usb, usb_sndbulkpipe(usb, epnum), | 824 | transfer_buffer, buffer_length, complete, context); |
| 884 | transfer_buffer, buffer_length, complete, context); | ||
| 885 | 825 | ||
| 886 | urb->transfer_flags |= URB_ZERO_PACKET; | 826 | urb->transfer_flags |= URB_ZERO_PACKET; |
| 887 | } | 827 | } else { |
| 888 | else | 828 | usb_fill_bulk_urb(urb, usb, usb_rcvbulkpipe(usb, epnum), |
| 889 | { | 829 | transfer_buffer, buffer_length, complete, context); |
| 890 | usb_fill_bulk_urb(urb, usb, usb_rcvbulkpipe(usb, epnum), | ||
| 891 | transfer_buffer, buffer_length, complete, context); | ||
| 892 | } | 830 | } |
| 893 | 831 | ||
| 894 | if (epnum == 4) | 832 | if (epnum == 4) { |
| 895 | { | 833 | if (urb->hcpriv) { |
| 896 | if (urb->hcpriv) | 834 | /*printk("CWY - urb->hcpriv set by unknown reason, reset it\n"); |
| 897 | { | 835 | //urb->hcpriv = 0;*/ |
| 898 | //printk("CWY - urb->hcpriv set by unknown reason, reset it\n"); | 836 | } |
| 899 | //urb->hcpriv = 0; | 837 | } |
| 900 | } | ||
| 901 | } | ||
| 902 | 838 | ||
| 903 | ret = usb_submit_urb(urb, GFP_ATOMIC); | 839 | ret = usb_submit_urb(urb, GFP_ATOMIC); |
| 904 | if ((epnum == 4) & (ret != 0)) | 840 | if ((epnum == 4) & (ret != 0)) { |
| 905 | { | 841 | /*printk("CWY - ret = %x\n", ret);*/ |
| 906 | //printk("CWY - ret = %x\n", ret); | ||
| 907 | } | 842 | } |
| 908 | return ret; | 843 | return ret; |
| 909 | } | 844 | } |
| 910 | 845 | ||
| 911 | u32_t zfLnxUsbSubmitIntUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction, | 846 | u32_t zfLnxUsbSubmitIntUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction, |
| 912 | void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context, | 847 | void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context, |
| 913 | u32_t interval) | 848 | u32_t interval) |
| 914 | { | 849 | { |
| 915 | u32_t ret; | 850 | u32_t ret; |
| 916 | 851 | ||
| 917 | if(direction == USB_DIR_OUT) | 852 | if (direction == USB_DIR_OUT) { |
| 918 | { | 853 | usb_fill_int_urb(urb, usb, usb_sndbulkpipe(usb, epnum), |
| 919 | usb_fill_int_urb(urb, usb, usb_sndbulkpipe(usb, epnum), | 854 | transfer_buffer, buffer_length, complete, context, interval); |
| 920 | transfer_buffer, buffer_length, complete, context, interval); | 855 | } else { |
| 921 | } | 856 | usb_fill_int_urb(urb, usb, usb_rcvbulkpipe(usb, epnum), |
| 922 | else | 857 | transfer_buffer, buffer_length, complete, context, interval); |
| 923 | { | ||
| 924 | usb_fill_int_urb(urb, usb, usb_rcvbulkpipe(usb, epnum), | ||
| 925 | transfer_buffer, buffer_length, complete, context, interval); | ||
| 926 | } | 858 | } |
| 927 | 859 | ||
| 928 | ret = usb_submit_urb(urb, GFP_ATOMIC); | 860 | ret = usb_submit_urb(urb, GFP_ATOMIC); |
| @@ -946,51 +878,48 @@ int zfLnxCencSendMsg(struct sock *netlink_sk, u_int8_t *msg, int len) | |||
| 946 | size = NLMSG_SPACE(len); | 878 | size = NLMSG_SPACE(len); |
| 947 | skb = alloc_skb(size, GFP_ATOMIC); | 879 | skb = alloc_skb(size, GFP_ATOMIC); |
| 948 | 880 | ||
| 949 | if(skb == NULL) | 881 | if (skb == NULL) { |
| 950 | { | ||
| 951 | printk("dev_alloc_skb failure \n"); | 882 | printk("dev_alloc_skb failure \n"); |
| 952 | goto out; | 883 | goto out; |
| 953 | } | 884 | } |
| 954 | old_tail = skb->tail; | 885 | old_tail = skb->tail; |
| 955 | 886 | ||
| 956 | /*填写数据报相关信息*/ | 887 | /* */ |
| 957 | nlh = NLMSG_PUT(skb, 0, 0, WAI_K_MSG, size-sizeof(*nlh)); | 888 | nlh = NLMSG_PUT(skb, 0, 0, WAI_K_MSG, size-sizeof(*nlh)); |
| 958 | pos = NLMSG_DATA(nlh); | 889 | pos = NLMSG_DATA(nlh); |
| 959 | 890 | ||
| 960 | /*传输到用户空间的数据*/ | 891 | /* */ |
| 961 | memcpy(pos, msg, len); | 892 | memcpy(pos, msg, len); |
| 962 | /*计算经过字节对其后的数据实际长度*/ | 893 | /* */ |
| 963 | nlh->nlmsg_len = skb->tail - old_tail; | 894 | nlh->nlmsg_len = skb->tail - old_tail; |
| 964 | NETLINK_CB(skb).dst_group = COMMTYPE_GROUP; | 895 | NETLINK_CB(skb).dst_group = COMMTYPE_GROUP; |
| 965 | netlink_broadcast(netlink_sk, skb, 0, COMMTYPE_GROUP, GFP_ATOMIC); | 896 | netlink_broadcast(netlink_sk, skb, 0, COMMTYPE_GROUP, GFP_ATOMIC); |
| 966 | ret = 0; | 897 | ret = 0; |
| 967 | out: | 898 | out: |
| 968 | return ret; | 899 | return ret; |
| 969 | nlmsg_failure: /*NLMSG_PUT 失败,则撤销套接字缓存*/ | 900 | nlmsg_failure: /* */ |
| 970 | kfree_skb(skb); | 901 | kfree_skb(skb); |
| 971 | goto out; | 902 | goto out; |
| 972 | 903 | ||
| 973 | #undef COMMTYPE_GROUP | 904 | #undef COMMTYPE_GROUP |
| 974 | #undef WAI_K_MSG | 905 | #undef WAI_K_MSG |
| 975 | } | 906 | } |
| 976 | #endif //ZM_ENABLE_CENC | 907 | #endif /*ZM_ENABLE_CENC*/ |
| 977 | 908 | ||
| 978 | /* Simply return 0xffff if VAP function is not supported */ | 909 | /* Simply return 0xffff if VAP function is not supported */ |
| 979 | u16_t zfLnxGetVapId(zdev_t* dev) | 910 | u16_t zfLnxGetVapId(zdev_t *dev) |
| 980 | { | 911 | { |
| 981 | u16_t i; | 912 | u16_t i; |
| 982 | 913 | ||
| 983 | for (i=0; i<ZM_VAP_PORT_NUMBER; i++) | 914 | for (i = 0; i < ZM_VAP_PORT_NUMBER; i++) { |
| 984 | { | 915 | if (vap[i].dev == dev) { |
| 985 | if (vap[i].dev == dev) | 916 | return i; |
| 986 | { | 917 | } |
| 987 | return i; | 918 | } |
| 988 | } | 919 | return 0xffff; |
| 989 | } | ||
| 990 | return 0xffff; | ||
| 991 | } | 920 | } |
| 992 | 921 | ||
| 993 | u32_t zfwReadReg(zdev_t* dev, u32_t offset) | 922 | u32_t zfwReadReg(zdev_t *dev, u32_t offset) |
| 994 | { | 923 | { |
| 995 | return 0; | 924 | return 0; |
| 996 | } | 925 | } |
| @@ -1012,25 +941,23 @@ u32_t smp_kevent_Lock = 0; | |||
| 1012 | void kevent(struct work_struct *work) | 941 | void kevent(struct work_struct *work) |
| 1013 | { | 942 | { |
| 1014 | struct usbdrv_private *macp = | 943 | struct usbdrv_private *macp = |
| 1015 | container_of(work, struct usbdrv_private, kevent); | 944 | container_of(work, struct usbdrv_private, kevent); |
| 1016 | zdev_t *dev = macp->device; | 945 | zdev_t *dev = macp->device; |
| 1017 | 946 | ||
| 1018 | if (test_and_set_bit(0, (void *)&smp_kevent_Lock)) | 947 | if (test_and_set_bit(0, (void *)&smp_kevent_Lock)) { |
| 1019 | { | 948 | /*schedule_work(&macp->kevent);*/ |
| 1020 | //schedule_work(&macp->kevent); | 949 | return; |
| 1021 | return; | ||
| 1022 | } | 950 | } |
| 1023 | 951 | ||
| 1024 | down(&macp->ioctl_sem); | 952 | down(&macp->ioctl_sem); |
| 1025 | 953 | ||
| 1026 | if (test_and_clear_bit(KEVENT_WATCHDOG, &macp->kevent_flags)) | 954 | if (test_and_clear_bit(KEVENT_WATCHDOG, &macp->kevent_flags)) { |
| 1027 | { | ||
| 1028 | extern u16_t zfHpStartRecv(zdev_t *dev); | 955 | extern u16_t zfHpStartRecv(zdev_t *dev); |
| 1029 | //zfiHwWatchDogReinit(dev); | 956 | /*zfiHwWatchDogReinit(dev);*/ |
| 1030 | printk(("\n ************ Hw watchDog occur!! ************** \n")); | 957 | printk(("\n ************ Hw watchDog occur!! ************** \n")); |
| 1031 | zfiWlanSuspend(dev); | 958 | zfiWlanSuspend(dev); |
| 1032 | zfiWlanResume(dev,0); | 959 | zfiWlanResume(dev , 0); |
| 1033 | zfHpStartRecv(dev); | 960 | zfHpStartRecv(dev); |
| 1034 | } | 961 | } |
| 1035 | 962 | ||
| 1036 | clear_bit(0, (void *)&smp_kevent_Lock); | 963 | clear_bit(0, (void *)&smp_kevent_Lock); |
| @@ -1083,41 +1010,38 @@ void zfLnxSignalThread(zdev_t *dev, int flag) | |||
| 1083 | { | 1010 | { |
| 1084 | struct usbdrv_private *macp = dev->ml_priv; | 1011 | struct usbdrv_private *macp = dev->ml_priv; |
| 1085 | 1012 | ||
| 1086 | if (macp == NULL) | 1013 | if (macp == NULL) { |
| 1087 | { | 1014 | printk("macp is NULL\n"); |
| 1088 | printk("macp is NULL\n"); | 1015 | return; |
| 1089 | return; | ||
| 1090 | } | 1016 | } |
| 1091 | 1017 | ||
| 1092 | if (0 && macp->kevent_ready != 1) | 1018 | if (0 && macp->kevent_ready != 1) { |
| 1093 | { | 1019 | printk("Kevent not ready\n"); |
| 1094 | printk("Kevent not ready\n"); | 1020 | return; |
| 1095 | return; | ||
| 1096 | } | 1021 | } |
| 1097 | 1022 | ||
| 1098 | set_bit(flag, &macp->kevent_flags); | 1023 | set_bit(flag, &macp->kevent_flags); |
| 1099 | 1024 | ||
| 1100 | if (!schedule_work(&macp->kevent)) | 1025 | if (!schedule_work(&macp->kevent)) { |
| 1101 | { | 1026 | /*Fails is Normal |
| 1102 | //Fails is Normal | 1027 | //printk(KERN_ERR "schedule_task failed, flag = %x\n", flag);*/ |
| 1103 | //printk(KERN_ERR "schedule_task failed, flag = %x\n", flag); | 1028 | } |
| 1104 | } | ||
| 1105 | } | 1029 | } |
| 1106 | 1030 | ||
| 1107 | /* Notify wrapper todo redownload firmware and reinit procedure when */ | 1031 | /* Notify wrapper todo redownload firmware and reinit procedure when */ |
| 1108 | /* hardware watchdog occur : zfiHwWatchDogReinit() */ | 1032 | /* hardware watchdog occur : zfiHwWatchDogReinit() */ |
| 1109 | void zfLnxWatchDogNotify(zdev_t* dev) | 1033 | void zfLnxWatchDogNotify(zdev_t *dev) |
| 1110 | { | 1034 | { |
| 1111 | zfLnxSignalThread(dev, KEVENT_WATCHDOG); | 1035 | zfLnxSignalThread(dev, KEVENT_WATCHDOG); |
| 1112 | } | 1036 | } |
| 1113 | 1037 | ||
| 1114 | /* Query Durantion of Active Scan */ | 1038 | /* Query Durantion of Active Scan */ |
| 1115 | void zfwGetActiveScanDur(zdev_t* dev, u8_t* Dur) | 1039 | void zfwGetActiveScanDur(zdev_t *dev, u8_t *Dur) |
| 1116 | { | 1040 | { |
| 1117 | *Dur = 30; // default 30 ms | 1041 | *Dur = 30; /* default 30 ms*/ |
| 1118 | } | 1042 | } |
| 1119 | 1043 | ||
| 1120 | void zfwGetShowZeroLengthSSID(zdev_t* dev, u8_t* Dur) | 1044 | void zfwGetShowZeroLengthSSID(zdev_t *dev, u8_t *Dur) |
| 1121 | { | 1045 | { |
| 1122 | *Dur = 0; | 1046 | *Dur = 0; |
| 1123 | } | 1047 | } |
