diff options
Diffstat (limited to 'drivers/net/usb/rndis_host.c')
-rw-r--r-- | drivers/net/usb/rndis_host.c | 54 |
1 files changed, 28 insertions, 26 deletions
diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c index c8f1b5b3aff3..3b7ddfd25fd2 100644 --- a/drivers/net/usb/rndis_host.c +++ b/drivers/net/usb/rndis_host.c | |||
@@ -78,10 +78,10 @@ static void rndis_msg_indicate(struct usbnet *dev, struct rndis_indicate *msg, | |||
78 | dev->driver_info->indication(dev, msg, buflen); | 78 | dev->driver_info->indication(dev, msg, buflen); |
79 | } else { | 79 | } else { |
80 | switch (msg->status) { | 80 | switch (msg->status) { |
81 | case RNDIS_STATUS_MEDIA_CONNECT: | 81 | case cpu_to_le32(RNDIS_STATUS_MEDIA_CONNECT): |
82 | dev_info(udev, "rndis media connect\n"); | 82 | dev_info(udev, "rndis media connect\n"); |
83 | break; | 83 | break; |
84 | case RNDIS_STATUS_MEDIA_DISCONNECT: | 84 | case cpu_to_le32(RNDIS_STATUS_MEDIA_DISCONNECT): |
85 | dev_info(udev, "rndis media disconnect\n"); | 85 | dev_info(udev, "rndis media disconnect\n"); |
86 | break; | 86 | break; |
87 | default: | 87 | default: |
@@ -117,8 +117,8 @@ int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen) | |||
117 | */ | 117 | */ |
118 | 118 | ||
119 | /* Issue the request; xid is unique, don't bother byteswapping it */ | 119 | /* Issue the request; xid is unique, don't bother byteswapping it */ |
120 | if (likely(buf->msg_type != RNDIS_MSG_HALT && | 120 | if (likely(buf->msg_type != cpu_to_le32(RNDIS_MSG_HALT) && |
121 | buf->msg_type != RNDIS_MSG_RESET)) { | 121 | buf->msg_type != cpu_to_le32(RNDIS_MSG_RESET))) { |
122 | xid = dev->xid++; | 122 | xid = dev->xid++; |
123 | if (!xid) | 123 | if (!xid) |
124 | xid = dev->xid++; | 124 | xid = dev->xid++; |
@@ -149,7 +149,7 @@ int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen) | |||
149 | } | 149 | } |
150 | 150 | ||
151 | /* Poll the control channel; the request probably completed immediately */ | 151 | /* Poll the control channel; the request probably completed immediately */ |
152 | rsp = buf->msg_type | RNDIS_MSG_COMPLETION; | 152 | rsp = buf->msg_type | cpu_to_le32(RNDIS_MSG_COMPLETION); |
153 | for (count = 0; count < 10; count++) { | 153 | for (count = 0; count < 10; count++) { |
154 | memset(buf, 0, CONTROL_BUFFER_SIZE); | 154 | memset(buf, 0, CONTROL_BUFFER_SIZE); |
155 | retval = usb_control_msg(dev->udev, | 155 | retval = usb_control_msg(dev->udev, |
@@ -164,9 +164,10 @@ int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen) | |||
164 | request_id = (__force u32) buf->request_id; | 164 | request_id = (__force u32) buf->request_id; |
165 | if (likely(buf->msg_type == rsp)) { | 165 | if (likely(buf->msg_type == rsp)) { |
166 | if (likely(request_id == xid)) { | 166 | if (likely(request_id == xid)) { |
167 | if (unlikely(rsp == RNDIS_MSG_RESET_C)) | 167 | if (unlikely(rsp == |
168 | cpu_to_le32(RNDIS_MSG_RESET_C))) | ||
168 | return 0; | 169 | return 0; |
169 | if (likely(RNDIS_STATUS_SUCCESS | 170 | if (likely(cpu_to_le32(RNDIS_STATUS_SUCCESS) |
170 | == buf->status)) | 171 | == buf->status)) |
171 | return 0; | 172 | return 0; |
172 | dev_dbg(&info->control->dev, | 173 | dev_dbg(&info->control->dev, |
@@ -179,16 +180,15 @@ int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen) | |||
179 | request_id, xid); | 180 | request_id, xid); |
180 | /* then likely retry */ | 181 | /* then likely retry */ |
181 | } else switch (buf->msg_type) { | 182 | } else switch (buf->msg_type) { |
182 | case RNDIS_MSG_INDICATE: /* fault/event */ | 183 | case cpu_to_le32(RNDIS_MSG_INDICATE): /* fault/event */ |
183 | rndis_msg_indicate(dev, (void *)buf, buflen); | 184 | rndis_msg_indicate(dev, (void *)buf, buflen); |
184 | |||
185 | break; | 185 | break; |
186 | case RNDIS_MSG_KEEPALIVE: { /* ping */ | 186 | case cpu_to_le32(RNDIS_MSG_KEEPALIVE): { /* ping */ |
187 | struct rndis_keepalive_c *msg = (void *)buf; | 187 | struct rndis_keepalive_c *msg = (void *)buf; |
188 | 188 | ||
189 | msg->msg_type = RNDIS_MSG_KEEPALIVE_C; | 189 | msg->msg_type = cpu_to_le32(RNDIS_MSG_KEEPALIVE_C); |
190 | msg->msg_len = cpu_to_le32(sizeof *msg); | 190 | msg->msg_len = cpu_to_le32(sizeof *msg); |
191 | msg->status = RNDIS_STATUS_SUCCESS; | 191 | msg->status = cpu_to_le32(RNDIS_STATUS_SUCCESS); |
192 | retval = usb_control_msg(dev->udev, | 192 | retval = usb_control_msg(dev->udev, |
193 | usb_sndctrlpipe(dev->udev, 0), | 193 | usb_sndctrlpipe(dev->udev, 0), |
194 | USB_CDC_SEND_ENCAPSULATED_COMMAND, | 194 | USB_CDC_SEND_ENCAPSULATED_COMMAND, |
@@ -251,7 +251,7 @@ static int rndis_query(struct usbnet *dev, struct usb_interface *intf, | |||
251 | u.buf = buf; | 251 | u.buf = buf; |
252 | 252 | ||
253 | memset(u.get, 0, sizeof *u.get + in_len); | 253 | memset(u.get, 0, sizeof *u.get + in_len); |
254 | u.get->msg_type = RNDIS_MSG_QUERY; | 254 | u.get->msg_type = cpu_to_le32(RNDIS_MSG_QUERY); |
255 | u.get->msg_len = cpu_to_le32(sizeof *u.get + in_len); | 255 | u.get->msg_len = cpu_to_le32(sizeof *u.get + in_len); |
256 | u.get->oid = oid; | 256 | u.get->oid = oid; |
257 | u.get->len = cpu_to_le32(in_len); | 257 | u.get->len = cpu_to_le32(in_len); |
@@ -324,7 +324,7 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags) | |||
324 | if (retval < 0) | 324 | if (retval < 0) |
325 | goto fail; | 325 | goto fail; |
326 | 326 | ||
327 | u.init->msg_type = RNDIS_MSG_INIT; | 327 | u.init->msg_type = cpu_to_le32(RNDIS_MSG_INIT); |
328 | u.init->msg_len = cpu_to_le32(sizeof *u.init); | 328 | u.init->msg_len = cpu_to_le32(sizeof *u.init); |
329 | u.init->major_version = cpu_to_le32(1); | 329 | u.init->major_version = cpu_to_le32(1); |
330 | u.init->minor_version = cpu_to_le32(0); | 330 | u.init->minor_version = cpu_to_le32(0); |
@@ -395,22 +395,23 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags) | |||
395 | /* Check physical medium */ | 395 | /* Check physical medium */ |
396 | phym = NULL; | 396 | phym = NULL; |
397 | reply_len = sizeof *phym; | 397 | reply_len = sizeof *phym; |
398 | retval = rndis_query(dev, intf, u.buf, OID_GEN_PHYSICAL_MEDIUM, | 398 | retval = rndis_query(dev, intf, u.buf, |
399 | cpu_to_le32(OID_GEN_PHYSICAL_MEDIUM), | ||
399 | 0, (void **) &phym, &reply_len); | 400 | 0, (void **) &phym, &reply_len); |
400 | if (retval != 0 || !phym) { | 401 | if (retval != 0 || !phym) { |
401 | /* OID is optional so don't fail here. */ | 402 | /* OID is optional so don't fail here. */ |
402 | phym_unspec = RNDIS_PHYSICAL_MEDIUM_UNSPECIFIED; | 403 | phym_unspec = cpu_to_le32(RNDIS_PHYSICAL_MEDIUM_UNSPECIFIED); |
403 | phym = &phym_unspec; | 404 | phym = &phym_unspec; |
404 | } | 405 | } |
405 | if ((flags & FLAG_RNDIS_PHYM_WIRELESS) && | 406 | if ((flags & FLAG_RNDIS_PHYM_WIRELESS) && |
406 | *phym != RNDIS_PHYSICAL_MEDIUM_WIRELESS_LAN) { | 407 | *phym != cpu_to_le32(RNDIS_PHYSICAL_MEDIUM_WIRELESS_LAN)) { |
407 | netif_dbg(dev, probe, dev->net, | 408 | netif_dbg(dev, probe, dev->net, |
408 | "driver requires wireless physical medium, but device is not\n"); | 409 | "driver requires wireless physical medium, but device is not\n"); |
409 | retval = -ENODEV; | 410 | retval = -ENODEV; |
410 | goto halt_fail_and_release; | 411 | goto halt_fail_and_release; |
411 | } | 412 | } |
412 | if ((flags & FLAG_RNDIS_PHYM_NOT_WIRELESS) && | 413 | if ((flags & FLAG_RNDIS_PHYM_NOT_WIRELESS) && |
413 | *phym == RNDIS_PHYSICAL_MEDIUM_WIRELESS_LAN) { | 414 | *phym == cpu_to_le32(RNDIS_PHYSICAL_MEDIUM_WIRELESS_LAN)) { |
414 | netif_dbg(dev, probe, dev->net, | 415 | netif_dbg(dev, probe, dev->net, |
415 | "driver requires non-wireless physical medium, but device is wireless.\n"); | 416 | "driver requires non-wireless physical medium, but device is wireless.\n"); |
416 | retval = -ENODEV; | 417 | retval = -ENODEV; |
@@ -419,7 +420,8 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags) | |||
419 | 420 | ||
420 | /* Get designated host ethernet address */ | 421 | /* Get designated host ethernet address */ |
421 | reply_len = ETH_ALEN; | 422 | reply_len = ETH_ALEN; |
422 | retval = rndis_query(dev, intf, u.buf, OID_802_3_PERMANENT_ADDRESS, | 423 | retval = rndis_query(dev, intf, u.buf, |
424 | cpu_to_le32(OID_802_3_PERMANENT_ADDRESS), | ||
423 | 48, (void **) &bp, &reply_len); | 425 | 48, (void **) &bp, &reply_len); |
424 | if (unlikely(retval< 0)) { | 426 | if (unlikely(retval< 0)) { |
425 | dev_err(&intf->dev, "rndis get ethaddr, %d\n", retval); | 427 | dev_err(&intf->dev, "rndis get ethaddr, %d\n", retval); |
@@ -430,12 +432,12 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags) | |||
430 | 432 | ||
431 | /* set a nonzero filter to enable data transfers */ | 433 | /* set a nonzero filter to enable data transfers */ |
432 | memset(u.set, 0, sizeof *u.set); | 434 | memset(u.set, 0, sizeof *u.set); |
433 | u.set->msg_type = RNDIS_MSG_SET; | 435 | u.set->msg_type = cpu_to_le32(RNDIS_MSG_SET); |
434 | u.set->msg_len = cpu_to_le32(4 + sizeof *u.set); | 436 | u.set->msg_len = cpu_to_le32(4 + sizeof *u.set); |
435 | u.set->oid = OID_GEN_CURRENT_PACKET_FILTER; | 437 | u.set->oid = cpu_to_le32(OID_GEN_CURRENT_PACKET_FILTER); |
436 | u.set->len = cpu_to_le32(4); | 438 | u.set->len = cpu_to_le32(4); |
437 | u.set->offset = cpu_to_le32((sizeof *u.set) - 8); | 439 | u.set->offset = cpu_to_le32((sizeof *u.set) - 8); |
438 | *(__le32 *)(u.buf + sizeof *u.set) = RNDIS_DEFAULT_FILTER; | 440 | *(__le32 *)(u.buf + sizeof *u.set) = cpu_to_le32(RNDIS_DEFAULT_FILTER); |
439 | 441 | ||
440 | retval = rndis_command(dev, u.header, CONTROL_BUFFER_SIZE); | 442 | retval = rndis_command(dev, u.header, CONTROL_BUFFER_SIZE); |
441 | if (unlikely(retval < 0)) { | 443 | if (unlikely(retval < 0)) { |
@@ -450,7 +452,7 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags) | |||
450 | 452 | ||
451 | halt_fail_and_release: | 453 | halt_fail_and_release: |
452 | memset(u.halt, 0, sizeof *u.halt); | 454 | memset(u.halt, 0, sizeof *u.halt); |
453 | u.halt->msg_type = RNDIS_MSG_HALT; | 455 | u.halt->msg_type = cpu_to_le32(RNDIS_MSG_HALT); |
454 | u.halt->msg_len = cpu_to_le32(sizeof *u.halt); | 456 | u.halt->msg_len = cpu_to_le32(sizeof *u.halt); |
455 | (void) rndis_command(dev, (void *)u.halt, CONTROL_BUFFER_SIZE); | 457 | (void) rndis_command(dev, (void *)u.halt, CONTROL_BUFFER_SIZE); |
456 | fail_and_release: | 458 | fail_and_release: |
@@ -475,7 +477,7 @@ void rndis_unbind(struct usbnet *dev, struct usb_interface *intf) | |||
475 | /* try to clear any rndis state/activity (no i/o from stack!) */ | 477 | /* try to clear any rndis state/activity (no i/o from stack!) */ |
476 | halt = kzalloc(CONTROL_BUFFER_SIZE, GFP_KERNEL); | 478 | halt = kzalloc(CONTROL_BUFFER_SIZE, GFP_KERNEL); |
477 | if (halt) { | 479 | if (halt) { |
478 | halt->msg_type = RNDIS_MSG_HALT; | 480 | halt->msg_type = cpu_to_le32(RNDIS_MSG_HALT); |
479 | halt->msg_len = cpu_to_le32(sizeof *halt); | 481 | halt->msg_len = cpu_to_le32(sizeof *halt); |
480 | (void) rndis_command(dev, (void *)halt, CONTROL_BUFFER_SIZE); | 482 | (void) rndis_command(dev, (void *)halt, CONTROL_BUFFER_SIZE); |
481 | kfree(halt); | 483 | kfree(halt); |
@@ -501,7 +503,7 @@ int rndis_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | |||
501 | data_len = le32_to_cpu(hdr->data_len); | 503 | data_len = le32_to_cpu(hdr->data_len); |
502 | 504 | ||
503 | /* don't choke if we see oob, per-packet data, etc */ | 505 | /* don't choke if we see oob, per-packet data, etc */ |
504 | if (unlikely(hdr->msg_type != RNDIS_MSG_PACKET || | 506 | if (unlikely(hdr->msg_type != cpu_to_le32(RNDIS_MSG_PACKET) || |
505 | skb->len < msg_len || | 507 | skb->len < msg_len || |
506 | (data_offset + data_len + 8) > msg_len)) { | 508 | (data_offset + data_len + 8) > msg_len)) { |
507 | dev->net->stats.rx_frame_errors++; | 509 | dev->net->stats.rx_frame_errors++; |
@@ -569,7 +571,7 @@ rndis_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) | |||
569 | fill: | 571 | fill: |
570 | hdr = (void *) __skb_push(skb, sizeof *hdr); | 572 | hdr = (void *) __skb_push(skb, sizeof *hdr); |
571 | memset(hdr, 0, sizeof *hdr); | 573 | memset(hdr, 0, sizeof *hdr); |
572 | hdr->msg_type = RNDIS_MSG_PACKET; | 574 | hdr->msg_type = cpu_to_le32(RNDIS_MSG_PACKET); |
573 | hdr->msg_len = cpu_to_le32(skb->len); | 575 | hdr->msg_len = cpu_to_le32(skb->len); |
574 | hdr->data_offset = cpu_to_le32(sizeof(*hdr) - 8); | 576 | hdr->data_offset = cpu_to_le32(sizeof(*hdr) - 8); |
575 | hdr->data_len = cpu_to_le32(len); | 577 | hdr->data_len = cpu_to_le32(len); |