diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-06-27 14:28:02 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-06-27 14:28:02 -0400 |
| commit | 31cafd958932a90174118ad062fdc37ffb6bf31c (patch) | |
| tree | 21f04c11d9e759c1f65cfaa1e4fbd79ee1e60753 | |
| parent | e7865c234fff2db474f21a62b2f906a70317c972 (diff) | |
| parent | e2f5b04563786d4b7d7648868de7e941a0649372 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (52 commits)
phylib: Add autoload support for the LXT973 phy.
ISDN: hysdn, fix potential NULL dereference
vxge: fix memory leak in vxge_alloc_msix() error path
isdn/gigaset: correct CAPI connection state storage
isdn/gigaset: encode HLC and BC together
isdn/gigaset: correct CAPI DATA_B3 Delivery Confirmation
isdn/gigaset: correct CAPI voice connection encoding
isdn/gigaset: honor CAPI application's buffer size request
cpmac: do not leak struct net_device on phy_connect errors
smc91c92_cs: fix the problem that lan & modem does not work simultaneously
ipv6: fix NULL reference in proxy neighbor discovery
Bluetooth: Bring back var 'i' increment
xfrm: check bundle policy existance before dereferencing it
sky2: enable rx/tx in sky2_phy_reinit()
cnic: Disable statistics initialization for eth clients that do not support statistics
net: add dependency on fw class module to qlcnic and netxen_nic
snmp: fix SNMP_ADD_STATS()
hso: remove setting of low_latency flag
udp: Fix bogus UFO packet generation
lasi82596: fix netdev_mc_count conversion
...
56 files changed, 617 insertions, 380 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 78758e12a810..6c73b3bc7f34 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -2985,20 +2985,14 @@ F: drivers/net/ixgb/ | |||
| 2985 | F: drivers/net/ixgbe/ | 2985 | F: drivers/net/ixgbe/ |
| 2986 | 2986 | ||
| 2987 | INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT | 2987 | INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT |
| 2988 | M: Reinette Chatre <reinette.chatre@intel.com> | ||
| 2989 | M: Intel Linux Wireless <ilw@linux.intel.com> | ||
| 2990 | L: linux-wireless@vger.kernel.org | 2988 | L: linux-wireless@vger.kernel.org |
| 2991 | W: http://ipw2100.sourceforge.net | 2989 | S: Orphan |
| 2992 | S: Odd Fixes | ||
| 2993 | F: Documentation/networking/README.ipw2100 | 2990 | F: Documentation/networking/README.ipw2100 |
| 2994 | F: drivers/net/wireless/ipw2x00/ipw2100.* | 2991 | F: drivers/net/wireless/ipw2x00/ipw2100.* |
| 2995 | 2992 | ||
| 2996 | INTEL PRO/WIRELESS 2915ABG NETWORK CONNECTION SUPPORT | 2993 | INTEL PRO/WIRELESS 2915ABG NETWORK CONNECTION SUPPORT |
| 2997 | M: Reinette Chatre <reinette.chatre@intel.com> | ||
| 2998 | M: Intel Linux Wireless <ilw@linux.intel.com> | ||
| 2999 | L: linux-wireless@vger.kernel.org | 2994 | L: linux-wireless@vger.kernel.org |
| 3000 | W: http://ipw2200.sourceforge.net | 2995 | S: Orphan |
| 3001 | S: Odd Fixes | ||
| 3002 | F: Documentation/networking/README.ipw2200 | 2996 | F: Documentation/networking/README.ipw2200 |
| 3003 | F: drivers/net/wireless/ipw2x00/ipw2200.* | 2997 | F: drivers/net/wireless/ipw2x00/ipw2200.* |
| 3004 | 2998 | ||
diff --git a/drivers/isdn/gigaset/asyncdata.c b/drivers/isdn/gigaset/asyncdata.c index c5016bd2d94f..c3b1dc3a13a0 100644 --- a/drivers/isdn/gigaset/asyncdata.c +++ b/drivers/isdn/gigaset/asyncdata.c | |||
| @@ -126,26 +126,6 @@ static unsigned lock_loop(unsigned numbytes, struct inbuf_t *inbuf) | |||
| 126 | return numbytes; | 126 | return numbytes; |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | /* set up next receive skb for data mode | ||
| 130 | */ | ||
| 131 | static void new_rcv_skb(struct bc_state *bcs) | ||
| 132 | { | ||
| 133 | struct cardstate *cs = bcs->cs; | ||
| 134 | unsigned short hw_hdr_len = cs->hw_hdr_len; | ||
| 135 | |||
| 136 | if (bcs->ignore) { | ||
| 137 | bcs->skb = NULL; | ||
| 138 | return; | ||
| 139 | } | ||
| 140 | |||
| 141 | bcs->skb = dev_alloc_skb(SBUFSIZE + hw_hdr_len); | ||
| 142 | if (bcs->skb == NULL) { | ||
| 143 | dev_warn(cs->dev, "could not allocate new skb\n"); | ||
| 144 | return; | ||
| 145 | } | ||
| 146 | skb_reserve(bcs->skb, hw_hdr_len); | ||
| 147 | } | ||
| 148 | |||
| 149 | /* process a block of received bytes in HDLC data mode | 129 | /* process a block of received bytes in HDLC data mode |
| 150 | * (mstate != MS_LOCKED && !(inputstate & INS_command) && proto2 == L2_HDLC) | 130 | * (mstate != MS_LOCKED && !(inputstate & INS_command) && proto2 == L2_HDLC) |
| 151 | * Collect HDLC frames, undoing byte stuffing and watching for DLE escapes. | 131 | * Collect HDLC frames, undoing byte stuffing and watching for DLE escapes. |
| @@ -159,8 +139,8 @@ static unsigned hdlc_loop(unsigned numbytes, struct inbuf_t *inbuf) | |||
| 159 | struct cardstate *cs = inbuf->cs; | 139 | struct cardstate *cs = inbuf->cs; |
| 160 | struct bc_state *bcs = cs->bcs; | 140 | struct bc_state *bcs = cs->bcs; |
| 161 | int inputstate = bcs->inputstate; | 141 | int inputstate = bcs->inputstate; |
| 162 | __u16 fcs = bcs->fcs; | 142 | __u16 fcs = bcs->rx_fcs; |
| 163 | struct sk_buff *skb = bcs->skb; | 143 | struct sk_buff *skb = bcs->rx_skb; |
| 164 | unsigned char *src = inbuf->data + inbuf->head; | 144 | unsigned char *src = inbuf->data + inbuf->head; |
| 165 | unsigned procbytes = 0; | 145 | unsigned procbytes = 0; |
| 166 | unsigned char c; | 146 | unsigned char c; |
| @@ -245,8 +225,7 @@ byte_stuff: | |||
| 245 | 225 | ||
| 246 | /* prepare reception of next frame */ | 226 | /* prepare reception of next frame */ |
| 247 | inputstate &= ~INS_have_data; | 227 | inputstate &= ~INS_have_data; |
| 248 | new_rcv_skb(bcs); | 228 | skb = gigaset_new_rx_skb(bcs); |
| 249 | skb = bcs->skb; | ||
| 250 | } else { | 229 | } else { |
| 251 | /* empty frame (7E 7E) */ | 230 | /* empty frame (7E 7E) */ |
| 252 | #ifdef CONFIG_GIGASET_DEBUG | 231 | #ifdef CONFIG_GIGASET_DEBUG |
| @@ -255,8 +234,7 @@ byte_stuff: | |||
| 255 | if (!skb) { | 234 | if (!skb) { |
| 256 | /* skipped (?) */ | 235 | /* skipped (?) */ |
| 257 | gigaset_isdn_rcv_err(bcs); | 236 | gigaset_isdn_rcv_err(bcs); |
| 258 | new_rcv_skb(bcs); | 237 | skb = gigaset_new_rx_skb(bcs); |
| 259 | skb = bcs->skb; | ||
| 260 | } | 238 | } |
| 261 | } | 239 | } |
| 262 | 240 | ||
| @@ -279,11 +257,11 @@ byte_stuff: | |||
| 279 | #endif | 257 | #endif |
| 280 | inputstate |= INS_have_data; | 258 | inputstate |= INS_have_data; |
| 281 | if (skb) { | 259 | if (skb) { |
| 282 | if (skb->len == SBUFSIZE) { | 260 | if (skb->len >= bcs->rx_bufsize) { |
| 283 | dev_warn(cs->dev, "received packet too long\n"); | 261 | dev_warn(cs->dev, "received packet too long\n"); |
| 284 | dev_kfree_skb_any(skb); | 262 | dev_kfree_skb_any(skb); |
| 285 | /* skip remainder of packet */ | 263 | /* skip remainder of packet */ |
| 286 | bcs->skb = skb = NULL; | 264 | bcs->rx_skb = skb = NULL; |
| 287 | } else { | 265 | } else { |
| 288 | *__skb_put(skb, 1) = c; | 266 | *__skb_put(skb, 1) = c; |
| 289 | fcs = crc_ccitt_byte(fcs, c); | 267 | fcs = crc_ccitt_byte(fcs, c); |
| @@ -292,7 +270,7 @@ byte_stuff: | |||
| 292 | } | 270 | } |
| 293 | 271 | ||
| 294 | bcs->inputstate = inputstate; | 272 | bcs->inputstate = inputstate; |
| 295 | bcs->fcs = fcs; | 273 | bcs->rx_fcs = fcs; |
| 296 | return procbytes; | 274 | return procbytes; |
| 297 | } | 275 | } |
| 298 | 276 | ||
| @@ -308,18 +286,18 @@ static unsigned iraw_loop(unsigned numbytes, struct inbuf_t *inbuf) | |||
| 308 | struct cardstate *cs = inbuf->cs; | 286 | struct cardstate *cs = inbuf->cs; |
| 309 | struct bc_state *bcs = cs->bcs; | 287 | struct bc_state *bcs = cs->bcs; |
| 310 | int inputstate = bcs->inputstate; | 288 | int inputstate = bcs->inputstate; |
| 311 | struct sk_buff *skb = bcs->skb; | 289 | struct sk_buff *skb = bcs->rx_skb; |
| 312 | unsigned char *src = inbuf->data + inbuf->head; | 290 | unsigned char *src = inbuf->data + inbuf->head; |
| 313 | unsigned procbytes = 0; | 291 | unsigned procbytes = 0; |
| 314 | unsigned char c; | 292 | unsigned char c; |
| 315 | 293 | ||
| 316 | if (!skb) { | 294 | if (!skb) { |
| 317 | /* skip this block */ | 295 | /* skip this block */ |
| 318 | new_rcv_skb(bcs); | 296 | gigaset_new_rx_skb(bcs); |
| 319 | return numbytes; | 297 | return numbytes; |
| 320 | } | 298 | } |
| 321 | 299 | ||
| 322 | while (procbytes < numbytes && skb->len < SBUFSIZE) { | 300 | while (procbytes < numbytes && skb->len < bcs->rx_bufsize) { |
| 323 | c = *src++; | 301 | c = *src++; |
| 324 | procbytes++; | 302 | procbytes++; |
| 325 | 303 | ||
| @@ -343,7 +321,7 @@ static unsigned iraw_loop(unsigned numbytes, struct inbuf_t *inbuf) | |||
| 343 | if (inputstate & INS_have_data) { | 321 | if (inputstate & INS_have_data) { |
| 344 | gigaset_skb_rcvd(bcs, skb); | 322 | gigaset_skb_rcvd(bcs, skb); |
| 345 | inputstate &= ~INS_have_data; | 323 | inputstate &= ~INS_have_data; |
| 346 | new_rcv_skb(bcs); | 324 | gigaset_new_rx_skb(bcs); |
| 347 | } | 325 | } |
| 348 | 326 | ||
| 349 | bcs->inputstate = inputstate; | 327 | bcs->inputstate = inputstate; |
diff --git a/drivers/isdn/gigaset/capi.c b/drivers/isdn/gigaset/capi.c index 8f78f15c8ef7..6fbe8999c419 100644 --- a/drivers/isdn/gigaset/capi.c +++ b/drivers/isdn/gigaset/capi.c | |||
| @@ -70,7 +70,7 @@ | |||
| 70 | #define MAX_NUMBER_DIGITS 20 | 70 | #define MAX_NUMBER_DIGITS 20 |
| 71 | #define MAX_FMT_IE_LEN 20 | 71 | #define MAX_FMT_IE_LEN 20 |
| 72 | 72 | ||
| 73 | /* values for gigaset_capi_appl.connected */ | 73 | /* values for bcs->apconnstate */ |
| 74 | #define APCONN_NONE 0 /* inactive/listening */ | 74 | #define APCONN_NONE 0 /* inactive/listening */ |
| 75 | #define APCONN_SETUP 1 /* connecting */ | 75 | #define APCONN_SETUP 1 /* connecting */ |
| 76 | #define APCONN_ACTIVE 2 /* B channel up */ | 76 | #define APCONN_ACTIVE 2 /* B channel up */ |
| @@ -80,10 +80,10 @@ struct gigaset_capi_appl { | |||
| 80 | struct list_head ctrlist; | 80 | struct list_head ctrlist; |
| 81 | struct gigaset_capi_appl *bcnext; | 81 | struct gigaset_capi_appl *bcnext; |
| 82 | u16 id; | 82 | u16 id; |
| 83 | struct capi_register_params rp; | ||
| 83 | u16 nextMessageNumber; | 84 | u16 nextMessageNumber; |
| 84 | u32 listenInfoMask; | 85 | u32 listenInfoMask; |
| 85 | u32 listenCIPmask; | 86 | u32 listenCIPmask; |
| 86 | int connected; | ||
| 87 | }; | 87 | }; |
| 88 | 88 | ||
| 89 | /* CAPI specific controller data structure */ | 89 | /* CAPI specific controller data structure */ |
| @@ -319,6 +319,39 @@ static const char *format_ie(const char *ie) | |||
| 319 | return result; | 319 | return result; |
| 320 | } | 320 | } |
| 321 | 321 | ||
| 322 | /* | ||
| 323 | * emit DATA_B3_CONF message | ||
| 324 | */ | ||
| 325 | static void send_data_b3_conf(struct cardstate *cs, struct capi_ctr *ctr, | ||
| 326 | u16 appl, u16 msgid, int channel, | ||
| 327 | u16 handle, u16 info) | ||
| 328 | { | ||
| 329 | struct sk_buff *cskb; | ||
| 330 | u8 *msg; | ||
| 331 | |||
| 332 | cskb = alloc_skb(CAPI_DATA_B3_CONF_LEN, GFP_ATOMIC); | ||
| 333 | if (!cskb) { | ||
| 334 | dev_err(cs->dev, "%s: out of memory\n", __func__); | ||
| 335 | return; | ||
| 336 | } | ||
| 337 | /* frequent message, avoid _cmsg overhead */ | ||
| 338 | msg = __skb_put(cskb, CAPI_DATA_B3_CONF_LEN); | ||
| 339 | CAPIMSG_SETLEN(msg, CAPI_DATA_B3_CONF_LEN); | ||
| 340 | CAPIMSG_SETAPPID(msg, appl); | ||
| 341 | CAPIMSG_SETCOMMAND(msg, CAPI_DATA_B3); | ||
| 342 | CAPIMSG_SETSUBCOMMAND(msg, CAPI_CONF); | ||
| 343 | CAPIMSG_SETMSGID(msg, msgid); | ||
| 344 | CAPIMSG_SETCONTROLLER(msg, ctr->cnr); | ||
| 345 | CAPIMSG_SETPLCI_PART(msg, channel); | ||
| 346 | CAPIMSG_SETNCCI_PART(msg, 1); | ||
| 347 | CAPIMSG_SETHANDLE_CONF(msg, handle); | ||
| 348 | CAPIMSG_SETINFO_CONF(msg, info); | ||
| 349 | |||
| 350 | /* emit message */ | ||
| 351 | dump_rawmsg(DEBUG_MCMD, __func__, msg); | ||
| 352 | capi_ctr_handle_message(ctr, appl, cskb); | ||
| 353 | } | ||
| 354 | |||
| 322 | 355 | ||
| 323 | /* | 356 | /* |
| 324 | * driver interface functions | 357 | * driver interface functions |
| @@ -339,7 +372,6 @@ void gigaset_skb_sent(struct bc_state *bcs, struct sk_buff *dskb) | |||
| 339 | struct gigaset_capi_ctr *iif = cs->iif; | 372 | struct gigaset_capi_ctr *iif = cs->iif; |
| 340 | struct gigaset_capi_appl *ap = bcs->ap; | 373 | struct gigaset_capi_appl *ap = bcs->ap; |
| 341 | unsigned char *req = skb_mac_header(dskb); | 374 | unsigned char *req = skb_mac_header(dskb); |
| 342 | struct sk_buff *cskb; | ||
| 343 | u16 flags; | 375 | u16 flags; |
| 344 | 376 | ||
| 345 | /* update statistics */ | 377 | /* update statistics */ |
| @@ -351,39 +383,22 @@ void gigaset_skb_sent(struct bc_state *bcs, struct sk_buff *dskb) | |||
| 351 | } | 383 | } |
| 352 | 384 | ||
| 353 | /* don't send further B3 messages if disconnected */ | 385 | /* don't send further B3 messages if disconnected */ |
| 354 | if (ap->connected < APCONN_ACTIVE) { | 386 | if (bcs->apconnstate < APCONN_ACTIVE) { |
| 355 | gig_dbg(DEBUG_LLDATA, "disconnected, discarding ack"); | 387 | gig_dbg(DEBUG_LLDATA, "disconnected, discarding ack"); |
| 356 | return; | 388 | return; |
| 357 | } | 389 | } |
| 358 | 390 | ||
| 359 | /* ToDo: honor unset "delivery confirmation" bit */ | 391 | /* |
| 392 | * send DATA_B3_CONF if "delivery confirmation" bit was set in request; | ||
| 393 | * otherwise it has already been sent by do_data_b3_req() | ||
| 394 | */ | ||
| 360 | flags = CAPIMSG_FLAGS(req); | 395 | flags = CAPIMSG_FLAGS(req); |
| 361 | 396 | if (flags & CAPI_FLAGS_DELIVERY_CONFIRMATION) | |
| 362 | /* build DATA_B3_CONF message */ | 397 | send_data_b3_conf(cs, &iif->ctr, ap->id, CAPIMSG_MSGID(req), |
| 363 | cskb = alloc_skb(CAPI_DATA_B3_CONF_LEN, GFP_ATOMIC); | 398 | bcs->channel + 1, CAPIMSG_HANDLE_REQ(req), |
| 364 | if (!cskb) { | 399 | (flags & ~CAPI_FLAGS_DELIVERY_CONFIRMATION) ? |
| 365 | dev_err(cs->dev, "%s: out of memory\n", __func__); | 400 | CapiFlagsNotSupportedByProtocol : |
| 366 | return; | 401 | CAPI_NOERROR); |
| 367 | } | ||
| 368 | /* frequent message, avoid _cmsg overhead */ | ||
| 369 | CAPIMSG_SETLEN(cskb->data, CAPI_DATA_B3_CONF_LEN); | ||
| 370 | CAPIMSG_SETAPPID(cskb->data, ap->id); | ||
| 371 | CAPIMSG_SETCOMMAND(cskb->data, CAPI_DATA_B3); | ||
| 372 | CAPIMSG_SETSUBCOMMAND(cskb->data, CAPI_CONF); | ||
| 373 | CAPIMSG_SETMSGID(cskb->data, CAPIMSG_MSGID(req)); | ||
| 374 | CAPIMSG_SETCONTROLLER(cskb->data, iif->ctr.cnr); | ||
| 375 | CAPIMSG_SETPLCI_PART(cskb->data, bcs->channel + 1); | ||
| 376 | CAPIMSG_SETNCCI_PART(cskb->data, 1); | ||
| 377 | CAPIMSG_SETHANDLE_CONF(cskb->data, CAPIMSG_HANDLE_REQ(req)); | ||
| 378 | if (flags & ~CAPI_FLAGS_DELIVERY_CONFIRMATION) | ||
| 379 | CAPIMSG_SETINFO_CONF(cskb->data, | ||
| 380 | CapiFlagsNotSupportedByProtocol); | ||
| 381 | else | ||
| 382 | CAPIMSG_SETINFO_CONF(cskb->data, CAPI_NOERROR); | ||
| 383 | |||
| 384 | /* emit message */ | ||
| 385 | dump_rawmsg(DEBUG_LLDATA, "DATA_B3_CONF", cskb->data); | ||
| 386 | capi_ctr_handle_message(&iif->ctr, ap->id, cskb); | ||
| 387 | } | 402 | } |
| 388 | EXPORT_SYMBOL_GPL(gigaset_skb_sent); | 403 | EXPORT_SYMBOL_GPL(gigaset_skb_sent); |
| 389 | 404 | ||
| @@ -412,7 +427,7 @@ void gigaset_skb_rcvd(struct bc_state *bcs, struct sk_buff *skb) | |||
| 412 | } | 427 | } |
| 413 | 428 | ||
| 414 | /* don't send further B3 messages if disconnected */ | 429 | /* don't send further B3 messages if disconnected */ |
| 415 | if (ap->connected < APCONN_ACTIVE) { | 430 | if (bcs->apconnstate < APCONN_ACTIVE) { |
| 416 | gig_dbg(DEBUG_LLDATA, "disconnected, discarding data"); | 431 | gig_dbg(DEBUG_LLDATA, "disconnected, discarding data"); |
| 417 | dev_kfree_skb_any(skb); | 432 | dev_kfree_skb_any(skb); |
| 418 | return; | 433 | return; |
| @@ -484,6 +499,7 @@ int gigaset_isdn_icall(struct at_state_t *at_state) | |||
| 484 | u32 actCIPmask; | 499 | u32 actCIPmask; |
| 485 | struct sk_buff *skb; | 500 | struct sk_buff *skb; |
| 486 | unsigned int msgsize; | 501 | unsigned int msgsize; |
| 502 | unsigned long flags; | ||
| 487 | int i; | 503 | int i; |
| 488 | 504 | ||
| 489 | /* | 505 | /* |
| @@ -608,7 +624,14 @@ int gigaset_isdn_icall(struct at_state_t *at_state) | |||
| 608 | format_ie(iif->hcmsg.CalledPartyNumber)); | 624 | format_ie(iif->hcmsg.CalledPartyNumber)); |
| 609 | 625 | ||
| 610 | /* scan application list for matching listeners */ | 626 | /* scan application list for matching listeners */ |
| 611 | bcs->ap = NULL; | 627 | spin_lock_irqsave(&bcs->aplock, flags); |
| 628 | if (bcs->ap != NULL || bcs->apconnstate != APCONN_NONE) { | ||
| 629 | dev_warn(cs->dev, "%s: channel not properly cleared (%p/%d)\n", | ||
| 630 | __func__, bcs->ap, bcs->apconnstate); | ||
| 631 | bcs->ap = NULL; | ||
| 632 | bcs->apconnstate = APCONN_NONE; | ||
| 633 | } | ||
| 634 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 612 | actCIPmask = 1 | (1 << iif->hcmsg.CIPValue); | 635 | actCIPmask = 1 | (1 << iif->hcmsg.CIPValue); |
| 613 | list_for_each_entry(ap, &iif->appls, ctrlist) | 636 | list_for_each_entry(ap, &iif->appls, ctrlist) |
| 614 | if (actCIPmask & ap->listenCIPmask) { | 637 | if (actCIPmask & ap->listenCIPmask) { |
| @@ -626,10 +649,12 @@ int gigaset_isdn_icall(struct at_state_t *at_state) | |||
| 626 | dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); | 649 | dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); |
| 627 | 650 | ||
| 628 | /* add to listeners on this B channel, update state */ | 651 | /* add to listeners on this B channel, update state */ |
| 652 | spin_lock_irqsave(&bcs->aplock, flags); | ||
| 629 | ap->bcnext = bcs->ap; | 653 | ap->bcnext = bcs->ap; |
| 630 | bcs->ap = ap; | 654 | bcs->ap = ap; |
| 631 | bcs->chstate |= CHS_NOTIFY_LL; | 655 | bcs->chstate |= CHS_NOTIFY_LL; |
| 632 | ap->connected = APCONN_SETUP; | 656 | bcs->apconnstate = APCONN_SETUP; |
| 657 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 633 | 658 | ||
| 634 | /* emit message */ | 659 | /* emit message */ |
| 635 | capi_ctr_handle_message(&iif->ctr, ap->id, skb); | 660 | capi_ctr_handle_message(&iif->ctr, ap->id, skb); |
| @@ -654,7 +679,7 @@ static void send_disconnect_ind(struct bc_state *bcs, | |||
| 654 | struct gigaset_capi_ctr *iif = cs->iif; | 679 | struct gigaset_capi_ctr *iif = cs->iif; |
| 655 | struct sk_buff *skb; | 680 | struct sk_buff *skb; |
| 656 | 681 | ||
| 657 | if (ap->connected == APCONN_NONE) | 682 | if (bcs->apconnstate == APCONN_NONE) |
| 658 | return; | 683 | return; |
| 659 | 684 | ||
| 660 | capi_cmsg_header(&iif->hcmsg, ap->id, CAPI_DISCONNECT, CAPI_IND, | 685 | capi_cmsg_header(&iif->hcmsg, ap->id, CAPI_DISCONNECT, CAPI_IND, |
| @@ -668,7 +693,6 @@ static void send_disconnect_ind(struct bc_state *bcs, | |||
| 668 | } | 693 | } |
| 669 | capi_cmsg2message(&iif->hcmsg, __skb_put(skb, CAPI_DISCONNECT_IND_LEN)); | 694 | capi_cmsg2message(&iif->hcmsg, __skb_put(skb, CAPI_DISCONNECT_IND_LEN)); |
| 670 | dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); | 695 | dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); |
| 671 | ap->connected = APCONN_NONE; | ||
| 672 | capi_ctr_handle_message(&iif->ctr, ap->id, skb); | 696 | capi_ctr_handle_message(&iif->ctr, ap->id, skb); |
| 673 | } | 697 | } |
| 674 | 698 | ||
| @@ -685,9 +709,9 @@ static void send_disconnect_b3_ind(struct bc_state *bcs, | |||
| 685 | struct sk_buff *skb; | 709 | struct sk_buff *skb; |
| 686 | 710 | ||
| 687 | /* nothing to do if no logical connection active */ | 711 | /* nothing to do if no logical connection active */ |
| 688 | if (ap->connected < APCONN_ACTIVE) | 712 | if (bcs->apconnstate < APCONN_ACTIVE) |
| 689 | return; | 713 | return; |
| 690 | ap->connected = APCONN_SETUP; | 714 | bcs->apconnstate = APCONN_SETUP; |
| 691 | 715 | ||
| 692 | capi_cmsg_header(&iif->hcmsg, ap->id, CAPI_DISCONNECT_B3, CAPI_IND, | 716 | capi_cmsg_header(&iif->hcmsg, ap->id, CAPI_DISCONNECT_B3, CAPI_IND, |
| 693 | ap->nextMessageNumber++, | 717 | ap->nextMessageNumber++, |
| @@ -714,14 +738,25 @@ void gigaset_isdn_connD(struct bc_state *bcs) | |||
| 714 | { | 738 | { |
| 715 | struct cardstate *cs = bcs->cs; | 739 | struct cardstate *cs = bcs->cs; |
| 716 | struct gigaset_capi_ctr *iif = cs->iif; | 740 | struct gigaset_capi_ctr *iif = cs->iif; |
| 717 | struct gigaset_capi_appl *ap = bcs->ap; | 741 | struct gigaset_capi_appl *ap; |
| 718 | struct sk_buff *skb; | 742 | struct sk_buff *skb; |
| 719 | unsigned int msgsize; | 743 | unsigned int msgsize; |
| 744 | unsigned long flags; | ||
| 720 | 745 | ||
| 746 | spin_lock_irqsave(&bcs->aplock, flags); | ||
| 747 | ap = bcs->ap; | ||
| 721 | if (!ap) { | 748 | if (!ap) { |
| 749 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 722 | dev_err(cs->dev, "%s: no application\n", __func__); | 750 | dev_err(cs->dev, "%s: no application\n", __func__); |
| 723 | return; | 751 | return; |
| 724 | } | 752 | } |
| 753 | if (bcs->apconnstate == APCONN_NONE) { | ||
| 754 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 755 | dev_warn(cs->dev, "%s: application %u not connected\n", | ||
| 756 | __func__, ap->id); | ||
| 757 | return; | ||
| 758 | } | ||
| 759 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 725 | while (ap->bcnext) { | 760 | while (ap->bcnext) { |
| 726 | /* this should never happen */ | 761 | /* this should never happen */ |
| 727 | dev_warn(cs->dev, "%s: dropping extra application %u\n", | 762 | dev_warn(cs->dev, "%s: dropping extra application %u\n", |
| @@ -730,11 +765,6 @@ void gigaset_isdn_connD(struct bc_state *bcs) | |||
| 730 | CapiCallGivenToOtherApplication); | 765 | CapiCallGivenToOtherApplication); |
| 731 | ap->bcnext = ap->bcnext->bcnext; | 766 | ap->bcnext = ap->bcnext->bcnext; |
| 732 | } | 767 | } |
| 733 | if (ap->connected == APCONN_NONE) { | ||
| 734 | dev_warn(cs->dev, "%s: application %u not connected\n", | ||
| 735 | __func__, ap->id); | ||
| 736 | return; | ||
| 737 | } | ||
| 738 | 768 | ||
| 739 | /* prepare CONNECT_ACTIVE_IND message | 769 | /* prepare CONNECT_ACTIVE_IND message |
| 740 | * Note: LLC not supported by device | 770 | * Note: LLC not supported by device |
| @@ -772,17 +802,24 @@ void gigaset_isdn_connD(struct bc_state *bcs) | |||
| 772 | void gigaset_isdn_hupD(struct bc_state *bcs) | 802 | void gigaset_isdn_hupD(struct bc_state *bcs) |
| 773 | { | 803 | { |
| 774 | struct gigaset_capi_appl *ap; | 804 | struct gigaset_capi_appl *ap; |
| 805 | unsigned long flags; | ||
| 775 | 806 | ||
| 776 | /* | 807 | /* |
| 777 | * ToDo: pass on reason code reported by device | 808 | * ToDo: pass on reason code reported by device |
| 778 | * (requires ev-layer state machine extension to collect | 809 | * (requires ev-layer state machine extension to collect |
| 779 | * ZCAU device reply) | 810 | * ZCAU device reply) |
| 780 | */ | 811 | */ |
| 781 | for (ap = bcs->ap; ap != NULL; ap = ap->bcnext) { | 812 | spin_lock_irqsave(&bcs->aplock, flags); |
| 813 | while (bcs->ap != NULL) { | ||
| 814 | ap = bcs->ap; | ||
| 815 | bcs->ap = ap->bcnext; | ||
| 816 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 782 | send_disconnect_b3_ind(bcs, ap); | 817 | send_disconnect_b3_ind(bcs, ap); |
| 783 | send_disconnect_ind(bcs, ap, 0); | 818 | send_disconnect_ind(bcs, ap, 0); |
| 819 | spin_lock_irqsave(&bcs->aplock, flags); | ||
| 784 | } | 820 | } |
| 785 | bcs->ap = NULL; | 821 | bcs->apconnstate = APCONN_NONE; |
| 822 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 786 | } | 823 | } |
| 787 | 824 | ||
| 788 | /** | 825 | /** |
| @@ -796,24 +833,21 @@ void gigaset_isdn_connB(struct bc_state *bcs) | |||
| 796 | { | 833 | { |
| 797 | struct cardstate *cs = bcs->cs; | 834 | struct cardstate *cs = bcs->cs; |
| 798 | struct gigaset_capi_ctr *iif = cs->iif; | 835 | struct gigaset_capi_ctr *iif = cs->iif; |
| 799 | struct gigaset_capi_appl *ap = bcs->ap; | 836 | struct gigaset_capi_appl *ap; |
| 800 | struct sk_buff *skb; | 837 | struct sk_buff *skb; |
| 838 | unsigned long flags; | ||
| 801 | unsigned int msgsize; | 839 | unsigned int msgsize; |
| 802 | u8 command; | 840 | u8 command; |
| 803 | 841 | ||
| 842 | spin_lock_irqsave(&bcs->aplock, flags); | ||
| 843 | ap = bcs->ap; | ||
| 804 | if (!ap) { | 844 | if (!ap) { |
| 845 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 805 | dev_err(cs->dev, "%s: no application\n", __func__); | 846 | dev_err(cs->dev, "%s: no application\n", __func__); |
| 806 | return; | 847 | return; |
| 807 | } | 848 | } |
| 808 | while (ap->bcnext) { | 849 | if (!bcs->apconnstate) { |
| 809 | /* this should never happen */ | 850 | spin_unlock_irqrestore(&bcs->aplock, flags); |
| 810 | dev_warn(cs->dev, "%s: dropping extra application %u\n", | ||
| 811 | __func__, ap->bcnext->id); | ||
| 812 | send_disconnect_ind(bcs, ap->bcnext, | ||
| 813 | CapiCallGivenToOtherApplication); | ||
| 814 | ap->bcnext = ap->bcnext->bcnext; | ||
| 815 | } | ||
| 816 | if (!ap->connected) { | ||
| 817 | dev_warn(cs->dev, "%s: application %u not connected\n", | 851 | dev_warn(cs->dev, "%s: application %u not connected\n", |
| 818 | __func__, ap->id); | 852 | __func__, ap->id); |
| 819 | return; | 853 | return; |
| @@ -825,13 +859,26 @@ void gigaset_isdn_connB(struct bc_state *bcs) | |||
| 825 | * CONNECT_B3_ACTIVE_IND in reply to CONNECT_B3_RESP | 859 | * CONNECT_B3_ACTIVE_IND in reply to CONNECT_B3_RESP |
| 826 | * Parameters in both cases always: NCCI = 1, NCPI empty | 860 | * Parameters in both cases always: NCCI = 1, NCPI empty |
| 827 | */ | 861 | */ |
| 828 | if (ap->connected >= APCONN_ACTIVE) { | 862 | if (bcs->apconnstate >= APCONN_ACTIVE) { |
| 829 | command = CAPI_CONNECT_B3_ACTIVE; | 863 | command = CAPI_CONNECT_B3_ACTIVE; |
| 830 | msgsize = CAPI_CONNECT_B3_ACTIVE_IND_BASELEN; | 864 | msgsize = CAPI_CONNECT_B3_ACTIVE_IND_BASELEN; |
| 831 | } else { | 865 | } else { |
| 832 | command = CAPI_CONNECT_B3; | 866 | command = CAPI_CONNECT_B3; |
| 833 | msgsize = CAPI_CONNECT_B3_IND_BASELEN; | 867 | msgsize = CAPI_CONNECT_B3_IND_BASELEN; |
| 834 | } | 868 | } |
| 869 | bcs->apconnstate = APCONN_ACTIVE; | ||
| 870 | |||
| 871 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 872 | |||
| 873 | while (ap->bcnext) { | ||
| 874 | /* this should never happen */ | ||
| 875 | dev_warn(cs->dev, "%s: dropping extra application %u\n", | ||
| 876 | __func__, ap->bcnext->id); | ||
| 877 | send_disconnect_ind(bcs, ap->bcnext, | ||
| 878 | CapiCallGivenToOtherApplication); | ||
| 879 | ap->bcnext = ap->bcnext->bcnext; | ||
| 880 | } | ||
| 881 | |||
| 835 | capi_cmsg_header(&iif->hcmsg, ap->id, command, CAPI_IND, | 882 | capi_cmsg_header(&iif->hcmsg, ap->id, command, CAPI_IND, |
| 836 | ap->nextMessageNumber++, | 883 | ap->nextMessageNumber++, |
| 837 | iif->ctr.cnr | ((bcs->channel + 1) << 8) | (1 << 16)); | 884 | iif->ctr.cnr | ((bcs->channel + 1) << 8) | (1 << 16)); |
| @@ -842,7 +889,6 @@ void gigaset_isdn_connB(struct bc_state *bcs) | |||
| 842 | } | 889 | } |
| 843 | capi_cmsg2message(&iif->hcmsg, __skb_put(skb, msgsize)); | 890 | capi_cmsg2message(&iif->hcmsg, __skb_put(skb, msgsize)); |
| 844 | dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); | 891 | dump_cmsg(DEBUG_CMD, __func__, &iif->hcmsg); |
| 845 | ap->connected = APCONN_ACTIVE; | ||
| 846 | capi_ctr_handle_message(&iif->ctr, ap->id, skb); | 892 | capi_ctr_handle_message(&iif->ctr, ap->id, skb); |
| 847 | } | 893 | } |
| 848 | 894 | ||
| @@ -945,8 +991,64 @@ static void gigaset_register_appl(struct capi_ctr *ctr, u16 appl, | |||
| 945 | return; | 991 | return; |
| 946 | } | 992 | } |
| 947 | ap->id = appl; | 993 | ap->id = appl; |
| 994 | ap->rp = *rp; | ||
| 948 | 995 | ||
| 949 | list_add(&ap->ctrlist, &iif->appls); | 996 | list_add(&ap->ctrlist, &iif->appls); |
| 997 | dev_info(cs->dev, "application %u registered\n", ap->id); | ||
| 998 | } | ||
| 999 | |||
| 1000 | /* | ||
| 1001 | * remove CAPI application from channel | ||
| 1002 | * helper function to keep indentation levels down and stay in 80 columns | ||
| 1003 | */ | ||
| 1004 | |||
| 1005 | static inline void remove_appl_from_channel(struct bc_state *bcs, | ||
| 1006 | struct gigaset_capi_appl *ap) | ||
| 1007 | { | ||
| 1008 | struct cardstate *cs = bcs->cs; | ||
| 1009 | struct gigaset_capi_appl *bcap; | ||
| 1010 | unsigned long flags; | ||
| 1011 | int prevconnstate; | ||
| 1012 | |||
| 1013 | spin_lock_irqsave(&bcs->aplock, flags); | ||
| 1014 | bcap = bcs->ap; | ||
| 1015 | if (bcap == NULL) { | ||
| 1016 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1017 | return; | ||
| 1018 | } | ||
| 1019 | |||
| 1020 | /* check first application on channel */ | ||
| 1021 | if (bcap == ap) { | ||
| 1022 | bcs->ap = ap->bcnext; | ||
| 1023 | if (bcs->ap != NULL) { | ||
| 1024 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1025 | return; | ||
| 1026 | } | ||
| 1027 | |||
| 1028 | /* none left, clear channel state */ | ||
| 1029 | prevconnstate = bcs->apconnstate; | ||
| 1030 | bcs->apconnstate = APCONN_NONE; | ||
| 1031 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1032 | |||
| 1033 | if (prevconnstate == APCONN_ACTIVE) { | ||
| 1034 | dev_notice(cs->dev, "%s: hanging up channel %u\n", | ||
| 1035 | __func__, bcs->channel); | ||
| 1036 | gigaset_add_event(cs, &bcs->at_state, | ||
| 1037 | EV_HUP, NULL, 0, NULL); | ||
| 1038 | gigaset_schedule_event(cs); | ||
| 1039 | } | ||
| 1040 | return; | ||
| 1041 | } | ||
| 1042 | |||
| 1043 | /* check remaining list */ | ||
| 1044 | do { | ||
| 1045 | if (bcap->bcnext == ap) { | ||
| 1046 | bcap->bcnext = bcap->bcnext->bcnext; | ||
| 1047 | return; | ||
| 1048 | } | ||
| 1049 | bcap = bcap->bcnext; | ||
| 1050 | } while (bcap != NULL); | ||
| 1051 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 950 | } | 1052 | } |
| 951 | 1053 | ||
| 952 | /* | 1054 | /* |
| @@ -958,19 +1060,19 @@ static void gigaset_release_appl(struct capi_ctr *ctr, u16 appl) | |||
| 958 | = container_of(ctr, struct gigaset_capi_ctr, ctr); | 1060 | = container_of(ctr, struct gigaset_capi_ctr, ctr); |
| 959 | struct cardstate *cs = iif->ctr.driverdata; | 1061 | struct cardstate *cs = iif->ctr.driverdata; |
| 960 | struct gigaset_capi_appl *ap, *tmp; | 1062 | struct gigaset_capi_appl *ap, *tmp; |
| 1063 | unsigned ch; | ||
| 961 | 1064 | ||
| 962 | list_for_each_entry_safe(ap, tmp, &iif->appls, ctrlist) | 1065 | list_for_each_entry_safe(ap, tmp, &iif->appls, ctrlist) |
| 963 | if (ap->id == appl) { | 1066 | if (ap->id == appl) { |
| 964 | if (ap->connected != APCONN_NONE) { | 1067 | /* remove from any channels */ |
| 965 | dev_err(cs->dev, | 1068 | for (ch = 0; ch < cs->channels; ch++) |
| 966 | "%s: application %u still connected\n", | 1069 | remove_appl_from_channel(&cs->bcs[ch], ap); |
| 967 | __func__, ap->id); | 1070 | |
| 968 | /* ToDo: clear active connection */ | 1071 | /* remove from registration list */ |
| 969 | } | ||
| 970 | list_del(&ap->ctrlist); | 1072 | list_del(&ap->ctrlist); |
| 971 | kfree(ap); | 1073 | kfree(ap); |
| 1074 | dev_info(cs->dev, "application %u released\n", appl); | ||
| 972 | } | 1075 | } |
| 973 | |||
| 974 | } | 1076 | } |
| 975 | 1077 | ||
| 976 | /* | 1078 | /* |
| @@ -1149,7 +1251,8 @@ static void do_connect_req(struct gigaset_capi_ctr *iif, | |||
| 1149 | char **commands; | 1251 | char **commands; |
| 1150 | char *s; | 1252 | char *s; |
| 1151 | u8 *pp; | 1253 | u8 *pp; |
| 1152 | int i, l; | 1254 | unsigned long flags; |
| 1255 | int i, l, lbc, lhlc; | ||
| 1153 | u16 info; | 1256 | u16 info; |
| 1154 | 1257 | ||
| 1155 | /* decode message */ | 1258 | /* decode message */ |
| @@ -1164,8 +1267,18 @@ static void do_connect_req(struct gigaset_capi_ctr *iif, | |||
| 1164 | send_conf(iif, ap, skb, CapiNoPlciAvailable); | 1267 | send_conf(iif, ap, skb, CapiNoPlciAvailable); |
| 1165 | return; | 1268 | return; |
| 1166 | } | 1269 | } |
| 1270 | spin_lock_irqsave(&bcs->aplock, flags); | ||
| 1271 | if (bcs->ap != NULL || bcs->apconnstate != APCONN_NONE) | ||
| 1272 | dev_warn(cs->dev, "%s: channel not properly cleared (%p/%d)\n", | ||
| 1273 | __func__, bcs->ap, bcs->apconnstate); | ||
| 1167 | ap->bcnext = NULL; | 1274 | ap->bcnext = NULL; |
| 1168 | bcs->ap = ap; | 1275 | bcs->ap = ap; |
| 1276 | bcs->apconnstate = APCONN_SETUP; | ||
| 1277 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1278 | |||
| 1279 | bcs->rx_bufsize = ap->rp.datablklen; | ||
| 1280 | dev_kfree_skb(bcs->rx_skb); | ||
| 1281 | gigaset_new_rx_skb(bcs); | ||
| 1169 | cmsg->adr.adrPLCI |= (bcs->channel + 1) << 8; | 1282 | cmsg->adr.adrPLCI |= (bcs->channel + 1) << 8; |
| 1170 | 1283 | ||
| 1171 | /* build command table */ | 1284 | /* build command table */ |
| @@ -1273,42 +1386,59 @@ static void do_connect_req(struct gigaset_capi_ctr *iif, | |||
| 1273 | goto error; | 1386 | goto error; |
| 1274 | } | 1387 | } |
| 1275 | 1388 | ||
| 1276 | /* check/encode parameter: BC */ | 1389 | /* |
| 1277 | if (cmsg->BC && cmsg->BC[0]) { | 1390 | * check/encode parameters: BC & HLC |
| 1278 | /* explicit BC overrides CIP */ | 1391 | * must be encoded together as device doesn't accept HLC separately |
| 1279 | l = 2*cmsg->BC[0] + 7; | 1392 | * explicit parameters override values derived from CIP |
| 1393 | */ | ||
| 1394 | |||
| 1395 | /* determine lengths */ | ||
| 1396 | if (cmsg->BC && cmsg->BC[0]) /* BC specified explicitly */ | ||
| 1397 | lbc = 2*cmsg->BC[0]; | ||
| 1398 | else if (cip2bchlc[cmsg->CIPValue].bc) /* BC derived from CIP */ | ||
| 1399 | lbc = strlen(cip2bchlc[cmsg->CIPValue].bc); | ||
| 1400 | else /* no BC */ | ||
| 1401 | lbc = 0; | ||
| 1402 | if (cmsg->HLC && cmsg->HLC[0]) /* HLC specified explicitly */ | ||
| 1403 | lhlc = 2*cmsg->HLC[0]; | ||
| 1404 | else if (cip2bchlc[cmsg->CIPValue].hlc) /* HLC derived from CIP */ | ||
| 1405 | lhlc = strlen(cip2bchlc[cmsg->CIPValue].hlc); | ||
| 1406 | else /* no HLC */ | ||
| 1407 | lhlc = 0; | ||
| 1408 | |||
| 1409 | if (lbc) { | ||
| 1410 | /* have BC: allocate and assemble command string */ | ||
| 1411 | l = lbc + 7; /* "^SBC=" + value + "\r" + null byte */ | ||
| 1412 | if (lhlc) | ||
| 1413 | l += lhlc + 7; /* ";^SHLC=" + value */ | ||
| 1280 | commands[AT_BC] = kmalloc(l, GFP_KERNEL); | 1414 | commands[AT_BC] = kmalloc(l, GFP_KERNEL); |
| 1281 | if (!commands[AT_BC]) | 1415 | if (!commands[AT_BC]) |
| 1282 | goto oom; | 1416 | goto oom; |
| 1283 | strcpy(commands[AT_BC], "^SBC="); | 1417 | strcpy(commands[AT_BC], "^SBC="); |
| 1284 | decode_ie(cmsg->BC, commands[AT_BC]+5); | 1418 | if (cmsg->BC && cmsg->BC[0]) /* BC specified explicitly */ |
| 1419 | decode_ie(cmsg->BC, commands[AT_BC] + 5); | ||
| 1420 | else /* BC derived from CIP */ | ||
| 1421 | strcpy(commands[AT_BC] + 5, | ||
| 1422 | cip2bchlc[cmsg->CIPValue].bc); | ||
| 1423 | if (lhlc) { | ||
| 1424 | strcpy(commands[AT_BC] + lbc + 5, ";^SHLC="); | ||
| 1425 | if (cmsg->HLC && cmsg->HLC[0]) | ||
| 1426 | /* HLC specified explicitly */ | ||
| 1427 | decode_ie(cmsg->HLC, | ||
| 1428 | commands[AT_BC] + lbc + 12); | ||
| 1429 | else /* HLC derived from CIP */ | ||
| 1430 | strcpy(commands[AT_BC] + lbc + 12, | ||
| 1431 | cip2bchlc[cmsg->CIPValue].hlc); | ||
| 1432 | } | ||
| 1285 | strcpy(commands[AT_BC] + l - 2, "\r"); | 1433 | strcpy(commands[AT_BC] + l - 2, "\r"); |
| 1286 | } else if (cip2bchlc[cmsg->CIPValue].bc) { | 1434 | } else { |
| 1287 | l = strlen(cip2bchlc[cmsg->CIPValue].bc) + 7; | 1435 | /* no BC */ |
| 1288 | commands[AT_BC] = kmalloc(l, GFP_KERNEL); | 1436 | if (lhlc) { |
| 1289 | if (!commands[AT_BC]) | 1437 | dev_notice(cs->dev, "%s: cannot set HLC without BC\n", |
| 1290 | goto oom; | 1438 | "CONNECT_REQ"); |
| 1291 | snprintf(commands[AT_BC], l, "^SBC=%s\r", | 1439 | info = CapiIllMessageParmCoding; /* ? */ |
| 1292 | cip2bchlc[cmsg->CIPValue].bc); | 1440 | goto error; |
| 1293 | } | 1441 | } |
| 1294 | |||
| 1295 | /* check/encode parameter: HLC */ | ||
| 1296 | if (cmsg->HLC && cmsg->HLC[0]) { | ||
| 1297 | /* explicit HLC overrides CIP */ | ||
| 1298 | l = 2*cmsg->HLC[0] + 7; | ||
| 1299 | commands[AT_HLC] = kmalloc(l, GFP_KERNEL); | ||
| 1300 | if (!commands[AT_HLC]) | ||
| 1301 | goto oom; | ||
| 1302 | strcpy(commands[AT_HLC], "^SHLC="); | ||
| 1303 | decode_ie(cmsg->HLC, commands[AT_HLC]+5); | ||
| 1304 | strcpy(commands[AT_HLC] + l - 2, "\r"); | ||
| 1305 | } else if (cip2bchlc[cmsg->CIPValue].hlc) { | ||
| 1306 | l = strlen(cip2bchlc[cmsg->CIPValue].hlc) + 7; | ||
| 1307 | commands[AT_HLC] = kmalloc(l, GFP_KERNEL); | ||
| 1308 | if (!commands[AT_HLC]) | ||
| 1309 | goto oom; | ||
| 1310 | snprintf(commands[AT_HLC], l, "^SHLC=%s\r", | ||
| 1311 | cip2bchlc[cmsg->CIPValue].hlc); | ||
| 1312 | } | 1442 | } |
| 1313 | 1443 | ||
| 1314 | /* check/encode parameter: B Protocol */ | 1444 | /* check/encode parameter: B Protocol */ |
| @@ -1322,13 +1452,13 @@ static void do_connect_req(struct gigaset_capi_ctr *iif, | |||
| 1322 | bcs->proto2 = L2_HDLC; | 1452 | bcs->proto2 = L2_HDLC; |
| 1323 | break; | 1453 | break; |
| 1324 | case 1: | 1454 | case 1: |
| 1325 | bcs->proto2 = L2_BITSYNC; | 1455 | bcs->proto2 = L2_VOICE; |
| 1326 | break; | 1456 | break; |
| 1327 | default: | 1457 | default: |
| 1328 | dev_warn(cs->dev, | 1458 | dev_warn(cs->dev, |
| 1329 | "B1 Protocol %u unsupported, using Transparent\n", | 1459 | "B1 Protocol %u unsupported, using Transparent\n", |
| 1330 | cmsg->B1protocol); | 1460 | cmsg->B1protocol); |
| 1331 | bcs->proto2 = L2_BITSYNC; | 1461 | bcs->proto2 = L2_VOICE; |
| 1332 | } | 1462 | } |
| 1333 | if (cmsg->B2protocol != 1) | 1463 | if (cmsg->B2protocol != 1) |
| 1334 | dev_warn(cs->dev, | 1464 | dev_warn(cs->dev, |
| @@ -1382,7 +1512,6 @@ static void do_connect_req(struct gigaset_capi_ctr *iif, | |||
| 1382 | goto error; | 1512 | goto error; |
| 1383 | } | 1513 | } |
| 1384 | gigaset_schedule_event(cs); | 1514 | gigaset_schedule_event(cs); |
| 1385 | ap->connected = APCONN_SETUP; | ||
| 1386 | send_conf(iif, ap, skb, CapiSuccess); | 1515 | send_conf(iif, ap, skb, CapiSuccess); |
| 1387 | return; | 1516 | return; |
| 1388 | 1517 | ||
| @@ -1410,6 +1539,7 @@ static void do_connect_resp(struct gigaset_capi_ctr *iif, | |||
| 1410 | _cmsg *cmsg = &iif->acmsg; | 1539 | _cmsg *cmsg = &iif->acmsg; |
| 1411 | struct bc_state *bcs; | 1540 | struct bc_state *bcs; |
| 1412 | struct gigaset_capi_appl *oap; | 1541 | struct gigaset_capi_appl *oap; |
| 1542 | unsigned long flags; | ||
| 1413 | int channel; | 1543 | int channel; |
| 1414 | 1544 | ||
| 1415 | /* decode message */ | 1545 | /* decode message */ |
| @@ -1429,12 +1559,24 @@ static void do_connect_resp(struct gigaset_capi_ctr *iif, | |||
| 1429 | switch (cmsg->Reject) { | 1559 | switch (cmsg->Reject) { |
| 1430 | case 0: /* Accept */ | 1560 | case 0: /* Accept */ |
| 1431 | /* drop all competing applications, keep only this one */ | 1561 | /* drop all competing applications, keep only this one */ |
| 1432 | for (oap = bcs->ap; oap != NULL; oap = oap->bcnext) | 1562 | spin_lock_irqsave(&bcs->aplock, flags); |
| 1433 | if (oap != ap) | 1563 | while (bcs->ap != NULL) { |
| 1564 | oap = bcs->ap; | ||
| 1565 | bcs->ap = oap->bcnext; | ||
| 1566 | if (oap != ap) { | ||
| 1567 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1434 | send_disconnect_ind(bcs, oap, | 1568 | send_disconnect_ind(bcs, oap, |
| 1435 | CapiCallGivenToOtherApplication); | 1569 | CapiCallGivenToOtherApplication); |
| 1570 | spin_lock_irqsave(&bcs->aplock, flags); | ||
| 1571 | } | ||
| 1572 | } | ||
| 1436 | ap->bcnext = NULL; | 1573 | ap->bcnext = NULL; |
| 1437 | bcs->ap = ap; | 1574 | bcs->ap = ap; |
| 1575 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1576 | |||
| 1577 | bcs->rx_bufsize = ap->rp.datablklen; | ||
| 1578 | dev_kfree_skb(bcs->rx_skb); | ||
| 1579 | gigaset_new_rx_skb(bcs); | ||
| 1438 | bcs->chstate |= CHS_NOTIFY_LL; | 1580 | bcs->chstate |= CHS_NOTIFY_LL; |
| 1439 | 1581 | ||
| 1440 | /* check/encode B channel protocol */ | 1582 | /* check/encode B channel protocol */ |
| @@ -1448,13 +1590,13 @@ static void do_connect_resp(struct gigaset_capi_ctr *iif, | |||
| 1448 | bcs->proto2 = L2_HDLC; | 1590 | bcs->proto2 = L2_HDLC; |
| 1449 | break; | 1591 | break; |
| 1450 | case 1: | 1592 | case 1: |
| 1451 | bcs->proto2 = L2_BITSYNC; | 1593 | bcs->proto2 = L2_VOICE; |
| 1452 | break; | 1594 | break; |
| 1453 | default: | 1595 | default: |
| 1454 | dev_warn(cs->dev, | 1596 | dev_warn(cs->dev, |
| 1455 | "B1 Protocol %u unsupported, using Transparent\n", | 1597 | "B1 Protocol %u unsupported, using Transparent\n", |
| 1456 | cmsg->B1protocol); | 1598 | cmsg->B1protocol); |
| 1457 | bcs->proto2 = L2_BITSYNC; | 1599 | bcs->proto2 = L2_VOICE; |
| 1458 | } | 1600 | } |
| 1459 | if (cmsg->B2protocol != 1) | 1601 | if (cmsg->B2protocol != 1) |
| 1460 | dev_warn(cs->dev, | 1602 | dev_warn(cs->dev, |
| @@ -1502,31 +1644,45 @@ static void do_connect_resp(struct gigaset_capi_ctr *iif, | |||
| 1502 | send_disconnect_ind(bcs, ap, 0); | 1644 | send_disconnect_ind(bcs, ap, 0); |
| 1503 | 1645 | ||
| 1504 | /* remove it from the list of listening apps */ | 1646 | /* remove it from the list of listening apps */ |
| 1647 | spin_lock_irqsave(&bcs->aplock, flags); | ||
| 1505 | if (bcs->ap == ap) { | 1648 | if (bcs->ap == ap) { |
| 1506 | bcs->ap = ap->bcnext; | 1649 | bcs->ap = ap->bcnext; |
| 1507 | if (bcs->ap == NULL) | 1650 | if (bcs->ap == NULL) { |
| 1508 | /* last one: stop ev-layer hupD notifications */ | 1651 | /* last one: stop ev-layer hupD notifications */ |
| 1652 | bcs->apconnstate = APCONN_NONE; | ||
| 1509 | bcs->chstate &= ~CHS_NOTIFY_LL; | 1653 | bcs->chstate &= ~CHS_NOTIFY_LL; |
| 1654 | } | ||
| 1655 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1510 | return; | 1656 | return; |
| 1511 | } | 1657 | } |
| 1512 | for (oap = bcs->ap; oap != NULL; oap = oap->bcnext) { | 1658 | for (oap = bcs->ap; oap != NULL; oap = oap->bcnext) { |
| 1513 | if (oap->bcnext == ap) { | 1659 | if (oap->bcnext == ap) { |
| 1514 | oap->bcnext = oap->bcnext->bcnext; | 1660 | oap->bcnext = oap->bcnext->bcnext; |
| 1661 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1515 | return; | 1662 | return; |
| 1516 | } | 1663 | } |
| 1517 | } | 1664 | } |
| 1665 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1518 | dev_err(cs->dev, "%s: application %u not found\n", | 1666 | dev_err(cs->dev, "%s: application %u not found\n", |
| 1519 | __func__, ap->id); | 1667 | __func__, ap->id); |
| 1520 | return; | 1668 | return; |
| 1521 | 1669 | ||
| 1522 | default: /* Reject */ | 1670 | default: /* Reject */ |
| 1523 | /* drop all competing applications, keep only this one */ | 1671 | /* drop all competing applications, keep only this one */ |
| 1524 | for (oap = bcs->ap; oap != NULL; oap = oap->bcnext) | 1672 | spin_lock_irqsave(&bcs->aplock, flags); |
| 1525 | if (oap != ap) | 1673 | while (bcs->ap != NULL) { |
| 1674 | oap = bcs->ap; | ||
| 1675 | bcs->ap = oap->bcnext; | ||
| 1676 | if (oap != ap) { | ||
| 1677 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1526 | send_disconnect_ind(bcs, oap, | 1678 | send_disconnect_ind(bcs, oap, |
| 1527 | CapiCallGivenToOtherApplication); | 1679 | CapiCallGivenToOtherApplication); |
| 1680 | spin_lock_irqsave(&bcs->aplock, flags); | ||
| 1681 | } | ||
| 1682 | } | ||
| 1528 | ap->bcnext = NULL; | 1683 | ap->bcnext = NULL; |
| 1529 | bcs->ap = ap; | 1684 | bcs->ap = ap; |
| 1685 | spin_unlock_irqrestore(&bcs->aplock, flags); | ||
| 1530 | 1686 | ||
| 1531 | /* reject call - will trigger DISCONNECT_IND for this app */ | 1687 | /* reject call - will trigger DISCONNECT_IND for this app */ |
| 1532 | dev_info(cs->dev, "%s: Reject=%x\n", | 1688 | dev_info(cs->dev, "%s: Reject=%x\n", |
| @@ -1549,6 +1705,7 @@ static void do_connect_b3_req(struct gigaset_capi_ctr *iif, | |||
| 1549 | { | 1705 | { |
| 1550 | struct cardstate *cs = iif->ctr.driverdata; | 1706 | struct cardstate *cs = iif->ctr.driverdata; |
| 1551 | _cmsg *cmsg = &iif->acmsg; | 1707 | _cmsg *cmsg = &iif->acmsg; |
| 1708 | struct bc_state *bcs; | ||
| 1552 | int channel; | 1709 | int channel; |
| 1553 | 1710 | ||
| 1554 | /* decode message */ | 1711 | /* decode message */ |
| @@ -1563,9 +1720,10 @@ static void do_connect_b3_req(struct gigaset_capi_ctr *iif, | |||
| 1563 | send_conf(iif, ap, skb, CapiIllContrPlciNcci); | 1720 | send_conf(iif, ap, skb, CapiIllContrPlciNcci); |
| 1564 | return; | 1721 | return; |
| 1565 | } | 1722 | } |
| 1723 | bcs = &cs->bcs[channel-1]; | ||
| 1566 | 1724 | ||
| 1567 | /* mark logical connection active */ | 1725 | /* mark logical connection active */ |
| 1568 | ap->connected = APCONN_ACTIVE; | 1726 | bcs->apconnstate = APCONN_ACTIVE; |
| 1569 | 1727 | ||
| 1570 | /* build NCCI: always 1 (one B3 connection only) */ | 1728 | /* build NCCI: always 1 (one B3 connection only) */ |
| 1571 | cmsg->adr.adrNCCI |= 1 << 16; | 1729 | cmsg->adr.adrNCCI |= 1 << 16; |
| @@ -1611,7 +1769,7 @@ static void do_connect_b3_resp(struct gigaset_capi_ctr *iif, | |||
| 1611 | 1769 | ||
| 1612 | if (cmsg->Reject) { | 1770 | if (cmsg->Reject) { |
| 1613 | /* Reject: clear B3 connect received flag */ | 1771 | /* Reject: clear B3 connect received flag */ |
| 1614 | ap->connected = APCONN_SETUP; | 1772 | bcs->apconnstate = APCONN_SETUP; |
| 1615 | 1773 | ||
| 1616 | /* trigger hangup, causing eventual DISCONNECT_IND */ | 1774 | /* trigger hangup, causing eventual DISCONNECT_IND */ |
| 1617 | if (!gigaset_add_event(cs, &bcs->at_state, | 1775 | if (!gigaset_add_event(cs, &bcs->at_state, |
| @@ -1683,11 +1841,11 @@ static void do_disconnect_req(struct gigaset_capi_ctr *iif, | |||
| 1683 | } | 1841 | } |
| 1684 | 1842 | ||
| 1685 | /* skip if DISCONNECT_IND already sent */ | 1843 | /* skip if DISCONNECT_IND already sent */ |
| 1686 | if (!ap->connected) | 1844 | if (!bcs->apconnstate) |
| 1687 | return; | 1845 | return; |
| 1688 | 1846 | ||
| 1689 | /* check for active logical connection */ | 1847 | /* check for active logical connection */ |
| 1690 | if (ap->connected >= APCONN_ACTIVE) { | 1848 | if (bcs->apconnstate >= APCONN_ACTIVE) { |
| 1691 | /* | 1849 | /* |
| 1692 | * emit DISCONNECT_B3_IND with cause 0x3301 | 1850 | * emit DISCONNECT_B3_IND with cause 0x3301 |
| 1693 | * use separate cmsg structure, as the content of iif->acmsg | 1851 | * use separate cmsg structure, as the content of iif->acmsg |
| @@ -1736,6 +1894,7 @@ static void do_disconnect_b3_req(struct gigaset_capi_ctr *iif, | |||
| 1736 | { | 1894 | { |
| 1737 | struct cardstate *cs = iif->ctr.driverdata; | 1895 | struct cardstate *cs = iif->ctr.driverdata; |
| 1738 | _cmsg *cmsg = &iif->acmsg; | 1896 | _cmsg *cmsg = &iif->acmsg; |
| 1897 | struct bc_state *bcs; | ||
| 1739 | int channel; | 1898 | int channel; |
| 1740 | 1899 | ||
| 1741 | /* decode message */ | 1900 | /* decode message */ |
| @@ -1751,17 +1910,17 @@ static void do_disconnect_b3_req(struct gigaset_capi_ctr *iif, | |||
| 1751 | send_conf(iif, ap, skb, CapiIllContrPlciNcci); | 1910 | send_conf(iif, ap, skb, CapiIllContrPlciNcci); |
| 1752 | return; | 1911 | return; |
| 1753 | } | 1912 | } |
| 1913 | bcs = &cs->bcs[channel-1]; | ||
| 1754 | 1914 | ||
| 1755 | /* reject if logical connection not active */ | 1915 | /* reject if logical connection not active */ |
| 1756 | if (ap->connected < APCONN_ACTIVE) { | 1916 | if (bcs->apconnstate < APCONN_ACTIVE) { |
| 1757 | send_conf(iif, ap, skb, | 1917 | send_conf(iif, ap, skb, |
| 1758 | CapiMessageNotSupportedInCurrentState); | 1918 | CapiMessageNotSupportedInCurrentState); |
| 1759 | return; | 1919 | return; |
| 1760 | } | 1920 | } |
| 1761 | 1921 | ||
| 1762 | /* trigger hangup, causing eventual DISCONNECT_B3_IND */ | 1922 | /* trigger hangup, causing eventual DISCONNECT_B3_IND */ |
| 1763 | if (!gigaset_add_event(cs, &cs->bcs[channel-1].at_state, | 1923 | if (!gigaset_add_event(cs, &bcs->at_state, EV_HUP, NULL, 0, NULL)) { |
| 1764 | EV_HUP, NULL, 0, NULL)) { | ||
| 1765 | send_conf(iif, ap, skb, CAPI_MSGOSRESOURCEERR); | 1924 | send_conf(iif, ap, skb, CAPI_MSGOSRESOURCEERR); |
| 1766 | return; | 1925 | return; |
| 1767 | } | 1926 | } |
| @@ -1782,11 +1941,14 @@ static void do_data_b3_req(struct gigaset_capi_ctr *iif, | |||
| 1782 | struct sk_buff *skb) | 1941 | struct sk_buff *skb) |
| 1783 | { | 1942 | { |
| 1784 | struct cardstate *cs = iif->ctr.driverdata; | 1943 | struct cardstate *cs = iif->ctr.driverdata; |
| 1944 | struct bc_state *bcs; | ||
| 1785 | int channel = CAPIMSG_PLCI_PART(skb->data); | 1945 | int channel = CAPIMSG_PLCI_PART(skb->data); |
| 1786 | u16 ncci = CAPIMSG_NCCI_PART(skb->data); | 1946 | u16 ncci = CAPIMSG_NCCI_PART(skb->data); |
| 1787 | u16 msglen = CAPIMSG_LEN(skb->data); | 1947 | u16 msglen = CAPIMSG_LEN(skb->data); |
| 1788 | u16 datalen = CAPIMSG_DATALEN(skb->data); | 1948 | u16 datalen = CAPIMSG_DATALEN(skb->data); |
| 1789 | u16 flags = CAPIMSG_FLAGS(skb->data); | 1949 | u16 flags = CAPIMSG_FLAGS(skb->data); |
| 1950 | u16 msgid = CAPIMSG_MSGID(skb->data); | ||
| 1951 | u16 handle = CAPIMSG_HANDLE_REQ(skb->data); | ||
| 1790 | 1952 | ||
| 1791 | /* frequent message, avoid _cmsg overhead */ | 1953 | /* frequent message, avoid _cmsg overhead */ |
| 1792 | dump_rawmsg(DEBUG_LLDATA, "DATA_B3_REQ", skb->data); | 1954 | dump_rawmsg(DEBUG_LLDATA, "DATA_B3_REQ", skb->data); |
| @@ -1802,6 +1964,7 @@ static void do_data_b3_req(struct gigaset_capi_ctr *iif, | |||
| 1802 | send_conf(iif, ap, skb, CapiIllContrPlciNcci); | 1964 | send_conf(iif, ap, skb, CapiIllContrPlciNcci); |
| 1803 | return; | 1965 | return; |
| 1804 | } | 1966 | } |
| 1967 | bcs = &cs->bcs[channel-1]; | ||
| 1805 | if (msglen != CAPI_DATA_B3_REQ_LEN && msglen != CAPI_DATA_B3_REQ_LEN64) | 1968 | if (msglen != CAPI_DATA_B3_REQ_LEN && msglen != CAPI_DATA_B3_REQ_LEN64) |
| 1806 | dev_notice(cs->dev, "%s: unexpected length %d\n", | 1969 | dev_notice(cs->dev, "%s: unexpected length %d\n", |
| 1807 | "DATA_B3_REQ", msglen); | 1970 | "DATA_B3_REQ", msglen); |
| @@ -1821,7 +1984,7 @@ static void do_data_b3_req(struct gigaset_capi_ctr *iif, | |||
| 1821 | } | 1984 | } |
| 1822 | 1985 | ||
| 1823 | /* reject if logical connection not active */ | 1986 | /* reject if logical connection not active */ |
| 1824 | if (ap->connected < APCONN_ACTIVE) { | 1987 | if (bcs->apconnstate < APCONN_ACTIVE) { |
| 1825 | send_conf(iif, ap, skb, CapiMessageNotSupportedInCurrentState); | 1988 | send_conf(iif, ap, skb, CapiMessageNotSupportedInCurrentState); |
| 1826 | return; | 1989 | return; |
| 1827 | } | 1990 | } |
| @@ -1832,17 +1995,19 @@ static void do_data_b3_req(struct gigaset_capi_ctr *iif, | |||
| 1832 | skb_pull(skb, msglen); | 1995 | skb_pull(skb, msglen); |
| 1833 | 1996 | ||
| 1834 | /* pass to device-specific module */ | 1997 | /* pass to device-specific module */ |
| 1835 | if (cs->ops->send_skb(&cs->bcs[channel-1], skb) < 0) { | 1998 | if (cs->ops->send_skb(bcs, skb) < 0) { |
| 1836 | send_conf(iif, ap, skb, CAPI_MSGOSRESOURCEERR); | 1999 | send_conf(iif, ap, skb, CAPI_MSGOSRESOURCEERR); |
| 1837 | return; | 2000 | return; |
| 1838 | } | 2001 | } |
| 1839 | 2002 | ||
| 1840 | /* DATA_B3_CONF reply will be sent by gigaset_skb_sent() */ | ||
| 1841 | |||
| 1842 | /* | 2003 | /* |
| 1843 | * ToDo: honor unset "delivery confirmation" bit | 2004 | * DATA_B3_CONF will be sent by gigaset_skb_sent() only if "delivery |
| 1844 | * (send DATA_B3_CONF immediately?) | 2005 | * confirmation" bit is set; otherwise we have to send it now |
| 1845 | */ | 2006 | */ |
| 2007 | if (!(flags & CAPI_FLAGS_DELIVERY_CONFIRMATION)) | ||
| 2008 | send_data_b3_conf(cs, &iif->ctr, ap->id, msgid, channel, handle, | ||
| 2009 | flags ? CapiFlagsNotSupportedByProtocol | ||
| 2010 | : CAPI_NOERROR); | ||
| 1846 | } | 2011 | } |
| 1847 | 2012 | ||
| 1848 | /* | 2013 | /* |
diff --git a/drivers/isdn/gigaset/common.c b/drivers/isdn/gigaset/common.c index f6f45f221920..5d4befb81057 100644 --- a/drivers/isdn/gigaset/common.c +++ b/drivers/isdn/gigaset/common.c | |||
| @@ -399,8 +399,8 @@ static void gigaset_freebcs(struct bc_state *bcs) | |||
| 399 | gig_dbg(DEBUG_INIT, "clearing bcs[%d]->at_state", bcs->channel); | 399 | gig_dbg(DEBUG_INIT, "clearing bcs[%d]->at_state", bcs->channel); |
| 400 | clear_at_state(&bcs->at_state); | 400 | clear_at_state(&bcs->at_state); |
| 401 | gig_dbg(DEBUG_INIT, "freeing bcs[%d]->skb", bcs->channel); | 401 | gig_dbg(DEBUG_INIT, "freeing bcs[%d]->skb", bcs->channel); |
| 402 | dev_kfree_skb(bcs->skb); | 402 | dev_kfree_skb(bcs->rx_skb); |
| 403 | bcs->skb = NULL; | 403 | bcs->rx_skb = NULL; |
| 404 | 404 | ||
| 405 | for (i = 0; i < AT_NUM; ++i) { | 405 | for (i = 0; i < AT_NUM; ++i) { |
| 406 | kfree(bcs->commands[i]); | 406 | kfree(bcs->commands[i]); |
| @@ -634,19 +634,10 @@ static struct bc_state *gigaset_initbcs(struct bc_state *bcs, | |||
| 634 | bcs->emptycount = 0; | 634 | bcs->emptycount = 0; |
| 635 | #endif | 635 | #endif |
| 636 | 636 | ||
| 637 | gig_dbg(DEBUG_INIT, "allocating bcs[%d]->skb", channel); | 637 | bcs->rx_bufsize = 0; |
| 638 | bcs->fcs = PPP_INITFCS; | 638 | bcs->rx_skb = NULL; |
| 639 | bcs->rx_fcs = PPP_INITFCS; | ||
| 639 | bcs->inputstate = 0; | 640 | bcs->inputstate = 0; |
| 640 | if (cs->ignoreframes) { | ||
| 641 | bcs->skb = NULL; | ||
| 642 | } else { | ||
| 643 | bcs->skb = dev_alloc_skb(SBUFSIZE + cs->hw_hdr_len); | ||
| 644 | if (bcs->skb != NULL) | ||
| 645 | skb_reserve(bcs->skb, cs->hw_hdr_len); | ||
| 646 | else | ||
| 647 | pr_err("out of memory\n"); | ||
| 648 | } | ||
| 649 | |||
| 650 | bcs->channel = channel; | 641 | bcs->channel = channel; |
| 651 | bcs->cs = cs; | 642 | bcs->cs = cs; |
| 652 | 643 | ||
| @@ -658,16 +649,15 @@ static struct bc_state *gigaset_initbcs(struct bc_state *bcs, | |||
| 658 | for (i = 0; i < AT_NUM; ++i) | 649 | for (i = 0; i < AT_NUM; ++i) |
| 659 | bcs->commands[i] = NULL; | 650 | bcs->commands[i] = NULL; |
| 660 | 651 | ||
| 652 | spin_lock_init(&bcs->aplock); | ||
| 653 | bcs->ap = NULL; | ||
| 654 | bcs->apconnstate = 0; | ||
| 655 | |||
| 661 | gig_dbg(DEBUG_INIT, " setting up bcs[%d]->hw", channel); | 656 | gig_dbg(DEBUG_INIT, " setting up bcs[%d]->hw", channel); |
| 662 | if (cs->ops->initbcshw(bcs)) | 657 | if (cs->ops->initbcshw(bcs)) |
| 663 | return bcs; | 658 | return bcs; |
| 664 | 659 | ||
| 665 | gig_dbg(DEBUG_INIT, " failed"); | 660 | gig_dbg(DEBUG_INIT, " failed"); |
| 666 | |||
| 667 | gig_dbg(DEBUG_INIT, " freeing bcs[%d]->skb", channel); | ||
| 668 | dev_kfree_skb(bcs->skb); | ||
| 669 | bcs->skb = NULL; | ||
| 670 | |||
| 671 | return NULL; | 661 | return NULL; |
| 672 | } | 662 | } |
| 673 | 663 | ||
| @@ -839,14 +829,12 @@ void gigaset_bcs_reinit(struct bc_state *bcs) | |||
| 839 | bcs->emptycount = 0; | 829 | bcs->emptycount = 0; |
| 840 | #endif | 830 | #endif |
| 841 | 831 | ||
| 842 | bcs->fcs = PPP_INITFCS; | 832 | bcs->rx_fcs = PPP_INITFCS; |
| 843 | bcs->chstate = 0; | 833 | bcs->chstate = 0; |
| 844 | 834 | ||
| 845 | bcs->ignore = cs->ignoreframes; | 835 | bcs->ignore = cs->ignoreframes; |
| 846 | if (bcs->ignore) { | 836 | dev_kfree_skb(bcs->rx_skb); |
| 847 | dev_kfree_skb(bcs->skb); | 837 | bcs->rx_skb = NULL; |
| 848 | bcs->skb = NULL; | ||
| 849 | } | ||
| 850 | 838 | ||
| 851 | cs->ops->reinitbcshw(bcs); | 839 | cs->ops->reinitbcshw(bcs); |
| 852 | } | 840 | } |
diff --git a/drivers/isdn/gigaset/ev-layer.c b/drivers/isdn/gigaset/ev-layer.c index 206c380c5235..ceaef9a04a42 100644 --- a/drivers/isdn/gigaset/ev-layer.c +++ b/drivers/isdn/gigaset/ev-layer.c | |||
| @@ -282,9 +282,7 @@ struct reply_t gigaset_tab_cid[] = | |||
| 282 | /* dial */ | 282 | /* dial */ |
| 283 | {EV_DIAL, -1, -1, -1, -1, -1, {ACT_DIAL} }, | 283 | {EV_DIAL, -1, -1, -1, -1, -1, {ACT_DIAL} }, |
| 284 | {RSP_INIT, 0, 0, SEQ_DIAL, 601, 5, {ACT_CMD+AT_BC} }, | 284 | {RSP_INIT, 0, 0, SEQ_DIAL, 601, 5, {ACT_CMD+AT_BC} }, |
| 285 | {RSP_OK, 601, 601, -1, 602, 5, {ACT_CMD+AT_HLC} }, | 285 | {RSP_OK, 601, 601, -1, 603, 5, {ACT_CMD+AT_PROTO} }, |
| 286 | {RSP_NULL, 602, 602, -1, 603, 5, {ACT_CMD+AT_PROTO} }, | ||
| 287 | {RSP_OK, 602, 602, -1, 603, 5, {ACT_CMD+AT_PROTO} }, | ||
| 288 | {RSP_OK, 603, 603, -1, 604, 5, {ACT_CMD+AT_TYPE} }, | 286 | {RSP_OK, 603, 603, -1, 604, 5, {ACT_CMD+AT_TYPE} }, |
| 289 | {RSP_OK, 604, 604, -1, 605, 5, {ACT_CMD+AT_MSN} }, | 287 | {RSP_OK, 604, 604, -1, 605, 5, {ACT_CMD+AT_MSN} }, |
| 290 | {RSP_NULL, 605, 605, -1, 606, 5, {ACT_CMD+AT_CLIP} }, | 288 | {RSP_NULL, 605, 605, -1, 606, 5, {ACT_CMD+AT_CLIP} }, |
diff --git a/drivers/isdn/gigaset/gigaset.h b/drivers/isdn/gigaset/gigaset.h index 05947f9c1849..8738b0821fc9 100644 --- a/drivers/isdn/gigaset/gigaset.h +++ b/drivers/isdn/gigaset/gigaset.h | |||
| @@ -45,10 +45,6 @@ | |||
| 45 | #define MAX_EVENTS 64 /* size of event queue */ | 45 | #define MAX_EVENTS 64 /* size of event queue */ |
| 46 | 46 | ||
| 47 | #define RBUFSIZE 8192 | 47 | #define RBUFSIZE 8192 |
| 48 | #define SBUFSIZE 4096 /* sk_buff payload size */ | ||
| 49 | |||
| 50 | #define TRANSBUFSIZE 768 /* bytes per skb for transparent receive */ | ||
| 51 | #define MAX_BUF_SIZE (SBUFSIZE - 2) /* Max. size of a data packet from LL */ | ||
| 52 | 48 | ||
| 53 | /* compile time options */ | 49 | /* compile time options */ |
| 54 | #define GIG_MAJOR 0 | 50 | #define GIG_MAJOR 0 |
| @@ -190,10 +186,9 @@ void gigaset_dbg_buffer(enum debuglevel level, const unsigned char *msg, | |||
| 190 | #define AT_BC 3 | 186 | #define AT_BC 3 |
| 191 | #define AT_PROTO 4 | 187 | #define AT_PROTO 4 |
| 192 | #define AT_TYPE 5 | 188 | #define AT_TYPE 5 |
| 193 | #define AT_HLC 6 | 189 | #define AT_CLIP 6 |
| 194 | #define AT_CLIP 7 | ||
| 195 | /* total number */ | 190 | /* total number */ |
| 196 | #define AT_NUM 8 | 191 | #define AT_NUM 7 |
| 197 | 192 | ||
| 198 | /* variables in struct at_state_t */ | 193 | /* variables in struct at_state_t */ |
| 199 | #define VAR_ZSAU 0 | 194 | #define VAR_ZSAU 0 |
| @@ -380,8 +375,10 @@ struct bc_state { | |||
| 380 | 375 | ||
| 381 | struct at_state_t at_state; | 376 | struct at_state_t at_state; |
| 382 | 377 | ||
| 383 | __u16 fcs; | 378 | /* receive buffer */ |
| 384 | struct sk_buff *skb; | 379 | unsigned rx_bufsize; /* max size accepted by application */ |
| 380 | struct sk_buff *rx_skb; | ||
| 381 | __u16 rx_fcs; | ||
| 385 | int inputstate; /* see INS_XXXX */ | 382 | int inputstate; /* see INS_XXXX */ |
| 386 | 383 | ||
| 387 | int channel; | 384 | int channel; |
| @@ -406,7 +403,9 @@ struct bc_state { | |||
| 406 | struct bas_bc_state *bas; /* usb hardware driver (base) */ | 403 | struct bas_bc_state *bas; /* usb hardware driver (base) */ |
| 407 | } hw; | 404 | } hw; |
| 408 | 405 | ||
| 409 | void *ap; /* LL application structure */ | 406 | void *ap; /* associated LL application */ |
| 407 | int apconnstate; /* LL application connection state */ | ||
| 408 | spinlock_t aplock; | ||
| 410 | }; | 409 | }; |
| 411 | 410 | ||
| 412 | struct cardstate { | 411 | struct cardstate { |
| @@ -801,8 +800,23 @@ static inline void gigaset_bchannel_up(struct bc_state *bcs) | |||
| 801 | gigaset_schedule_event(bcs->cs); | 800 | gigaset_schedule_event(bcs->cs); |
| 802 | } | 801 | } |
| 803 | 802 | ||
| 804 | /* handling routines for sk_buff */ | 803 | /* set up next receive skb for data mode */ |
| 805 | /* ============================= */ | 804 | static inline struct sk_buff *gigaset_new_rx_skb(struct bc_state *bcs) |
| 805 | { | ||
| 806 | struct cardstate *cs = bcs->cs; | ||
| 807 | unsigned short hw_hdr_len = cs->hw_hdr_len; | ||
| 808 | |||
| 809 | if (bcs->ignore) { | ||
| 810 | bcs->rx_skb = NULL; | ||
| 811 | } else { | ||
| 812 | bcs->rx_skb = dev_alloc_skb(bcs->rx_bufsize + hw_hdr_len); | ||
| 813 | if (bcs->rx_skb == NULL) | ||
| 814 | dev_warn(cs->dev, "could not allocate skb\n"); | ||
| 815 | else | ||
| 816 | skb_reserve(bcs->rx_skb, hw_hdr_len); | ||
| 817 | } | ||
| 818 | return bcs->rx_skb; | ||
| 819 | } | ||
| 806 | 820 | ||
| 807 | /* append received bytes to inbuf */ | 821 | /* append received bytes to inbuf */ |
| 808 | int gigaset_fill_inbuf(struct inbuf_t *inbuf, const unsigned char *src, | 822 | int gigaset_fill_inbuf(struct inbuf_t *inbuf, const unsigned char *src, |
diff --git a/drivers/isdn/gigaset/i4l.c b/drivers/isdn/gigaset/i4l.c index c22e5ace8276..f01c3c2e2e46 100644 --- a/drivers/isdn/gigaset/i4l.c +++ b/drivers/isdn/gigaset/i4l.c | |||
| @@ -16,7 +16,10 @@ | |||
| 16 | #include "gigaset.h" | 16 | #include "gigaset.h" |
| 17 | #include <linux/isdnif.h> | 17 | #include <linux/isdnif.h> |
| 18 | 18 | ||
| 19 | #define SBUFSIZE 4096 /* sk_buff payload size */ | ||
| 20 | #define TRANSBUFSIZE 768 /* bytes per skb for transparent receive */ | ||
| 19 | #define HW_HDR_LEN 2 /* Header size used to store ack info */ | 21 | #define HW_HDR_LEN 2 /* Header size used to store ack info */ |
| 22 | #define MAX_BUF_SIZE (SBUFSIZE - HW_HDR_LEN) /* max data packet from LL */ | ||
| 20 | 23 | ||
| 21 | /* == Handling of I4L IO =====================================================*/ | 24 | /* == Handling of I4L IO =====================================================*/ |
| 22 | 25 | ||
| @@ -231,6 +234,15 @@ static int command_from_LL(isdn_ctrl *cntrl) | |||
| 231 | dev_err(cs->dev, "ISDN_CMD_DIAL: channel not free\n"); | 234 | dev_err(cs->dev, "ISDN_CMD_DIAL: channel not free\n"); |
| 232 | return -EBUSY; | 235 | return -EBUSY; |
| 233 | } | 236 | } |
| 237 | switch (bcs->proto2) { | ||
| 238 | case L2_HDLC: | ||
| 239 | bcs->rx_bufsize = SBUFSIZE; | ||
| 240 | break; | ||
| 241 | default: /* assume transparent */ | ||
| 242 | bcs->rx_bufsize = TRANSBUFSIZE; | ||
| 243 | } | ||
| 244 | dev_kfree_skb(bcs->rx_skb); | ||
| 245 | gigaset_new_rx_skb(bcs); | ||
| 234 | 246 | ||
| 235 | commands = kzalloc(AT_NUM*(sizeof *commands), GFP_ATOMIC); | 247 | commands = kzalloc(AT_NUM*(sizeof *commands), GFP_ATOMIC); |
| 236 | if (!commands) { | 248 | if (!commands) { |
| @@ -314,6 +326,15 @@ static int command_from_LL(isdn_ctrl *cntrl) | |||
| 314 | return -EINVAL; | 326 | return -EINVAL; |
| 315 | } | 327 | } |
| 316 | bcs = cs->bcs + ch; | 328 | bcs = cs->bcs + ch; |
| 329 | switch (bcs->proto2) { | ||
| 330 | case L2_HDLC: | ||
| 331 | bcs->rx_bufsize = SBUFSIZE; | ||
| 332 | break; | ||
| 333 | default: /* assume transparent */ | ||
| 334 | bcs->rx_bufsize = TRANSBUFSIZE; | ||
| 335 | } | ||
| 336 | dev_kfree_skb(bcs->rx_skb); | ||
| 337 | gigaset_new_rx_skb(bcs); | ||
| 317 | if (!gigaset_add_event(cs, &bcs->at_state, | 338 | if (!gigaset_add_event(cs, &bcs->at_state, |
| 318 | EV_ACCEPT, NULL, 0, NULL)) | 339 | EV_ACCEPT, NULL, 0, NULL)) |
| 319 | return -ENOMEM; | 340 | return -ENOMEM; |
diff --git a/drivers/isdn/gigaset/isocdata.c b/drivers/isdn/gigaset/isocdata.c index 16fd3bd48883..2dfd346fc889 100644 --- a/drivers/isdn/gigaset/isocdata.c +++ b/drivers/isdn/gigaset/isocdata.c | |||
| @@ -500,19 +500,18 @@ int gigaset_isoc_buildframe(struct bc_state *bcs, unsigned char *in, int len) | |||
| 500 | */ | 500 | */ |
| 501 | static inline void hdlc_putbyte(unsigned char c, struct bc_state *bcs) | 501 | static inline void hdlc_putbyte(unsigned char c, struct bc_state *bcs) |
| 502 | { | 502 | { |
| 503 | bcs->fcs = crc_ccitt_byte(bcs->fcs, c); | 503 | bcs->rx_fcs = crc_ccitt_byte(bcs->rx_fcs, c); |
| 504 | if (unlikely(bcs->skb == NULL)) { | 504 | if (bcs->rx_skb == NULL) |
| 505 | /* skipping */ | 505 | /* skipping */ |
| 506 | return; | 506 | return; |
| 507 | } | 507 | if (bcs->rx_skb->len >= bcs->rx_bufsize) { |
| 508 | if (unlikely(bcs->skb->len == SBUFSIZE)) { | ||
| 509 | dev_warn(bcs->cs->dev, "received oversized packet discarded\n"); | 508 | dev_warn(bcs->cs->dev, "received oversized packet discarded\n"); |
| 510 | bcs->hw.bas->giants++; | 509 | bcs->hw.bas->giants++; |
| 511 | dev_kfree_skb_any(bcs->skb); | 510 | dev_kfree_skb_any(bcs->rx_skb); |
| 512 | bcs->skb = NULL; | 511 | bcs->rx_skb = NULL; |
| 513 | return; | 512 | return; |
| 514 | } | 513 | } |
| 515 | *__skb_put(bcs->skb, 1) = c; | 514 | *__skb_put(bcs->rx_skb, 1) = c; |
| 516 | } | 515 | } |
| 517 | 516 | ||
| 518 | /* hdlc_flush | 517 | /* hdlc_flush |
| @@ -521,18 +520,13 @@ static inline void hdlc_putbyte(unsigned char c, struct bc_state *bcs) | |||
| 521 | static inline void hdlc_flush(struct bc_state *bcs) | 520 | static inline void hdlc_flush(struct bc_state *bcs) |
| 522 | { | 521 | { |
| 523 | /* clear skb or allocate new if not skipping */ | 522 | /* clear skb or allocate new if not skipping */ |
| 524 | if (likely(bcs->skb != NULL)) | 523 | if (bcs->rx_skb != NULL) |
| 525 | skb_trim(bcs->skb, 0); | 524 | skb_trim(bcs->rx_skb, 0); |
| 526 | else if (!bcs->ignore) { | 525 | else |
| 527 | bcs->skb = dev_alloc_skb(SBUFSIZE + bcs->cs->hw_hdr_len); | 526 | gigaset_new_rx_skb(bcs); |
| 528 | if (bcs->skb) | ||
| 529 | skb_reserve(bcs->skb, bcs->cs->hw_hdr_len); | ||
| 530 | else | ||
| 531 | dev_err(bcs->cs->dev, "could not allocate skb\n"); | ||
| 532 | } | ||
| 533 | 527 | ||
| 534 | /* reset packet state */ | 528 | /* reset packet state */ |
| 535 | bcs->fcs = PPP_INITFCS; | 529 | bcs->rx_fcs = PPP_INITFCS; |
| 536 | } | 530 | } |
| 537 | 531 | ||
| 538 | /* hdlc_done | 532 | /* hdlc_done |
| @@ -549,7 +543,7 @@ static inline void hdlc_done(struct bc_state *bcs) | |||
| 549 | hdlc_flush(bcs); | 543 | hdlc_flush(bcs); |
| 550 | return; | 544 | return; |
| 551 | } | 545 | } |
| 552 | procskb = bcs->skb; | 546 | procskb = bcs->rx_skb; |
| 553 | if (procskb == NULL) { | 547 | if (procskb == NULL) { |
| 554 | /* previous error */ | 548 | /* previous error */ |
| 555 | gig_dbg(DEBUG_ISO, "%s: skb=NULL", __func__); | 549 | gig_dbg(DEBUG_ISO, "%s: skb=NULL", __func__); |
| @@ -560,8 +554,8 @@ static inline void hdlc_done(struct bc_state *bcs) | |||
| 560 | bcs->hw.bas->runts++; | 554 | bcs->hw.bas->runts++; |
| 561 | dev_kfree_skb_any(procskb); | 555 | dev_kfree_skb_any(procskb); |
| 562 | gigaset_isdn_rcv_err(bcs); | 556 | gigaset_isdn_rcv_err(bcs); |
| 563 | } else if (bcs->fcs != PPP_GOODFCS) { | 557 | } else if (bcs->rx_fcs != PPP_GOODFCS) { |
| 564 | dev_notice(cs->dev, "frame check error (0x%04x)\n", bcs->fcs); | 558 | dev_notice(cs->dev, "frame check error\n"); |
| 565 | bcs->hw.bas->fcserrs++; | 559 | bcs->hw.bas->fcserrs++; |
| 566 | dev_kfree_skb_any(procskb); | 560 | dev_kfree_skb_any(procskb); |
| 567 | gigaset_isdn_rcv_err(bcs); | 561 | gigaset_isdn_rcv_err(bcs); |
| @@ -574,13 +568,8 @@ static inline void hdlc_done(struct bc_state *bcs) | |||
| 574 | bcs->hw.bas->goodbytes += len; | 568 | bcs->hw.bas->goodbytes += len; |
| 575 | gigaset_skb_rcvd(bcs, procskb); | 569 | gigaset_skb_rcvd(bcs, procskb); |
| 576 | } | 570 | } |
| 577 | 571 | gigaset_new_rx_skb(bcs); | |
| 578 | bcs->skb = dev_alloc_skb(SBUFSIZE + cs->hw_hdr_len); | 572 | bcs->rx_fcs = PPP_INITFCS; |
| 579 | if (bcs->skb) | ||
| 580 | skb_reserve(bcs->skb, cs->hw_hdr_len); | ||
| 581 | else | ||
| 582 | dev_err(cs->dev, "could not allocate skb\n"); | ||
| 583 | bcs->fcs = PPP_INITFCS; | ||
| 584 | } | 573 | } |
| 585 | 574 | ||
| 586 | /* hdlc_frag | 575 | /* hdlc_frag |
| @@ -597,8 +586,8 @@ static inline void hdlc_frag(struct bc_state *bcs, unsigned inbits) | |||
| 597 | dev_notice(bcs->cs->dev, "received partial byte (%d bits)\n", inbits); | 586 | dev_notice(bcs->cs->dev, "received partial byte (%d bits)\n", inbits); |
| 598 | bcs->hw.bas->alignerrs++; | 587 | bcs->hw.bas->alignerrs++; |
| 599 | gigaset_isdn_rcv_err(bcs); | 588 | gigaset_isdn_rcv_err(bcs); |
| 600 | __skb_trim(bcs->skb, 0); | 589 | __skb_trim(bcs->rx_skb, 0); |
| 601 | bcs->fcs = PPP_INITFCS; | 590 | bcs->rx_fcs = PPP_INITFCS; |
| 602 | } | 591 | } |
| 603 | 592 | ||
| 604 | /* bit counts lookup table for HDLC bit unstuffing | 593 | /* bit counts lookup table for HDLC bit unstuffing |
| @@ -847,7 +836,6 @@ static inline void hdlc_unpack(unsigned char *src, unsigned count, | |||
| 847 | static inline void trans_receive(unsigned char *src, unsigned count, | 836 | static inline void trans_receive(unsigned char *src, unsigned count, |
| 848 | struct bc_state *bcs) | 837 | struct bc_state *bcs) |
| 849 | { | 838 | { |
| 850 | struct cardstate *cs = bcs->cs; | ||
| 851 | struct sk_buff *skb; | 839 | struct sk_buff *skb; |
| 852 | int dobytes; | 840 | int dobytes; |
| 853 | unsigned char *dst; | 841 | unsigned char *dst; |
| @@ -857,17 +845,11 @@ static inline void trans_receive(unsigned char *src, unsigned count, | |||
| 857 | hdlc_flush(bcs); | 845 | hdlc_flush(bcs); |
| 858 | return; | 846 | return; |
| 859 | } | 847 | } |
| 860 | skb = bcs->skb; | 848 | skb = bcs->rx_skb; |
| 861 | if (unlikely(skb == NULL)) { | 849 | if (skb == NULL) |
| 862 | bcs->skb = skb = dev_alloc_skb(SBUFSIZE + cs->hw_hdr_len); | 850 | skb = gigaset_new_rx_skb(bcs); |
| 863 | if (!skb) { | ||
| 864 | dev_err(cs->dev, "could not allocate skb\n"); | ||
| 865 | return; | ||
| 866 | } | ||
| 867 | skb_reserve(skb, cs->hw_hdr_len); | ||
| 868 | } | ||
| 869 | bcs->hw.bas->goodbytes += skb->len; | 851 | bcs->hw.bas->goodbytes += skb->len; |
| 870 | dobytes = TRANSBUFSIZE - skb->len; | 852 | dobytes = bcs->rx_bufsize - skb->len; |
| 871 | while (count > 0) { | 853 | while (count > 0) { |
| 872 | dst = skb_put(skb, count < dobytes ? count : dobytes); | 854 | dst = skb_put(skb, count < dobytes ? count : dobytes); |
| 873 | while (count > 0 && dobytes > 0) { | 855 | while (count > 0 && dobytes > 0) { |
| @@ -879,14 +861,10 @@ static inline void trans_receive(unsigned char *src, unsigned count, | |||
| 879 | dump_bytes(DEBUG_STREAM_DUMP, | 861 | dump_bytes(DEBUG_STREAM_DUMP, |
| 880 | "rcv data", skb->data, skb->len); | 862 | "rcv data", skb->data, skb->len); |
| 881 | gigaset_skb_rcvd(bcs, skb); | 863 | gigaset_skb_rcvd(bcs, skb); |
| 882 | bcs->skb = skb = | 864 | skb = gigaset_new_rx_skb(bcs); |
| 883 | dev_alloc_skb(SBUFSIZE + cs->hw_hdr_len); | 865 | if (skb == NULL) |
| 884 | if (!skb) { | ||
| 885 | dev_err(cs->dev, "could not allocate skb\n"); | ||
| 886 | return; | 866 | return; |
| 887 | } | 867 | dobytes = bcs->rx_bufsize; |
| 888 | skb_reserve(skb, cs->hw_hdr_len); | ||
| 889 | dobytes = TRANSBUFSIZE; | ||
| 890 | } | 868 | } |
| 891 | } | 869 | } |
| 892 | } | 870 | } |
diff --git a/drivers/isdn/hysdn/hysdn_net.c b/drivers/isdn/hysdn/hysdn_net.c index 72eb92647c1b..feec8d89d719 100644 --- a/drivers/isdn/hysdn/hysdn_net.c +++ b/drivers/isdn/hysdn/hysdn_net.c | |||
| @@ -187,12 +187,13 @@ void | |||
| 187 | hysdn_rx_netpkt(hysdn_card * card, unsigned char *buf, unsigned short len) | 187 | hysdn_rx_netpkt(hysdn_card * card, unsigned char *buf, unsigned short len) |
| 188 | { | 188 | { |
| 189 | struct net_local *lp = card->netif; | 189 | struct net_local *lp = card->netif; |
| 190 | struct net_device *dev = lp->dev; | 190 | struct net_device *dev; |
| 191 | struct sk_buff *skb; | 191 | struct sk_buff *skb; |
| 192 | 192 | ||
| 193 | if (!lp) | 193 | if (!lp) |
| 194 | return; /* non existing device */ | 194 | return; /* non existing device */ |
| 195 | 195 | ||
| 196 | dev = lp->dev; | ||
| 196 | dev->stats.rx_bytes += len; | 197 | dev->stats.rx_bytes += len; |
| 197 | 198 | ||
| 198 | skb = dev_alloc_skb(len); | 199 | skb = dev_alloc_skb(len); |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 2decc597bda7..ce2fcdd4ab90 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
| @@ -2754,6 +2754,7 @@ config MYRI10GE_DCA | |||
| 2754 | config NETXEN_NIC | 2754 | config NETXEN_NIC |
| 2755 | tristate "NetXen Multi port (1/10) Gigabit Ethernet NIC" | 2755 | tristate "NetXen Multi port (1/10) Gigabit Ethernet NIC" |
| 2756 | depends on PCI | 2756 | depends on PCI |
| 2757 | select FW_LOADER | ||
| 2757 | help | 2758 | help |
| 2758 | This enables the support for NetXen's Gigabit Ethernet card. | 2759 | This enables the support for NetXen's Gigabit Ethernet card. |
| 2759 | 2760 | ||
| @@ -2819,6 +2820,7 @@ config BNX2X | |||
| 2819 | config QLCNIC | 2820 | config QLCNIC |
| 2820 | tristate "QLOGIC QLCNIC 1/10Gb Converged Ethernet NIC Support" | 2821 | tristate "QLOGIC QLCNIC 1/10Gb Converged Ethernet NIC Support" |
| 2821 | depends on PCI | 2822 | depends on PCI |
| 2823 | select FW_LOADER | ||
| 2822 | help | 2824 | help |
| 2823 | This driver supports QLogic QLE8240 and QLE8242 Converged Ethernet | 2825 | This driver supports QLogic QLE8240 and QLE8242 Converged Ethernet |
| 2824 | devices. | 2826 | devices. |
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 949d7a9dcf92..117432222a09 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
| @@ -3073,7 +3073,6 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) | |||
| 3073 | u16 hw_cons, sw_cons, sw_ring_cons, sw_prod, sw_ring_prod; | 3073 | u16 hw_cons, sw_cons, sw_ring_cons, sw_prod, sw_ring_prod; |
| 3074 | struct l2_fhdr *rx_hdr; | 3074 | struct l2_fhdr *rx_hdr; |
| 3075 | int rx_pkt = 0, pg_ring_used = 0; | 3075 | int rx_pkt = 0, pg_ring_used = 0; |
| 3076 | struct pci_dev *pdev = bp->pdev; | ||
| 3077 | 3076 | ||
| 3078 | hw_cons = bnx2_get_hw_rx_cons(bnapi); | 3077 | hw_cons = bnx2_get_hw_rx_cons(bnapi); |
| 3079 | sw_cons = rxr->rx_cons; | 3078 | sw_cons = rxr->rx_cons; |
| @@ -3099,12 +3098,10 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) | |||
| 3099 | skb = rx_buf->skb; | 3098 | skb = rx_buf->skb; |
| 3100 | prefetchw(skb); | 3099 | prefetchw(skb); |
| 3101 | 3100 | ||
| 3102 | if (!get_dma_ops(&pdev->dev)->sync_single_for_cpu) { | 3101 | next_rx_buf = |
| 3103 | next_rx_buf = | 3102 | &rxr->rx_buf_ring[RX_RING_IDX(NEXT_RX_BD(sw_cons))]; |
| 3104 | &rxr->rx_buf_ring[ | 3103 | prefetch(next_rx_buf->desc); |
| 3105 | RX_RING_IDX(NEXT_RX_BD(sw_cons))]; | 3104 | |
| 3106 | prefetch(next_rx_buf->desc); | ||
| 3107 | } | ||
| 3108 | rx_buf->skb = NULL; | 3105 | rx_buf->skb = NULL; |
| 3109 | 3106 | ||
| 3110 | dma_addr = dma_unmap_addr(rx_buf, mapping); | 3107 | dma_addr = dma_unmap_addr(rx_buf, mapping); |
diff --git a/drivers/net/cnic.c b/drivers/net/cnic.c index fe925663d39a..80471269977a 100644 --- a/drivers/net/cnic.c +++ b/drivers/net/cnic.c | |||
| @@ -3919,8 +3919,9 @@ static void cnic_init_bnx2x_tx_ring(struct cnic_dev *dev) | |||
| 3919 | HC_INDEX_DEF_C_ETH_ISCSI_CQ_CONS; | 3919 | HC_INDEX_DEF_C_ETH_ISCSI_CQ_CONS; |
| 3920 | context->cstorm_st_context.status_block_id = BNX2X_DEF_SB_ID; | 3920 | context->cstorm_st_context.status_block_id = BNX2X_DEF_SB_ID; |
| 3921 | 3921 | ||
| 3922 | context->xstorm_st_context.statistics_data = (cli | | 3922 | if (cli < MAX_X_STAT_COUNTER_ID) |
| 3923 | XSTORM_ETH_ST_CONTEXT_STATISTICS_ENABLE); | 3923 | context->xstorm_st_context.statistics_data = cli | |
| 3924 | XSTORM_ETH_ST_CONTEXT_STATISTICS_ENABLE; | ||
| 3924 | 3925 | ||
| 3925 | context->xstorm_ag_context.cdu_reserved = | 3926 | context->xstorm_ag_context.cdu_reserved = |
| 3926 | CDU_RSRVD_VALUE_TYPE_A(BNX2X_HW_CID(BNX2X_ISCSI_L2_CID, func), | 3927 | CDU_RSRVD_VALUE_TYPE_A(BNX2X_HW_CID(BNX2X_ISCSI_L2_CID, func), |
| @@ -3928,10 +3929,12 @@ static void cnic_init_bnx2x_tx_ring(struct cnic_dev *dev) | |||
| 3928 | ETH_CONNECTION_TYPE); | 3929 | ETH_CONNECTION_TYPE); |
| 3929 | 3930 | ||
| 3930 | /* reset xstorm per client statistics */ | 3931 | /* reset xstorm per client statistics */ |
| 3931 | val = BAR_XSTRORM_INTMEM + | 3932 | if (cli < MAX_X_STAT_COUNTER_ID) { |
| 3932 | XSTORM_PER_COUNTER_ID_STATS_OFFSET(port, cli); | 3933 | val = BAR_XSTRORM_INTMEM + |
| 3933 | for (i = 0; i < sizeof(struct xstorm_per_client_stats) / 4; i++) | 3934 | XSTORM_PER_COUNTER_ID_STATS_OFFSET(port, cli); |
| 3934 | CNIC_WR(dev, val + i * 4, 0); | 3935 | for (i = 0; i < sizeof(struct xstorm_per_client_stats) / 4; i++) |
| 3936 | CNIC_WR(dev, val + i * 4, 0); | ||
| 3937 | } | ||
| 3935 | 3938 | ||
| 3936 | cp->tx_cons_ptr = | 3939 | cp->tx_cons_ptr = |
| 3937 | &cp->bnx2x_def_status_blk->c_def_status_block.index_values[ | 3940 | &cp->bnx2x_def_status_blk->c_def_status_block.index_values[ |
| @@ -3978,9 +3981,11 @@ static void cnic_init_bnx2x_rx_ring(struct cnic_dev *dev) | |||
| 3978 | BNX2X_ISCSI_RX_SB_INDEX_NUM; | 3981 | BNX2X_ISCSI_RX_SB_INDEX_NUM; |
| 3979 | context->ustorm_st_context.common.clientId = cli; | 3982 | context->ustorm_st_context.common.clientId = cli; |
| 3980 | context->ustorm_st_context.common.status_block_id = BNX2X_DEF_SB_ID; | 3983 | context->ustorm_st_context.common.status_block_id = BNX2X_DEF_SB_ID; |
| 3981 | context->ustorm_st_context.common.flags = | 3984 | if (cli < MAX_U_STAT_COUNTER_ID) { |
| 3982 | USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_STATISTICS; | 3985 | context->ustorm_st_context.common.flags = |
| 3983 | context->ustorm_st_context.common.statistics_counter_id = cli; | 3986 | USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_STATISTICS; |
| 3987 | context->ustorm_st_context.common.statistics_counter_id = cli; | ||
| 3988 | } | ||
| 3984 | context->ustorm_st_context.common.mc_alignment_log_size = 0; | 3989 | context->ustorm_st_context.common.mc_alignment_log_size = 0; |
| 3985 | context->ustorm_st_context.common.bd_buff_size = | 3990 | context->ustorm_st_context.common.bd_buff_size = |
| 3986 | cp->l2_single_buf_size; | 3991 | cp->l2_single_buf_size; |
| @@ -4011,10 +4016,13 @@ static void cnic_init_bnx2x_rx_ring(struct cnic_dev *dev) | |||
| 4011 | 4016 | ||
| 4012 | /* client tstorm info */ | 4017 | /* client tstorm info */ |
| 4013 | tstorm_client.mtu = cp->l2_single_buf_size - 14; | 4018 | tstorm_client.mtu = cp->l2_single_buf_size - 14; |
| 4014 | tstorm_client.config_flags = | 4019 | tstorm_client.config_flags = TSTORM_ETH_CLIENT_CONFIG_E1HOV_REM_ENABLE; |
| 4015 | (TSTORM_ETH_CLIENT_CONFIG_E1HOV_REM_ENABLE | | 4020 | |
| 4016 | TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE); | 4021 | if (cli < MAX_T_STAT_COUNTER_ID) { |
| 4017 | tstorm_client.statistics_counter_id = cli; | 4022 | tstorm_client.config_flags |= |
| 4023 | TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE; | ||
| 4024 | tstorm_client.statistics_counter_id = cli; | ||
| 4025 | } | ||
| 4018 | 4026 | ||
| 4019 | CNIC_WR(dev, BAR_TSTRORM_INTMEM + | 4027 | CNIC_WR(dev, BAR_TSTRORM_INTMEM + |
| 4020 | TSTORM_CLIENT_CONFIG_OFFSET(port, cli), | 4028 | TSTORM_CLIENT_CONFIG_OFFSET(port, cli), |
| @@ -4024,16 +4032,21 @@ static void cnic_init_bnx2x_rx_ring(struct cnic_dev *dev) | |||
| 4024 | ((u32 *)&tstorm_client)[1]); | 4032 | ((u32 *)&tstorm_client)[1]); |
| 4025 | 4033 | ||
| 4026 | /* reset tstorm per client statistics */ | 4034 | /* reset tstorm per client statistics */ |
| 4027 | val = BAR_TSTRORM_INTMEM + | 4035 | if (cli < MAX_T_STAT_COUNTER_ID) { |
| 4028 | TSTORM_PER_COUNTER_ID_STATS_OFFSET(port, cli); | 4036 | |
| 4029 | for (i = 0; i < sizeof(struct tstorm_per_client_stats) / 4; i++) | 4037 | val = BAR_TSTRORM_INTMEM + |
| 4030 | CNIC_WR(dev, val + i * 4, 0); | 4038 | TSTORM_PER_COUNTER_ID_STATS_OFFSET(port, cli); |
| 4039 | for (i = 0; i < sizeof(struct tstorm_per_client_stats) / 4; i++) | ||
| 4040 | CNIC_WR(dev, val + i * 4, 0); | ||
| 4041 | } | ||
| 4031 | 4042 | ||
| 4032 | /* reset ustorm per client statistics */ | 4043 | /* reset ustorm per client statistics */ |
| 4033 | val = BAR_USTRORM_INTMEM + | 4044 | if (cli < MAX_U_STAT_COUNTER_ID) { |
| 4034 | USTORM_PER_COUNTER_ID_STATS_OFFSET(port, cli); | 4045 | val = BAR_USTRORM_INTMEM + |
| 4035 | for (i = 0; i < sizeof(struct ustorm_per_client_stats) / 4; i++) | 4046 | USTORM_PER_COUNTER_ID_STATS_OFFSET(port, cli); |
| 4036 | CNIC_WR(dev, val + i * 4, 0); | 4047 | for (i = 0; i < sizeof(struct ustorm_per_client_stats) / 4; i++) |
| 4048 | CNIC_WR(dev, val + i * 4, 0); | ||
| 4049 | } | ||
| 4037 | 4050 | ||
| 4038 | cp->rx_cons_ptr = | 4051 | cp->rx_cons_ptr = |
| 4039 | &cp->bnx2x_def_status_blk->u_def_status_block.index_values[ | 4052 | &cp->bnx2x_def_status_blk->u_def_status_block.index_values[ |
diff --git a/drivers/net/cpmac.c b/drivers/net/cpmac.c index 3c58db595285..23786ee34bed 100644 --- a/drivers/net/cpmac.c +++ b/drivers/net/cpmac.c | |||
| @@ -1181,7 +1181,8 @@ static int __devinit cpmac_probe(struct platform_device *pdev) | |||
| 1181 | if (netif_msg_drv(priv)) | 1181 | if (netif_msg_drv(priv)) |
| 1182 | printk(KERN_ERR "%s: Could not attach to PHY\n", | 1182 | printk(KERN_ERR "%s: Could not attach to PHY\n", |
| 1183 | dev->name); | 1183 | dev->name); |
| 1184 | return PTR_ERR(priv->phy); | 1184 | rc = PTR_ERR(priv->phy); |
| 1185 | goto fail; | ||
| 1185 | } | 1186 | } |
| 1186 | 1187 | ||
| 1187 | if ((rc = register_netdev(dev))) { | 1188 | if ((rc = register_netdev(dev))) { |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index ebdea0891665..68a80893dce1 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
| @@ -1047,15 +1047,14 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 1047 | goto err_register; | 1047 | goto err_register; |
| 1048 | 1048 | ||
| 1049 | /* print bus type/speed/width info */ | 1049 | /* print bus type/speed/width info */ |
| 1050 | e_info("(PCI%s:%s:%s) ", | 1050 | e_info("(PCI%s:%dMHz:%d-bit) %pM\n", |
| 1051 | ((hw->bus_type == e1000_bus_type_pcix) ? "-X" : ""), | 1051 | ((hw->bus_type == e1000_bus_type_pcix) ? "-X" : ""), |
| 1052 | ((hw->bus_speed == e1000_bus_speed_133) ? "133MHz" : | 1052 | ((hw->bus_speed == e1000_bus_speed_133) ? 133 : |
| 1053 | (hw->bus_speed == e1000_bus_speed_120) ? "120MHz" : | 1053 | (hw->bus_speed == e1000_bus_speed_120) ? 120 : |
| 1054 | (hw->bus_speed == e1000_bus_speed_100) ? "100MHz" : | 1054 | (hw->bus_speed == e1000_bus_speed_100) ? 100 : |
| 1055 | (hw->bus_speed == e1000_bus_speed_66) ? "66MHz" : "33MHz"), | 1055 | (hw->bus_speed == e1000_bus_speed_66) ? 66 : 33), |
| 1056 | ((hw->bus_width == e1000_bus_width_64) ? "64-bit" : "32-bit")); | 1056 | ((hw->bus_width == e1000_bus_width_64) ? 64 : 32), |
| 1057 | 1057 | netdev->dev_addr); | |
| 1058 | e_info("%pM\n", netdev->dev_addr); | ||
| 1059 | 1058 | ||
| 1060 | /* carrier off reporting is important to ethtool even BEFORE open */ | 1059 | /* carrier off reporting is important to ethtool even BEFORE open */ |
| 1061 | netif_carrier_off(netdev); | 1060 | netif_carrier_off(netdev); |
diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h index 0630980a2722..0060e422f171 100644 --- a/drivers/net/ehea/ehea.h +++ b/drivers/net/ehea/ehea.h | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | #include <asm/io.h> | 40 | #include <asm/io.h> |
| 41 | 41 | ||
| 42 | #define DRV_NAME "ehea" | 42 | #define DRV_NAME "ehea" |
| 43 | #define DRV_VERSION "EHEA_0103" | 43 | #define DRV_VERSION "EHEA_0105" |
| 44 | 44 | ||
| 45 | /* eHEA capability flags */ | 45 | /* eHEA capability flags */ |
| 46 | #define DLPAR_PORT_ADD_REM 1 | 46 | #define DLPAR_PORT_ADD_REM 1 |
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index f547894ff48f..8b92acb448c2 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
| @@ -867,6 +867,7 @@ static int ehea_poll(struct napi_struct *napi, int budget) | |||
| 867 | ehea_reset_cq_ep(pr->send_cq); | 867 | ehea_reset_cq_ep(pr->send_cq); |
| 868 | ehea_reset_cq_n1(pr->recv_cq); | 868 | ehea_reset_cq_n1(pr->recv_cq); |
| 869 | ehea_reset_cq_n1(pr->send_cq); | 869 | ehea_reset_cq_n1(pr->send_cq); |
| 870 | rmb(); | ||
| 870 | cqe = ehea_poll_rq1(pr->qp, &wqe_index); | 871 | cqe = ehea_poll_rq1(pr->qp, &wqe_index); |
| 871 | cqe_skb = ehea_poll_cq(pr->send_cq); | 872 | cqe_skb = ehea_poll_cq(pr->send_cq); |
| 872 | 873 | ||
| @@ -2859,6 +2860,7 @@ static void ehea_reset_port(struct work_struct *work) | |||
| 2859 | container_of(work, struct ehea_port, reset_task); | 2860 | container_of(work, struct ehea_port, reset_task); |
| 2860 | struct net_device *dev = port->netdev; | 2861 | struct net_device *dev = port->netdev; |
| 2861 | 2862 | ||
| 2863 | mutex_lock(&dlpar_mem_lock); | ||
| 2862 | port->resets++; | 2864 | port->resets++; |
| 2863 | mutex_lock(&port->port_lock); | 2865 | mutex_lock(&port->port_lock); |
| 2864 | netif_stop_queue(dev); | 2866 | netif_stop_queue(dev); |
| @@ -2881,6 +2883,7 @@ static void ehea_reset_port(struct work_struct *work) | |||
| 2881 | netif_wake_queue(dev); | 2883 | netif_wake_queue(dev); |
| 2882 | out: | 2884 | out: |
| 2883 | mutex_unlock(&port->port_lock); | 2885 | mutex_unlock(&port->port_lock); |
| 2886 | mutex_unlock(&dlpar_mem_lock); | ||
| 2884 | } | 2887 | } |
| 2885 | 2888 | ||
| 2886 | static void ehea_rereg_mrs(struct work_struct *work) | 2889 | static void ehea_rereg_mrs(struct work_struct *work) |
| @@ -3542,10 +3545,7 @@ static int ehea_mem_notifier(struct notifier_block *nb, | |||
| 3542 | int ret = NOTIFY_BAD; | 3545 | int ret = NOTIFY_BAD; |
| 3543 | struct memory_notify *arg = data; | 3546 | struct memory_notify *arg = data; |
| 3544 | 3547 | ||
| 3545 | if (!mutex_trylock(&dlpar_mem_lock)) { | 3548 | mutex_lock(&dlpar_mem_lock); |
| 3546 | ehea_info("ehea_mem_notifier must not be called parallelized"); | ||
| 3547 | goto out; | ||
| 3548 | } | ||
| 3549 | 3549 | ||
| 3550 | switch (action) { | 3550 | switch (action) { |
| 3551 | case MEM_CANCEL_OFFLINE: | 3551 | case MEM_CANCEL_OFFLINE: |
| @@ -3574,7 +3574,6 @@ static int ehea_mem_notifier(struct notifier_block *nb, | |||
| 3574 | 3574 | ||
| 3575 | out_unlock: | 3575 | out_unlock: |
| 3576 | mutex_unlock(&dlpar_mem_lock); | 3576 | mutex_unlock(&dlpar_mem_lock); |
| 3577 | out: | ||
| 3578 | return ret; | 3577 | return ret; |
| 3579 | } | 3578 | } |
| 3580 | 3579 | ||
diff --git a/drivers/net/enic/vnic_dev.c b/drivers/net/enic/vnic_dev.c index 2b3e16db5c82..e0d33281ec98 100644 --- a/drivers/net/enic/vnic_dev.c +++ b/drivers/net/enic/vnic_dev.c | |||
| @@ -709,7 +709,7 @@ int vnic_dev_init_prov(struct vnic_dev *vdev, u8 *buf, u32 len) | |||
| 709 | { | 709 | { |
| 710 | u64 a0, a1 = len; | 710 | u64 a0, a1 = len; |
| 711 | int wait = 1000; | 711 | int wait = 1000; |
| 712 | u64 prov_pa; | 712 | dma_addr_t prov_pa; |
| 713 | void *prov_buf; | 713 | void *prov_buf; |
| 714 | int ret; | 714 | int ret; |
| 715 | 715 | ||
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index 46c69cd06553..28b53d1cd4f1 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
| @@ -381,10 +381,14 @@ static void gfar_init_mac(struct net_device *ndev) | |||
| 381 | /* Insert receive time stamps into padding alignment bytes */ | 381 | /* Insert receive time stamps into padding alignment bytes */ |
| 382 | if (priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER) { | 382 | if (priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER) { |
| 383 | rctrl &= ~RCTRL_PAL_MASK; | 383 | rctrl &= ~RCTRL_PAL_MASK; |
| 384 | rctrl |= RCTRL_PRSDEP_INIT | RCTRL_TS_ENABLE | RCTRL_PADDING(8); | 384 | rctrl |= RCTRL_PADDING(8); |
| 385 | priv->padding = 8; | 385 | priv->padding = 8; |
| 386 | } | 386 | } |
| 387 | 387 | ||
| 388 | /* Enable HW time stamping if requested from user space */ | ||
| 389 | if (priv->hwts_rx_en) | ||
| 390 | rctrl |= RCTRL_PRSDEP_INIT | RCTRL_TS_ENABLE; | ||
| 391 | |||
| 388 | /* keep vlan related bits if it's enabled */ | 392 | /* keep vlan related bits if it's enabled */ |
| 389 | if (priv->vlgrp) { | 393 | if (priv->vlgrp) { |
| 390 | rctrl |= RCTRL_VLEX | RCTRL_PRSDEP_INIT; | 394 | rctrl |= RCTRL_VLEX | RCTRL_PRSDEP_INIT; |
| @@ -747,7 +751,8 @@ static int gfar_of_init(struct of_device *ofdev, struct net_device **pdev) | |||
| 747 | FSL_GIANFAR_DEV_HAS_CSUM | | 751 | FSL_GIANFAR_DEV_HAS_CSUM | |
| 748 | FSL_GIANFAR_DEV_HAS_VLAN | | 752 | FSL_GIANFAR_DEV_HAS_VLAN | |
| 749 | FSL_GIANFAR_DEV_HAS_MAGIC_PACKET | | 753 | FSL_GIANFAR_DEV_HAS_MAGIC_PACKET | |
| 750 | FSL_GIANFAR_DEV_HAS_EXTENDED_HASH; | 754 | FSL_GIANFAR_DEV_HAS_EXTENDED_HASH | |
| 755 | FSL_GIANFAR_DEV_HAS_TIMER; | ||
| 751 | 756 | ||
| 752 | ctype = of_get_property(np, "phy-connection-type", NULL); | 757 | ctype = of_get_property(np, "phy-connection-type", NULL); |
| 753 | 758 | ||
| @@ -805,12 +810,20 @@ static int gfar_hwtstamp_ioctl(struct net_device *netdev, | |||
| 805 | 810 | ||
| 806 | switch (config.rx_filter) { | 811 | switch (config.rx_filter) { |
| 807 | case HWTSTAMP_FILTER_NONE: | 812 | case HWTSTAMP_FILTER_NONE: |
| 808 | priv->hwts_rx_en = 0; | 813 | if (priv->hwts_rx_en) { |
| 814 | stop_gfar(netdev); | ||
| 815 | priv->hwts_rx_en = 0; | ||
| 816 | startup_gfar(netdev); | ||
| 817 | } | ||
| 809 | break; | 818 | break; |
| 810 | default: | 819 | default: |
| 811 | if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER)) | 820 | if (!(priv->device_flags & FSL_GIANFAR_DEV_HAS_TIMER)) |
| 812 | return -ERANGE; | 821 | return -ERANGE; |
| 813 | priv->hwts_rx_en = 1; | 822 | if (!priv->hwts_rx_en) { |
| 823 | stop_gfar(netdev); | ||
| 824 | priv->hwts_rx_en = 1; | ||
| 825 | startup_gfar(netdev); | ||
| 826 | } | ||
| 814 | config.rx_filter = HWTSTAMP_FILTER_ALL; | 827 | config.rx_filter = HWTSTAMP_FILTER_ALL; |
| 815 | break; | 828 | break; |
| 816 | } | 829 | } |
| @@ -2642,6 +2655,10 @@ int gfar_clean_rx_ring(struct gfar_priv_rx_q *rx_queue, int rx_work_limit) | |||
| 2642 | dma_unmap_single(&priv->ofdev->dev, bdp->bufPtr, | 2655 | dma_unmap_single(&priv->ofdev->dev, bdp->bufPtr, |
| 2643 | priv->rx_buffer_size, DMA_FROM_DEVICE); | 2656 | priv->rx_buffer_size, DMA_FROM_DEVICE); |
| 2644 | 2657 | ||
| 2658 | if (unlikely(!(bdp->status & RXBD_ERR) && | ||
| 2659 | bdp->length > priv->rx_buffer_size)) | ||
| 2660 | bdp->status = RXBD_LARGE; | ||
| 2661 | |||
| 2645 | /* We drop the frame if we failed to allocate a new buffer */ | 2662 | /* We drop the frame if we failed to allocate a new buffer */ |
| 2646 | if (unlikely(!newskb || !(bdp->status & RXBD_LAST) || | 2663 | if (unlikely(!newskb || !(bdp->status & RXBD_LAST) || |
| 2647 | bdp->status & RXBD_ERR)) { | 2664 | bdp->status & RXBD_ERR)) { |
diff --git a/drivers/net/ixgbe/ixgbe_ethtool.c b/drivers/net/ixgbe/ixgbe_ethtool.c index c50a7541ffec..3a93a81872b8 100644 --- a/drivers/net/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ixgbe/ixgbe_ethtool.c | |||
| @@ -2077,25 +2077,6 @@ static int ixgbe_get_coalesce(struct net_device *netdev, | |||
| 2077 | return 0; | 2077 | return 0; |
| 2078 | } | 2078 | } |
| 2079 | 2079 | ||
| 2080 | /* | ||
| 2081 | * this function must be called before setting the new value of | ||
| 2082 | * rx_itr_setting | ||
| 2083 | */ | ||
| 2084 | static bool ixgbe_reenable_rsc(struct ixgbe_adapter *adapter, | ||
| 2085 | struct ethtool_coalesce *ec) | ||
| 2086 | { | ||
| 2087 | /* check the old value and enable RSC if necessary */ | ||
| 2088 | if ((adapter->rx_itr_setting == 0) && | ||
| 2089 | (adapter->flags2 & IXGBE_FLAG2_RSC_CAPABLE)) { | ||
| 2090 | adapter->flags2 |= IXGBE_FLAG2_RSC_ENABLED; | ||
| 2091 | adapter->netdev->features |= NETIF_F_LRO; | ||
| 2092 | DPRINTK(PROBE, INFO, "rx-usecs set to %d, re-enabling RSC\n", | ||
| 2093 | ec->rx_coalesce_usecs); | ||
| 2094 | return true; | ||
| 2095 | } | ||
| 2096 | return false; | ||
| 2097 | } | ||
| 2098 | |||
| 2099 | static int ixgbe_set_coalesce(struct net_device *netdev, | 2080 | static int ixgbe_set_coalesce(struct net_device *netdev, |
| 2100 | struct ethtool_coalesce *ec) | 2081 | struct ethtool_coalesce *ec) |
| 2101 | { | 2082 | { |
| @@ -2124,9 +2105,6 @@ static int ixgbe_set_coalesce(struct net_device *netdev, | |||
| 2124 | (1000000/ec->rx_coalesce_usecs < IXGBE_MIN_INT_RATE)) | 2105 | (1000000/ec->rx_coalesce_usecs < IXGBE_MIN_INT_RATE)) |
| 2125 | return -EINVAL; | 2106 | return -EINVAL; |
| 2126 | 2107 | ||
| 2127 | /* check the old value and enable RSC if necessary */ | ||
| 2128 | need_reset = ixgbe_reenable_rsc(adapter, ec); | ||
| 2129 | |||
| 2130 | /* store the value in ints/second */ | 2108 | /* store the value in ints/second */ |
| 2131 | adapter->rx_eitr_param = 1000000/ec->rx_coalesce_usecs; | 2109 | adapter->rx_eitr_param = 1000000/ec->rx_coalesce_usecs; |
| 2132 | 2110 | ||
| @@ -2135,9 +2113,6 @@ static int ixgbe_set_coalesce(struct net_device *netdev, | |||
| 2135 | /* clear the lower bit as its used for dynamic state */ | 2113 | /* clear the lower bit as its used for dynamic state */ |
| 2136 | adapter->rx_itr_setting &= ~1; | 2114 | adapter->rx_itr_setting &= ~1; |
| 2137 | } else if (ec->rx_coalesce_usecs == 1) { | 2115 | } else if (ec->rx_coalesce_usecs == 1) { |
| 2138 | /* check the old value and enable RSC if necessary */ | ||
| 2139 | need_reset = ixgbe_reenable_rsc(adapter, ec); | ||
| 2140 | |||
| 2141 | /* 1 means dynamic mode */ | 2116 | /* 1 means dynamic mode */ |
| 2142 | adapter->rx_eitr_param = 20000; | 2117 | adapter->rx_eitr_param = 20000; |
| 2143 | adapter->rx_itr_setting = 1; | 2118 | adapter->rx_itr_setting = 1; |
| @@ -2157,10 +2132,11 @@ static int ixgbe_set_coalesce(struct net_device *netdev, | |||
| 2157 | */ | 2132 | */ |
| 2158 | if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) { | 2133 | if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) { |
| 2159 | adapter->flags2 &= ~IXGBE_FLAG2_RSC_ENABLED; | 2134 | adapter->flags2 &= ~IXGBE_FLAG2_RSC_ENABLED; |
| 2160 | netdev->features &= ~NETIF_F_LRO; | 2135 | if (netdev->features & NETIF_F_LRO) { |
| 2161 | DPRINTK(PROBE, INFO, | 2136 | netdev->features &= ~NETIF_F_LRO; |
| 2162 | "rx-usecs set to 0, disabling RSC\n"); | 2137 | DPRINTK(PROBE, INFO, "rx-usecs set to 0, " |
| 2163 | 2138 | "disabling LRO/RSC\n"); | |
| 2139 | } | ||
| 2164 | need_reset = true; | 2140 | need_reset = true; |
| 2165 | } | 2141 | } |
| 2166 | } | 2142 | } |
| @@ -2255,6 +2231,9 @@ static int ixgbe_set_flags(struct net_device *netdev, u32 data) | |||
| 2255 | } | 2231 | } |
| 2256 | } else if (!adapter->rx_itr_setting) { | 2232 | } else if (!adapter->rx_itr_setting) { |
| 2257 | netdev->features &= ~ETH_FLAG_LRO; | 2233 | netdev->features &= ~ETH_FLAG_LRO; |
| 2234 | if (data & ETH_FLAG_LRO) | ||
| 2235 | DPRINTK(PROBE, INFO, "rx-usecs set to 0, " | ||
| 2236 | "LRO/RSC cannot be enabled.\n"); | ||
| 2258 | } | 2237 | } |
| 2259 | } | 2238 | } |
| 2260 | 2239 | ||
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index b2af2f67f604..ce30c62a97f7 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -5282,6 +5282,10 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter) | |||
| 5282 | u32 i, missed_rx = 0, mpc, bprc, lxon, lxoff, xon_off_tot; | 5282 | u32 i, missed_rx = 0, mpc, bprc, lxon, lxoff, xon_off_tot; |
| 5283 | u64 non_eop_descs = 0, restart_queue = 0; | 5283 | u64 non_eop_descs = 0, restart_queue = 0; |
| 5284 | 5284 | ||
| 5285 | if (test_bit(__IXGBE_DOWN, &adapter->state) || | ||
| 5286 | test_bit(__IXGBE_RESETTING, &adapter->state)) | ||
| 5287 | return; | ||
| 5288 | |||
| 5285 | if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) { | 5289 | if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) { |
| 5286 | u64 rsc_count = 0; | 5290 | u64 rsc_count = 0; |
| 5287 | u64 rsc_flush = 0; | 5291 | u64 rsc_flush = 0; |
diff --git a/drivers/net/ixgbe/ixgbe_phy.c b/drivers/net/ixgbe/ixgbe_phy.c index 09e1911ff510..48325a5beff2 100644 --- a/drivers/net/ixgbe/ixgbe_phy.c +++ b/drivers/net/ixgbe/ixgbe_phy.c | |||
| @@ -575,6 +575,8 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw) | |||
| 575 | * 4 SFP_DA_CORE1 - 82599-specific | 575 | * 4 SFP_DA_CORE1 - 82599-specific |
| 576 | * 5 SFP_SR/LR_CORE0 - 82599-specific | 576 | * 5 SFP_SR/LR_CORE0 - 82599-specific |
| 577 | * 6 SFP_SR/LR_CORE1 - 82599-specific | 577 | * 6 SFP_SR/LR_CORE1 - 82599-specific |
| 578 | * 7 SFP_act_lmt_DA_CORE0 - 82599-specific | ||
| 579 | * 8 SFP_act_lmt_DA_CORE1 - 82599-specific | ||
| 578 | */ | 580 | */ |
| 579 | if (hw->mac.type == ixgbe_mac_82598EB) { | 581 | if (hw->mac.type == ixgbe_mac_82598EB) { |
| 580 | if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) | 582 | if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) |
diff --git a/drivers/net/lib82596.c b/drivers/net/lib82596.c index ce5d6e909218..c27f4291b350 100644 --- a/drivers/net/lib82596.c +++ b/drivers/net/lib82596.c | |||
| @@ -1343,7 +1343,7 @@ static void set_multicast_list(struct net_device *dev) | |||
| 1343 | DEB(DEB_MULTI, | 1343 | DEB(DEB_MULTI, |
| 1344 | printk(KERN_DEBUG | 1344 | printk(KERN_DEBUG |
| 1345 | "%s: set multicast list, %d entries, promisc %s, allmulti %s\n", | 1345 | "%s: set multicast list, %d entries, promisc %s, allmulti %s\n", |
| 1346 | dev->name, dev->mc_count, | 1346 | dev->name, netdev_mc_count(dev), |
| 1347 | dev->flags & IFF_PROMISC ? "ON" : "OFF", | 1347 | dev->flags & IFF_PROMISC ? "ON" : "OFF", |
| 1348 | dev->flags & IFF_ALLMULTI ? "ON" : "OFF")); | 1348 | dev->flags & IFF_ALLMULTI ? "ON" : "OFF")); |
| 1349 | 1349 | ||
diff --git a/drivers/net/mipsnet.c b/drivers/net/mipsnet.c index 8e9704f5c122..869f0ea43a5b 100644 --- a/drivers/net/mipsnet.c +++ b/drivers/net/mipsnet.c | |||
| @@ -247,7 +247,7 @@ static const struct net_device_ops mipsnet_netdev_ops = { | |||
| 247 | .ndo_set_mac_address = eth_mac_addr, | 247 | .ndo_set_mac_address = eth_mac_addr, |
| 248 | }; | 248 | }; |
| 249 | 249 | ||
| 250 | static int __init mipsnet_probe(struct platform_device *dev) | 250 | static int __devinit mipsnet_probe(struct platform_device *dev) |
| 251 | { | 251 | { |
| 252 | struct net_device *netdev; | 252 | struct net_device *netdev; |
| 253 | int err; | 253 | int err; |
diff --git a/drivers/net/netxen/netxen_nic_ctx.c b/drivers/net/netxen/netxen_nic_ctx.c index f26e54716c88..3a41b6a84a68 100644 --- a/drivers/net/netxen/netxen_nic_ctx.c +++ b/drivers/net/netxen/netxen_nic_ctx.c | |||
| @@ -629,7 +629,8 @@ int netxen_alloc_hw_resources(struct netxen_adapter *adapter) | |||
| 629 | if (addr == NULL) { | 629 | if (addr == NULL) { |
| 630 | dev_err(&pdev->dev, "%s: failed to allocate tx desc ring\n", | 630 | dev_err(&pdev->dev, "%s: failed to allocate tx desc ring\n", |
| 631 | netdev->name); | 631 | netdev->name); |
| 632 | return -ENOMEM; | 632 | err = -ENOMEM; |
| 633 | goto err_out_free; | ||
| 633 | } | 634 | } |
| 634 | 635 | ||
| 635 | tx_ring->desc_head = (struct cmd_desc_type0 *)addr; | 636 | tx_ring->desc_head = (struct cmd_desc_type0 *)addr; |
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index 5c496f8d7c49..29d7b93d0493 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c | |||
| @@ -1159,9 +1159,6 @@ netxen_nic_pci_set_crbwindow_2M(struct netxen_adapter *adapter, ulong off) | |||
| 1159 | 1159 | ||
| 1160 | window = CRB_HI(off); | 1160 | window = CRB_HI(off); |
| 1161 | 1161 | ||
| 1162 | if (adapter->ahw.crb_win == window) | ||
| 1163 | return; | ||
| 1164 | |||
| 1165 | writel(window, addr); | 1162 | writel(window, addr); |
| 1166 | if (readl(addr) != window) { | 1163 | if (readl(addr) != window) { |
| 1167 | if (printk_ratelimit()) | 1164 | if (printk_ratelimit()) |
| @@ -1169,7 +1166,6 @@ netxen_nic_pci_set_crbwindow_2M(struct netxen_adapter *adapter, ulong off) | |||
| 1169 | "failed to set CRB window to %d off 0x%lx\n", | 1166 | "failed to set CRB window to %d off 0x%lx\n", |
| 1170 | window, off); | 1167 | window, off); |
| 1171 | } | 1168 | } |
| 1172 | adapter->ahw.crb_win = window; | ||
| 1173 | } | 1169 | } |
| 1174 | 1170 | ||
| 1175 | static void __iomem * | 1171 | static void __iomem * |
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index 045a7c8f5bdf..c865dda2adf1 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
| @@ -218,7 +218,7 @@ int netxen_alloc_sw_resources(struct netxen_adapter *adapter) | |||
| 218 | if (cmd_buf_arr == NULL) { | 218 | if (cmd_buf_arr == NULL) { |
| 219 | dev_err(&pdev->dev, "%s: failed to allocate cmd buffer ring\n", | 219 | dev_err(&pdev->dev, "%s: failed to allocate cmd buffer ring\n", |
| 220 | netdev->name); | 220 | netdev->name); |
| 221 | return -ENOMEM; | 221 | goto err_out; |
| 222 | } | 222 | } |
| 223 | memset(cmd_buf_arr, 0, TX_BUFF_RINGSIZE(tx_ring)); | 223 | memset(cmd_buf_arr, 0, TX_BUFF_RINGSIZE(tx_ring)); |
| 224 | tx_ring->cmd_buf_arr = cmd_buf_arr; | 224 | tx_ring->cmd_buf_arr = cmd_buf_arr; |
| @@ -230,7 +230,7 @@ int netxen_alloc_sw_resources(struct netxen_adapter *adapter) | |||
| 230 | if (rds_ring == NULL) { | 230 | if (rds_ring == NULL) { |
| 231 | dev_err(&pdev->dev, "%s: failed to allocate rds ring struct\n", | 231 | dev_err(&pdev->dev, "%s: failed to allocate rds ring struct\n", |
| 232 | netdev->name); | 232 | netdev->name); |
| 233 | return -ENOMEM; | 233 | goto err_out; |
| 234 | } | 234 | } |
| 235 | recv_ctx->rds_rings = rds_ring; | 235 | recv_ctx->rds_rings = rds_ring; |
| 236 | 236 | ||
| @@ -1805,9 +1805,10 @@ netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ringid, | |||
| 1805 | netxen_ctx_msg msg = 0; | 1805 | netxen_ctx_msg msg = 0; |
| 1806 | struct list_head *head; | 1806 | struct list_head *head; |
| 1807 | 1807 | ||
| 1808 | spin_lock(&rds_ring->lock); | ||
| 1809 | |||
| 1808 | producer = rds_ring->producer; | 1810 | producer = rds_ring->producer; |
| 1809 | 1811 | ||
| 1810 | spin_lock(&rds_ring->lock); | ||
| 1811 | head = &rds_ring->free_list; | 1812 | head = &rds_ring->free_list; |
| 1812 | while (!list_empty(head)) { | 1813 | while (!list_empty(head)) { |
| 1813 | 1814 | ||
| @@ -1829,7 +1830,6 @@ netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ringid, | |||
| 1829 | 1830 | ||
| 1830 | producer = get_next_index(producer, rds_ring->num_desc); | 1831 | producer = get_next_index(producer, rds_ring->num_desc); |
| 1831 | } | 1832 | } |
| 1832 | spin_unlock(&rds_ring->lock); | ||
| 1833 | 1833 | ||
| 1834 | if (count) { | 1834 | if (count) { |
| 1835 | rds_ring->producer = producer; | 1835 | rds_ring->producer = producer; |
| @@ -1853,6 +1853,8 @@ netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ringid, | |||
| 1853 | NETXEN_RCV_PRODUCER_OFFSET), msg); | 1853 | NETXEN_RCV_PRODUCER_OFFSET), msg); |
| 1854 | } | 1854 | } |
| 1855 | } | 1855 | } |
| 1856 | |||
| 1857 | spin_unlock(&rds_ring->lock); | ||
| 1856 | } | 1858 | } |
| 1857 | 1859 | ||
| 1858 | static void | 1860 | static void |
| @@ -1864,10 +1866,11 @@ netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter, | |||
| 1864 | int producer, count = 0; | 1866 | int producer, count = 0; |
| 1865 | struct list_head *head; | 1867 | struct list_head *head; |
| 1866 | 1868 | ||
| 1867 | producer = rds_ring->producer; | ||
| 1868 | if (!spin_trylock(&rds_ring->lock)) | 1869 | if (!spin_trylock(&rds_ring->lock)) |
| 1869 | return; | 1870 | return; |
| 1870 | 1871 | ||
| 1872 | producer = rds_ring->producer; | ||
| 1873 | |||
| 1871 | head = &rds_ring->free_list; | 1874 | head = &rds_ring->free_list; |
| 1872 | while (!list_empty(head)) { | 1875 | while (!list_empty(head)) { |
| 1873 | 1876 | ||
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c index 6f77a768ba88..bfdef72c5d5e 100644 --- a/drivers/net/pcmcia/pcnet_cs.c +++ b/drivers/net/pcmcia/pcnet_cs.c | |||
| @@ -1727,6 +1727,7 @@ static struct pcmcia_device_id pcnet_ids[] = { | |||
| 1727 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"), | 1727 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"), |
| 1728 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"), | 1728 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"), |
| 1729 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"), | 1729 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"), |
| 1730 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "TOSHIBA", "Modem/LAN Card", 0xb4585a1a, 0x53f922f8, "cis/PCMLM28.cis"), | ||
| 1730 | PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"), | 1731 | PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"), |
| 1731 | PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"), | 1732 | PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"), |
| 1732 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "cis/DP83903.cis"), | 1733 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "cis/DP83903.cis"), |
diff --git a/drivers/net/pcmcia/smc91c92_cs.c b/drivers/net/pcmcia/smc91c92_cs.c index 64e6a84bbbbe..307cd1721e91 100644 --- a/drivers/net/pcmcia/smc91c92_cs.c +++ b/drivers/net/pcmcia/smc91c92_cs.c | |||
| @@ -1505,12 +1505,20 @@ irq_done: | |||
| 1505 | writeb(cor & ~COR_IREQ_ENA, smc->base + MOT_LAN + CISREG_COR); | 1505 | writeb(cor & ~COR_IREQ_ENA, smc->base + MOT_LAN + CISREG_COR); |
| 1506 | writeb(cor, smc->base + MOT_LAN + CISREG_COR); | 1506 | writeb(cor, smc->base + MOT_LAN + CISREG_COR); |
| 1507 | } | 1507 | } |
| 1508 | #ifdef DOES_NOT_WORK | 1508 | |
| 1509 | if (smc->base != NULL) { /* Megahertz MFC's */ | 1509 | if ((smc->base != NULL) && /* Megahertz MFC's */ |
| 1510 | readb(smc->base+MEGAHERTZ_ISR); | 1510 | (smc->manfid == MANFID_MEGAHERTZ) && |
| 1511 | readb(smc->base+MEGAHERTZ_ISR); | 1511 | (smc->cardid == PRODID_MEGAHERTZ_EM3288)) { |
| 1512 | |||
| 1513 | u_char tmp; | ||
| 1514 | tmp = readb(smc->base+MEGAHERTZ_ISR); | ||
| 1515 | tmp = readb(smc->base+MEGAHERTZ_ISR); | ||
| 1516 | |||
| 1517 | /* Retrigger interrupt if needed */ | ||
| 1518 | writeb(tmp, smc->base + MEGAHERTZ_ISR); | ||
| 1519 | writeb(tmp, smc->base + MEGAHERTZ_ISR); | ||
| 1512 | } | 1520 | } |
| 1513 | #endif | 1521 | |
| 1514 | spin_unlock(&smc->lock); | 1522 | spin_unlock(&smc->lock); |
| 1515 | return IRQ_RETVAL(handled); | 1523 | return IRQ_RETVAL(handled); |
| 1516 | } | 1524 | } |
diff --git a/drivers/net/phy/lxt.c b/drivers/net/phy/lxt.c index dbd003453737..29c39ff85de5 100644 --- a/drivers/net/phy/lxt.c +++ b/drivers/net/phy/lxt.c | |||
| @@ -226,6 +226,7 @@ module_exit(lxt_exit); | |||
| 226 | static struct mdio_device_id lxt_tbl[] = { | 226 | static struct mdio_device_id lxt_tbl[] = { |
| 227 | { 0x78100000, 0xfffffff0 }, | 227 | { 0x78100000, 0xfffffff0 }, |
| 228 | { 0x001378e0, 0xfffffff0 }, | 228 | { 0x001378e0, 0xfffffff0 }, |
| 229 | { 0x00137a10, 0xfffffff0 }, | ||
| 229 | { } | 230 | { } |
| 230 | }; | 231 | }; |
| 231 | 232 | ||
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 2111c7bbf578..7985165e84fc 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
| @@ -717,11 +717,24 @@ static void sky2_phy_power_down(struct sky2_hw *hw, unsigned port) | |||
| 717 | sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); | 717 | sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); |
| 718 | } | 718 | } |
| 719 | 719 | ||
| 720 | /* Enable Rx/Tx */ | ||
| 721 | static void sky2_enable_rx_tx(struct sky2_port *sky2) | ||
| 722 | { | ||
| 723 | struct sky2_hw *hw = sky2->hw; | ||
| 724 | unsigned port = sky2->port; | ||
| 725 | u16 reg; | ||
| 726 | |||
| 727 | reg = gma_read16(hw, port, GM_GP_CTRL); | ||
| 728 | reg |= GM_GPCR_RX_ENA | GM_GPCR_TX_ENA; | ||
| 729 | gma_write16(hw, port, GM_GP_CTRL, reg); | ||
| 730 | } | ||
| 731 | |||
| 720 | /* Force a renegotiation */ | 732 | /* Force a renegotiation */ |
| 721 | static void sky2_phy_reinit(struct sky2_port *sky2) | 733 | static void sky2_phy_reinit(struct sky2_port *sky2) |
| 722 | { | 734 | { |
| 723 | spin_lock_bh(&sky2->phy_lock); | 735 | spin_lock_bh(&sky2->phy_lock); |
| 724 | sky2_phy_init(sky2->hw, sky2->port); | 736 | sky2_phy_init(sky2->hw, sky2->port); |
| 737 | sky2_enable_rx_tx(sky2); | ||
| 725 | spin_unlock_bh(&sky2->phy_lock); | 738 | spin_unlock_bh(&sky2->phy_lock); |
| 726 | } | 739 | } |
| 727 | 740 | ||
| @@ -2040,7 +2053,6 @@ static void sky2_link_up(struct sky2_port *sky2) | |||
| 2040 | { | 2053 | { |
| 2041 | struct sky2_hw *hw = sky2->hw; | 2054 | struct sky2_hw *hw = sky2->hw; |
| 2042 | unsigned port = sky2->port; | 2055 | unsigned port = sky2->port; |
| 2043 | u16 reg; | ||
| 2044 | static const char *fc_name[] = { | 2056 | static const char *fc_name[] = { |
| 2045 | [FC_NONE] = "none", | 2057 | [FC_NONE] = "none", |
| 2046 | [FC_TX] = "tx", | 2058 | [FC_TX] = "tx", |
| @@ -2048,10 +2060,7 @@ static void sky2_link_up(struct sky2_port *sky2) | |||
| 2048 | [FC_BOTH] = "both", | 2060 | [FC_BOTH] = "both", |
| 2049 | }; | 2061 | }; |
| 2050 | 2062 | ||
| 2051 | /* enable Rx/Tx */ | 2063 | sky2_enable_rx_tx(sky2); |
| 2052 | reg = gma_read16(hw, port, GM_GP_CTRL); | ||
| 2053 | reg |= GM_GPCR_RX_ENA | GM_GPCR_TX_ENA; | ||
| 2054 | gma_write16(hw, port, GM_GP_CTRL, reg); | ||
| 2055 | 2064 | ||
| 2056 | gm_phy_write(hw, port, PHY_MARV_INT_MASK, PHY_M_DEF_MSK); | 2065 | gm_phy_write(hw, port, PHY_MARV_INT_MASK, PHY_M_DEF_MSK); |
| 2057 | 2066 | ||
diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index 4a34833b85dd..807470e156af 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c | |||
| @@ -3215,6 +3215,8 @@ static int ucc_geth_rx(struct ucc_geth_private *ugeth, u8 rxQ, int rx_work_limit | |||
| 3215 | __func__, __LINE__, (u32) skb); | 3215 | __func__, __LINE__, (u32) skb); |
| 3216 | if (skb) { | 3216 | if (skb) { |
| 3217 | skb->data = skb->head + NET_SKB_PAD; | 3217 | skb->data = skb->head + NET_SKB_PAD; |
| 3218 | skb->len = 0; | ||
| 3219 | skb_reset_tail_pointer(skb); | ||
| 3218 | __skb_queue_head(&ugeth->rx_recycle, skb); | 3220 | __skb_queue_head(&ugeth->rx_recycle, skb); |
| 3219 | } | 3221 | } |
| 3220 | 3222 | ||
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index 0a3c41faea9c..4dd23513c5af 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c | |||
| @@ -1334,7 +1334,6 @@ static int hso_serial_open(struct tty_struct *tty, struct file *filp) | |||
| 1334 | /* check for port already opened, if not set the termios */ | 1334 | /* check for port already opened, if not set the termios */ |
| 1335 | serial->open_count++; | 1335 | serial->open_count++; |
| 1336 | if (serial->open_count == 1) { | 1336 | if (serial->open_count == 1) { |
| 1337 | tty->low_latency = 1; | ||
| 1338 | serial->rx_state = RX_IDLE; | 1337 | serial->rx_state = RX_IDLE; |
| 1339 | /* Force default termio settings */ | 1338 | /* Force default termio settings */ |
| 1340 | _hso_serial_set_termios(tty, NULL); | 1339 | _hso_serial_set_termios(tty, NULL); |
diff --git a/drivers/net/vxge/vxge-main.c b/drivers/net/vxge/vxge-main.c index b504bd561362..d14e207de1df 100644 --- a/drivers/net/vxge/vxge-main.c +++ b/drivers/net/vxge/vxge-main.c | |||
| @@ -2262,7 +2262,8 @@ start: | |||
| 2262 | vxge_debug_init(VXGE_ERR, | 2262 | vxge_debug_init(VXGE_ERR, |
| 2263 | "%s: memory allocation failed", | 2263 | "%s: memory allocation failed", |
| 2264 | VXGE_DRIVER_NAME); | 2264 | VXGE_DRIVER_NAME); |
| 2265 | return -ENOMEM; | 2265 | ret = -ENOMEM; |
| 2266 | goto alloc_entries_failed; | ||
| 2266 | } | 2267 | } |
| 2267 | 2268 | ||
| 2268 | vdev->vxge_entries = | 2269 | vdev->vxge_entries = |
| @@ -2271,8 +2272,8 @@ start: | |||
| 2271 | if (!vdev->vxge_entries) { | 2272 | if (!vdev->vxge_entries) { |
| 2272 | vxge_debug_init(VXGE_ERR, "%s: memory allocation failed", | 2273 | vxge_debug_init(VXGE_ERR, "%s: memory allocation failed", |
| 2273 | VXGE_DRIVER_NAME); | 2274 | VXGE_DRIVER_NAME); |
| 2274 | kfree(vdev->entries); | 2275 | ret = -ENOMEM; |
| 2275 | return -ENOMEM; | 2276 | goto alloc_vxge_entries_failed; |
| 2276 | } | 2277 | } |
| 2277 | 2278 | ||
| 2278 | for (i = 0, j = 0; i < vdev->no_of_vpath; i++) { | 2279 | for (i = 0, j = 0; i < vdev->no_of_vpath; i++) { |
| @@ -2303,22 +2304,32 @@ start: | |||
| 2303 | vxge_debug_init(VXGE_ERR, | 2304 | vxge_debug_init(VXGE_ERR, |
| 2304 | "%s: MSI-X enable failed for %d vectors, ret: %d", | 2305 | "%s: MSI-X enable failed for %d vectors, ret: %d", |
| 2305 | VXGE_DRIVER_NAME, vdev->intr_cnt, ret); | 2306 | VXGE_DRIVER_NAME, vdev->intr_cnt, ret); |
| 2307 | if ((max_config_vpath != VXGE_USE_DEFAULT) || (ret < 3)) { | ||
| 2308 | ret = -ENODEV; | ||
| 2309 | goto enable_msix_failed; | ||
| 2310 | } | ||
| 2311 | |||
| 2306 | kfree(vdev->entries); | 2312 | kfree(vdev->entries); |
| 2307 | kfree(vdev->vxge_entries); | 2313 | kfree(vdev->vxge_entries); |
| 2308 | vdev->entries = NULL; | 2314 | vdev->entries = NULL; |
| 2309 | vdev->vxge_entries = NULL; | 2315 | vdev->vxge_entries = NULL; |
| 2310 | |||
| 2311 | if ((max_config_vpath != VXGE_USE_DEFAULT) || (ret < 3)) | ||
| 2312 | return -ENODEV; | ||
| 2313 | /* Try with less no of vector by reducing no of vpaths count */ | 2316 | /* Try with less no of vector by reducing no of vpaths count */ |
| 2314 | temp = (ret - 1)/2; | 2317 | temp = (ret - 1)/2; |
| 2315 | vxge_close_vpaths(vdev, temp); | 2318 | vxge_close_vpaths(vdev, temp); |
| 2316 | vdev->no_of_vpath = temp; | 2319 | vdev->no_of_vpath = temp; |
| 2317 | goto start; | 2320 | goto start; |
| 2318 | } else if (ret < 0) | 2321 | } else if (ret < 0) { |
| 2319 | return -ENODEV; | 2322 | ret = -ENODEV; |
| 2320 | 2323 | goto enable_msix_failed; | |
| 2324 | } | ||
| 2321 | return 0; | 2325 | return 0; |
| 2326 | |||
| 2327 | enable_msix_failed: | ||
| 2328 | kfree(vdev->vxge_entries); | ||
| 2329 | alloc_vxge_entries_failed: | ||
| 2330 | kfree(vdev->entries); | ||
| 2331 | alloc_entries_failed: | ||
| 2332 | return ret; | ||
| 2322 | } | 2333 | } |
| 2323 | 2334 | ||
| 2324 | static int vxge_enable_msix(struct vxgedev *vdev) | 2335 | static int vxge_enable_msix(struct vxgedev *vdev) |
diff --git a/drivers/net/wireless/ath/ath5k/attach.c b/drivers/net/wireless/ath/ath5k/attach.c index e0c244b02f05..31c008042bfe 100644 --- a/drivers/net/wireless/ath/ath5k/attach.c +++ b/drivers/net/wireless/ath/ath5k/attach.c | |||
| @@ -126,6 +126,7 @@ int ath5k_hw_attach(struct ath5k_softc *sc) | |||
| 126 | ah->ah_ant_mode = AR5K_ANTMODE_DEFAULT; | 126 | ah->ah_ant_mode = AR5K_ANTMODE_DEFAULT; |
| 127 | ah->ah_noise_floor = -95; /* until first NF calibration is run */ | 127 | ah->ah_noise_floor = -95; /* until first NF calibration is run */ |
| 128 | sc->ani_state.ani_mode = ATH5K_ANI_MODE_AUTO; | 128 | sc->ani_state.ani_mode = ATH5K_ANI_MODE_AUTO; |
| 129 | ah->ah_current_channel = &sc->channels[0]; | ||
| 129 | 130 | ||
| 130 | /* | 131 | /* |
| 131 | * Find the mac version | 132 | * Find the mac version |
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index db72461c486b..29b31a694b59 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c | |||
| @@ -594,6 +594,7 @@ static int prism2_config(struct pcmcia_device *link) | |||
| 594 | local_info_t *local; | 594 | local_info_t *local; |
| 595 | int ret = 1; | 595 | int ret = 1; |
| 596 | struct hostap_cs_priv *hw_priv; | 596 | struct hostap_cs_priv *hw_priv; |
| 597 | unsigned long flags; | ||
| 597 | 598 | ||
| 598 | PDEBUG(DEBUG_FLOW, "prism2_config()\n"); | 599 | PDEBUG(DEBUG_FLOW, "prism2_config()\n"); |
| 599 | 600 | ||
| @@ -625,9 +626,15 @@ static int prism2_config(struct pcmcia_device *link) | |||
| 625 | local->hw_priv = hw_priv; | 626 | local->hw_priv = hw_priv; |
| 626 | hw_priv->link = link; | 627 | hw_priv->link = link; |
| 627 | 628 | ||
| 629 | /* | ||
| 630 | * Make sure the IRQ handler cannot proceed until at least | ||
| 631 | * dev->base_addr is initialized. | ||
| 632 | */ | ||
| 633 | spin_lock_irqsave(&local->irq_init_lock, flags); | ||
| 634 | |||
| 628 | ret = pcmcia_request_irq(link, prism2_interrupt); | 635 | ret = pcmcia_request_irq(link, prism2_interrupt); |
| 629 | if (ret) | 636 | if (ret) |
| 630 | goto failed; | 637 | goto failed_unlock; |
| 631 | 638 | ||
| 632 | /* | 639 | /* |
| 633 | * This actually configures the PCMCIA socket -- setting up | 640 | * This actually configures the PCMCIA socket -- setting up |
| @@ -636,11 +643,13 @@ static int prism2_config(struct pcmcia_device *link) | |||
| 636 | */ | 643 | */ |
| 637 | ret = pcmcia_request_configuration(link, &link->conf); | 644 | ret = pcmcia_request_configuration(link, &link->conf); |
| 638 | if (ret) | 645 | if (ret) |
| 639 | goto failed; | 646 | goto failed_unlock; |
| 640 | 647 | ||
| 641 | dev->irq = link->irq; | 648 | dev->irq = link->irq; |
| 642 | dev->base_addr = link->io.BasePort1; | 649 | dev->base_addr = link->io.BasePort1; |
| 643 | 650 | ||
| 651 | spin_unlock_irqrestore(&local->irq_init_lock, flags); | ||
| 652 | |||
| 644 | /* Finally, report what we've done */ | 653 | /* Finally, report what we've done */ |
| 645 | printk(KERN_INFO "%s: index 0x%02x: ", | 654 | printk(KERN_INFO "%s: index 0x%02x: ", |
| 646 | dev_info, link->conf.ConfigIndex); | 655 | dev_info, link->conf.ConfigIndex); |
| @@ -667,6 +676,8 @@ static int prism2_config(struct pcmcia_device *link) | |||
| 667 | 676 | ||
| 668 | return ret; | 677 | return ret; |
| 669 | 678 | ||
| 679 | failed_unlock: | ||
| 680 | spin_unlock_irqrestore(&local->irq_init_lock, flags); | ||
| 670 | failed: | 681 | failed: |
| 671 | kfree(hw_priv); | 682 | kfree(hw_priv); |
| 672 | prism2_release((u_long)link); | 683 | prism2_release((u_long)link); |
diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c index ff9b5c882184..2f999fc94f60 100644 --- a/drivers/net/wireless/hostap/hostap_hw.c +++ b/drivers/net/wireless/hostap/hostap_hw.c | |||
| @@ -2621,6 +2621,18 @@ static irqreturn_t prism2_interrupt(int irq, void *dev_id) | |||
| 2621 | iface = netdev_priv(dev); | 2621 | iface = netdev_priv(dev); |
| 2622 | local = iface->local; | 2622 | local = iface->local; |
| 2623 | 2623 | ||
| 2624 | /* Detect early interrupt before driver is fully configued */ | ||
| 2625 | spin_lock(&local->irq_init_lock); | ||
| 2626 | if (!dev->base_addr) { | ||
| 2627 | if (net_ratelimit()) { | ||
| 2628 | printk(KERN_DEBUG "%s: Interrupt, but dev not configured\n", | ||
| 2629 | dev->name); | ||
| 2630 | } | ||
| 2631 | spin_unlock(&local->irq_init_lock); | ||
| 2632 | return IRQ_HANDLED; | ||
| 2633 | } | ||
| 2634 | spin_unlock(&local->irq_init_lock); | ||
| 2635 | |||
| 2624 | prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INTERRUPT, 0, 0); | 2636 | prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INTERRUPT, 0, 0); |
| 2625 | 2637 | ||
| 2626 | if (local->func->card_present && !local->func->card_present(local)) { | 2638 | if (local->func->card_present && !local->func->card_present(local)) { |
| @@ -3138,6 +3150,7 @@ prism2_init_local_data(struct prism2_helper_functions *funcs, int card_idx, | |||
| 3138 | spin_lock_init(&local->cmdlock); | 3150 | spin_lock_init(&local->cmdlock); |
| 3139 | spin_lock_init(&local->baplock); | 3151 | spin_lock_init(&local->baplock); |
| 3140 | spin_lock_init(&local->lock); | 3152 | spin_lock_init(&local->lock); |
| 3153 | spin_lock_init(&local->irq_init_lock); | ||
| 3141 | mutex_init(&local->rid_bap_mtx); | 3154 | mutex_init(&local->rid_bap_mtx); |
| 3142 | 3155 | ||
| 3143 | if (card_idx < 0 || card_idx >= MAX_PARM_DEVICES) | 3156 | if (card_idx < 0 || card_idx >= MAX_PARM_DEVICES) |
diff --git a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h index 3d238917af07..1ba33be98b25 100644 --- a/drivers/net/wireless/hostap/hostap_wlan.h +++ b/drivers/net/wireless/hostap/hostap_wlan.h | |||
| @@ -654,7 +654,7 @@ struct local_info { | |||
| 654 | rwlock_t iface_lock; /* hostap_interfaces read lock; use write lock | 654 | rwlock_t iface_lock; /* hostap_interfaces read lock; use write lock |
| 655 | * when removing entries from the list. | 655 | * when removing entries from the list. |
| 656 | * TX and RX paths can use read lock. */ | 656 | * TX and RX paths can use read lock. */ |
| 657 | spinlock_t cmdlock, baplock, lock; | 657 | spinlock_t cmdlock, baplock, lock, irq_init_lock; |
| 658 | struct mutex rid_bap_mtx; | 658 | struct mutex rid_bap_mtx; |
| 659 | u16 infofid; /* MAC buffer id for info frame */ | 659 | u16 infofid; /* MAC buffer id for info frame */ |
| 660 | /* txfid, intransmitfid, next_txtid, and next_alloc are protected by | 660 | /* txfid, intransmitfid, next_txtid, and next_alloc are protected by |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c index a732f1094e5d..7d614c4d3c62 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c | |||
| @@ -1299,6 +1299,11 @@ void iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv, | |||
| 1299 | sta_id = ba_resp->sta_id; | 1299 | sta_id = ba_resp->sta_id; |
| 1300 | tid = ba_resp->tid; | 1300 | tid = ba_resp->tid; |
| 1301 | agg = &priv->stations[sta_id].tid[tid].agg; | 1301 | agg = &priv->stations[sta_id].tid[tid].agg; |
| 1302 | if (unlikely(agg->txq_id != scd_flow)) { | ||
| 1303 | IWL_ERR(priv, "BA scd_flow %d does not match txq_id %d\n", | ||
| 1304 | scd_flow, agg->txq_id); | ||
| 1305 | return; | ||
| 1306 | } | ||
| 1302 | 1307 | ||
| 1303 | /* Find index just before block-ack window */ | 1308 | /* Find index just before block-ack window */ |
| 1304 | index = iwl_queue_dec_wrap(ba_resp_scd_ssn & 0xff, txq->q.n_bd); | 1309 | index = iwl_queue_dec_wrap(ba_resp_scd_ssn & 0xff, txq->q.n_bd); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 7726e67044c0..24aff654fa9c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
| @@ -3391,10 +3391,12 @@ static int iwlagn_mac_sta_add(struct ieee80211_hw *hw, | |||
| 3391 | int ret; | 3391 | int ret; |
| 3392 | u8 sta_id; | 3392 | u8 sta_id; |
| 3393 | 3393 | ||
| 3394 | sta_priv->common.sta_id = IWL_INVALID_STATION; | ||
| 3395 | |||
| 3396 | IWL_DEBUG_INFO(priv, "received request to add station %pM\n", | 3394 | IWL_DEBUG_INFO(priv, "received request to add station %pM\n", |
| 3397 | sta->addr); | 3395 | sta->addr); |
| 3396 | mutex_lock(&priv->mutex); | ||
| 3397 | IWL_DEBUG_INFO(priv, "proceeding to add station %pM\n", | ||
| 3398 | sta->addr); | ||
| 3399 | sta_priv->common.sta_id = IWL_INVALID_STATION; | ||
| 3398 | 3400 | ||
| 3399 | atomic_set(&sta_priv->pending_frames, 0); | 3401 | atomic_set(&sta_priv->pending_frames, 0); |
| 3400 | if (vif->type == NL80211_IFTYPE_AP) | 3402 | if (vif->type == NL80211_IFTYPE_AP) |
| @@ -3406,6 +3408,7 @@ static int iwlagn_mac_sta_add(struct ieee80211_hw *hw, | |||
| 3406 | IWL_ERR(priv, "Unable to add station %pM (%d)\n", | 3408 | IWL_ERR(priv, "Unable to add station %pM (%d)\n", |
| 3407 | sta->addr, ret); | 3409 | sta->addr, ret); |
| 3408 | /* Should we return success if return code is EEXIST ? */ | 3410 | /* Should we return success if return code is EEXIST ? */ |
| 3411 | mutex_unlock(&priv->mutex); | ||
| 3409 | return ret; | 3412 | return ret; |
| 3410 | } | 3413 | } |
| 3411 | 3414 | ||
| @@ -3415,6 +3418,7 @@ static int iwlagn_mac_sta_add(struct ieee80211_hw *hw, | |||
| 3415 | IWL_DEBUG_INFO(priv, "Initializing rate scaling for station %pM\n", | 3418 | IWL_DEBUG_INFO(priv, "Initializing rate scaling for station %pM\n", |
| 3416 | sta->addr); | 3419 | sta->addr); |
| 3417 | iwl_rs_rate_init(priv, sta, sta_id); | 3420 | iwl_rs_rate_init(priv, sta, sta_id); |
| 3421 | mutex_unlock(&priv->mutex); | ||
| 3418 | 3422 | ||
| 3419 | return 0; | 3423 | return 0; |
| 3420 | } | 3424 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index 5d3f51ff2f0d..386c5f96eff8 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c | |||
| @@ -491,6 +491,7 @@ void iwl_bg_abort_scan(struct work_struct *work) | |||
| 491 | 491 | ||
| 492 | mutex_lock(&priv->mutex); | 492 | mutex_lock(&priv->mutex); |
| 493 | 493 | ||
| 494 | cancel_delayed_work_sync(&priv->scan_check); | ||
| 494 | set_bit(STATUS_SCAN_ABORTING, &priv->status); | 495 | set_bit(STATUS_SCAN_ABORTING, &priv->status); |
| 495 | iwl_send_scan_abort(priv); | 496 | iwl_send_scan_abort(priv); |
| 496 | 497 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c index 83a26361a9b5..c27c13fbb1ae 100644 --- a/drivers/net/wireless/iwlwifi/iwl-sta.c +++ b/drivers/net/wireless/iwlwifi/iwl-sta.c | |||
| @@ -1373,10 +1373,14 @@ int iwl_mac_sta_remove(struct ieee80211_hw *hw, | |||
| 1373 | 1373 | ||
| 1374 | IWL_DEBUG_INFO(priv, "received request to remove station %pM\n", | 1374 | IWL_DEBUG_INFO(priv, "received request to remove station %pM\n", |
| 1375 | sta->addr); | 1375 | sta->addr); |
| 1376 | mutex_lock(&priv->mutex); | ||
| 1377 | IWL_DEBUG_INFO(priv, "proceeding to remove station %pM\n", | ||
| 1378 | sta->addr); | ||
| 1376 | ret = iwl_remove_station(priv, sta_common->sta_id, sta->addr); | 1379 | ret = iwl_remove_station(priv, sta_common->sta_id, sta->addr); |
| 1377 | if (ret) | 1380 | if (ret) |
| 1378 | IWL_ERR(priv, "Error removing station %pM\n", | 1381 | IWL_ERR(priv, "Error removing station %pM\n", |
| 1379 | sta->addr); | 1382 | sta->addr); |
| 1383 | mutex_unlock(&priv->mutex); | ||
| 1380 | return ret; | 1384 | return ret; |
| 1381 | } | 1385 | } |
| 1382 | EXPORT_SYMBOL(iwl_mac_sta_remove); | 1386 | EXPORT_SYMBOL(iwl_mac_sta_remove); |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 6c353cacc8d6..a27872de4106 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
| @@ -3437,10 +3437,13 @@ static int iwl3945_mac_sta_add(struct ieee80211_hw *hw, | |||
| 3437 | bool is_ap = vif->type == NL80211_IFTYPE_STATION; | 3437 | bool is_ap = vif->type == NL80211_IFTYPE_STATION; |
| 3438 | u8 sta_id; | 3438 | u8 sta_id; |
| 3439 | 3439 | ||
| 3440 | sta_priv->common.sta_id = IWL_INVALID_STATION; | ||
| 3441 | |||
| 3442 | IWL_DEBUG_INFO(priv, "received request to add station %pM\n", | 3440 | IWL_DEBUG_INFO(priv, "received request to add station %pM\n", |
| 3443 | sta->addr); | 3441 | sta->addr); |
| 3442 | mutex_lock(&priv->mutex); | ||
| 3443 | IWL_DEBUG_INFO(priv, "proceeding to add station %pM\n", | ||
| 3444 | sta->addr); | ||
| 3445 | sta_priv->common.sta_id = IWL_INVALID_STATION; | ||
| 3446 | |||
| 3444 | 3447 | ||
| 3445 | ret = iwl_add_station_common(priv, sta->addr, is_ap, &sta->ht_cap, | 3448 | ret = iwl_add_station_common(priv, sta->addr, is_ap, &sta->ht_cap, |
| 3446 | &sta_id); | 3449 | &sta_id); |
| @@ -3448,6 +3451,7 @@ static int iwl3945_mac_sta_add(struct ieee80211_hw *hw, | |||
| 3448 | IWL_ERR(priv, "Unable to add station %pM (%d)\n", | 3451 | IWL_ERR(priv, "Unable to add station %pM (%d)\n", |
| 3449 | sta->addr, ret); | 3452 | sta->addr, ret); |
| 3450 | /* Should we return success if return code is EEXIST ? */ | 3453 | /* Should we return success if return code is EEXIST ? */ |
| 3454 | mutex_unlock(&priv->mutex); | ||
| 3451 | return ret; | 3455 | return ret; |
| 3452 | } | 3456 | } |
| 3453 | 3457 | ||
| @@ -3457,6 +3461,7 @@ static int iwl3945_mac_sta_add(struct ieee80211_hw *hw, | |||
| 3457 | IWL_DEBUG_INFO(priv, "Initializing rate scaling for station %pM\n", | 3461 | IWL_DEBUG_INFO(priv, "Initializing rate scaling for station %pM\n", |
| 3458 | sta->addr); | 3462 | sta->addr); |
| 3459 | iwl3945_rs_rate_init(priv, sta, sta_id); | 3463 | iwl3945_rs_rate_init(priv, sta, sta_id); |
| 3464 | mutex_unlock(&priv->mutex); | ||
| 3460 | 3465 | ||
| 3461 | return 0; | 3466 | return 0; |
| 3462 | } | 3467 | } |
diff --git a/drivers/net/wireless/libertas_tf/main.c b/drivers/net/wireless/libertas_tf/main.c index 6a04c2157f73..817fffc0de4b 100644 --- a/drivers/net/wireless/libertas_tf/main.c +++ b/drivers/net/wireless/libertas_tf/main.c | |||
| @@ -549,7 +549,7 @@ int lbtf_rx(struct lbtf_private *priv, struct sk_buff *skb) | |||
| 549 | 549 | ||
| 550 | prxpd = (struct rxpd *) skb->data; | 550 | prxpd = (struct rxpd *) skb->data; |
| 551 | 551 | ||
| 552 | stats.flag = 0; | 552 | memset(&stats, 0, sizeof(stats)); |
| 553 | if (!(prxpd->status & cpu_to_le16(MRVDRV_RXPD_STATUS_OK))) | 553 | if (!(prxpd->status & cpu_to_le16(MRVDRV_RXPD_STATUS_OK))) |
| 554 | stats.flag |= RX_FLAG_FAILED_FCS_CRC; | 554 | stats.flag |= RX_FLAG_FAILED_FCS_CRC; |
| 555 | stats.freq = priv->cur_freq; | 555 | stats.freq = priv->cur_freq; |
diff --git a/drivers/net/wireless/p54/p54pci.c b/drivers/net/wireless/p54/p54pci.c index 07c4528f6e6b..a5ea89cde8c4 100644 --- a/drivers/net/wireless/p54/p54pci.c +++ b/drivers/net/wireless/p54/p54pci.c | |||
| @@ -41,6 +41,8 @@ static DEFINE_PCI_DEVICE_TABLE(p54p_table) = { | |||
| 41 | { PCI_DEVICE(0x1260, 0x3877) }, | 41 | { PCI_DEVICE(0x1260, 0x3877) }, |
| 42 | /* Intersil PRISM Javelin/Xbow Wireless LAN adapter */ | 42 | /* Intersil PRISM Javelin/Xbow Wireless LAN adapter */ |
| 43 | { PCI_DEVICE(0x1260, 0x3886) }, | 43 | { PCI_DEVICE(0x1260, 0x3886) }, |
| 44 | /* Intersil PRISM Xbow Wireless LAN adapter (Symbol AP-300) */ | ||
| 45 | { PCI_DEVICE(0x1260, 0xffff) }, | ||
| 44 | { }, | 46 | { }, |
| 45 | }; | 47 | }; |
| 46 | 48 | ||
diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index 526307368f8b..ab17c08ddc03 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c | |||
| @@ -821,6 +821,7 @@ static struct pcmcia_device_id serial_ids[] = { | |||
| 821 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"), | 821 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"), |
| 822 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"), | 822 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"), |
| 823 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"), | 823 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"), |
| 824 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "TOSHIBA", "Modem/LAN Card", 0xb4585a1a, 0x53f922f8, "cis/PCMLM28.cis"), | ||
| 824 | PCMCIA_MFC_DEVICE_CIS_PROD_ID12(1, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"), | 825 | PCMCIA_MFC_DEVICE_CIS_PROD_ID12(1, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"), |
| 825 | PCMCIA_MFC_DEVICE_CIS_PROD_ID4(1, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"), | 826 | PCMCIA_MFC_DEVICE_CIS_PROD_ID4(1, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"), |
| 826 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0556, "cis/3CCFEM556.cis"), | 827 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0556, "cis/3CCFEM556.cis"), |
diff --git a/include/net/snmp.h b/include/net/snmp.h index 92456f1035f5..899003d18db9 100644 --- a/include/net/snmp.h +++ b/include/net/snmp.h | |||
| @@ -134,7 +134,7 @@ struct linux_xfrm_mib { | |||
| 134 | #define SNMP_ADD_STATS_USER(mib, field, addend) \ | 134 | #define SNMP_ADD_STATS_USER(mib, field, addend) \ |
| 135 | this_cpu_add(mib[1]->mibs[field], addend) | 135 | this_cpu_add(mib[1]->mibs[field], addend) |
| 136 | #define SNMP_ADD_STATS(mib, field, addend) \ | 136 | #define SNMP_ADD_STATS(mib, field, addend) \ |
| 137 | this_cpu_add(mib[0]->mibs[field], addend) | 137 | this_cpu_add(mib[!in_softirq()]->mibs[field], addend) |
| 138 | /* | 138 | /* |
| 139 | * Use "__typeof__(*mib[0]) *ptr" instead of "__typeof__(mib[0]) ptr" | 139 | * Use "__typeof__(*mib[0]) *ptr" instead of "__typeof__(mib[0]) ptr" |
| 140 | * to make @ptr a non-percpu pointer. | 140 | * to make @ptr a non-percpu pointer. |
diff --git a/net/bluetooth/bnep/netdev.c b/net/bluetooth/bnep/netdev.c index 0faad5ce6dc4..8c100c9dae28 100644 --- a/net/bluetooth/bnep/netdev.c +++ b/net/bluetooth/bnep/netdev.c | |||
| @@ -104,6 +104,8 @@ static void bnep_net_set_mc_list(struct net_device *dev) | |||
| 104 | break; | 104 | break; |
| 105 | memcpy(__skb_put(skb, ETH_ALEN), ha->addr, ETH_ALEN); | 105 | memcpy(__skb_put(skb, ETH_ALEN), ha->addr, ETH_ALEN); |
| 106 | memcpy(__skb_put(skb, ETH_ALEN), ha->addr, ETH_ALEN); | 106 | memcpy(__skb_put(skb, ETH_ALEN), ha->addr, ETH_ALEN); |
| 107 | |||
| 108 | i++; | ||
| 107 | } | 109 | } |
| 108 | r->len = htons(skb->len - len); | 110 | r->len = htons(skb->len - len); |
| 109 | } | 111 | } |
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c index 26637439965b..b01dde35a69e 100644 --- a/net/bridge/br_fdb.c +++ b/net/bridge/br_fdb.c | |||
| @@ -128,7 +128,7 @@ void br_fdb_cleanup(unsigned long _data) | |||
| 128 | { | 128 | { |
| 129 | struct net_bridge *br = (struct net_bridge *)_data; | 129 | struct net_bridge *br = (struct net_bridge *)_data; |
| 130 | unsigned long delay = hold_time(br); | 130 | unsigned long delay = hold_time(br); |
| 131 | unsigned long next_timer = jiffies + br->forward_delay; | 131 | unsigned long next_timer = jiffies + br->ageing_time; |
| 132 | int i; | 132 | int i; |
| 133 | 133 | ||
| 134 | spin_lock_bh(&br->hash_lock); | 134 | spin_lock_bh(&br->hash_lock); |
| @@ -149,9 +149,7 @@ void br_fdb_cleanup(unsigned long _data) | |||
| 149 | } | 149 | } |
| 150 | spin_unlock_bh(&br->hash_lock); | 150 | spin_unlock_bh(&br->hash_lock); |
| 151 | 151 | ||
| 152 | /* Add HZ/4 to ensure we round the jiffies upwards to be after the next | 152 | mod_timer(&br->gc_timer, round_jiffies_up(next_timer)); |
| 153 | * timer, otherwise we might round down and will have no-op run. */ | ||
| 154 | mod_timer(&br->gc_timer, round_jiffies(next_timer + HZ/4)); | ||
| 155 | } | 153 | } |
| 156 | 154 | ||
| 157 | /* Completely flush all dynamic entries in forwarding database.*/ | 155 | /* Completely flush all dynamic entries in forwarding database.*/ |
diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c index a98ef1393097..a4e72a89e4ff 100644 --- a/net/bridge/br_forward.c +++ b/net/bridge/br_forward.c | |||
| @@ -140,10 +140,10 @@ static int deliver_clone(const struct net_bridge_port *prev, | |||
| 140 | void (*__packet_hook)(const struct net_bridge_port *p, | 140 | void (*__packet_hook)(const struct net_bridge_port *p, |
| 141 | struct sk_buff *skb)) | 141 | struct sk_buff *skb)) |
| 142 | { | 142 | { |
| 143 | struct net_device *dev = BR_INPUT_SKB_CB(skb)->brdev; | ||
| 144 | |||
| 143 | skb = skb_clone(skb, GFP_ATOMIC); | 145 | skb = skb_clone(skb, GFP_ATOMIC); |
| 144 | if (!skb) { | 146 | if (!skb) { |
| 145 | struct net_device *dev = BR_INPUT_SKB_CB(skb)->brdev; | ||
| 146 | |||
| 147 | dev->stats.tx_dropped++; | 147 | dev->stats.tx_dropped++; |
| 148 | return -ENOMEM; | 148 | return -ENOMEM; |
| 149 | } | 149 | } |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 9f07e749d7b1..34432b4e96bb 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -532,6 +532,7 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old) | |||
| 532 | new->ip_summed = old->ip_summed; | 532 | new->ip_summed = old->ip_summed; |
| 533 | skb_copy_queue_mapping(new, old); | 533 | skb_copy_queue_mapping(new, old); |
| 534 | new->priority = old->priority; | 534 | new->priority = old->priority; |
| 535 | new->deliver_no_wcard = old->deliver_no_wcard; | ||
| 535 | #if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE) | 536 | #if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE) |
| 536 | new->ipvs_property = old->ipvs_property; | 537 | new->ipvs_property = old->ipvs_property; |
| 537 | #endif | 538 | #endif |
| @@ -569,7 +570,6 @@ static struct sk_buff *__skb_clone(struct sk_buff *n, struct sk_buff *skb) | |||
| 569 | C(len); | 570 | C(len); |
| 570 | C(data_len); | 571 | C(data_len); |
| 571 | C(mac_len); | 572 | C(mac_len); |
| 572 | C(rxhash); | ||
| 573 | n->hdr_len = skb->nohdr ? skb_headroom(skb) : skb->hdr_len; | 573 | n->hdr_len = skb->nohdr ? skb_headroom(skb) : skb->hdr_len; |
| 574 | n->cloned = 1; | 574 | n->cloned = 1; |
| 575 | n->nohdr = 0; | 575 | n->nohdr = 0; |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 9a4a6c96cb0d..041d41df1224 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
| @@ -873,8 +873,10 @@ int ip_append_data(struct sock *sk, | |||
| 873 | !exthdrlen) | 873 | !exthdrlen) |
| 874 | csummode = CHECKSUM_PARTIAL; | 874 | csummode = CHECKSUM_PARTIAL; |
| 875 | 875 | ||
| 876 | skb = skb_peek_tail(&sk->sk_write_queue); | ||
| 877 | |||
| 876 | inet->cork.length += length; | 878 | inet->cork.length += length; |
| 877 | if (((length> mtu) || !skb_queue_empty(&sk->sk_write_queue)) && | 879 | if (((length > mtu) || (skb && skb_is_gso(skb))) && |
| 878 | (sk->sk_protocol == IPPROTO_UDP) && | 880 | (sk->sk_protocol == IPPROTO_UDP) && |
| 879 | (rt->u.dst.dev->features & NETIF_F_UFO)) { | 881 | (rt->u.dst.dev->features & NETIF_F_UFO)) { |
| 880 | err = ip_ufo_append_data(sk, getfrag, from, length, hh_len, | 882 | err = ip_ufo_append_data(sk, getfrag, from, length, hh_len, |
| @@ -892,7 +894,7 @@ int ip_append_data(struct sock *sk, | |||
| 892 | * adding appropriate IP header. | 894 | * adding appropriate IP header. |
| 893 | */ | 895 | */ |
| 894 | 896 | ||
| 895 | if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL) | 897 | if (!skb) |
| 896 | goto alloc_new_skb; | 898 | goto alloc_new_skb; |
| 897 | 899 | ||
| 898 | while (length > 0) { | 900 | while (length > 0) { |
| @@ -1121,7 +1123,8 @@ ssize_t ip_append_page(struct sock *sk, struct page *page, | |||
| 1121 | return -EINVAL; | 1123 | return -EINVAL; |
| 1122 | 1124 | ||
| 1123 | inet->cork.length += size; | 1125 | inet->cork.length += size; |
| 1124 | if ((sk->sk_protocol == IPPROTO_UDP) && | 1126 | if ((size + skb->len > mtu) && |
| 1127 | (sk->sk_protocol == IPPROTO_UDP) && | ||
| 1125 | (rt->u.dst.dev->features & NETIF_F_UFO)) { | 1128 | (rt->u.dst.dev->features & NETIF_F_UFO)) { |
| 1126 | skb_shinfo(skb)->gso_size = mtu - fragheaderlen; | 1129 | skb_shinfo(skb)->gso_size = mtu - fragheaderlen; |
| 1127 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | 1130 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 0abdc242ddb7..2efef52fb461 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
| @@ -586,6 +586,7 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh, | |||
| 586 | src_addr = solicited_addr; | 586 | src_addr = solicited_addr; |
| 587 | if (ifp->flags & IFA_F_OPTIMISTIC) | 587 | if (ifp->flags & IFA_F_OPTIMISTIC) |
| 588 | override = 0; | 588 | override = 0; |
| 589 | inc_opt |= ifp->idev->cnf.force_tllao; | ||
| 589 | in6_ifa_put(ifp); | 590 | in6_ifa_put(ifp); |
| 590 | } else { | 591 | } else { |
| 591 | if (ipv6_dev_get_saddr(dev_net(dev), dev, daddr, | 592 | if (ipv6_dev_get_saddr(dev_net(dev), dev, daddr, |
| @@ -599,7 +600,6 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh, | |||
| 599 | icmp6h.icmp6_solicited = solicited; | 600 | icmp6h.icmp6_solicited = solicited; |
| 600 | icmp6h.icmp6_override = override; | 601 | icmp6h.icmp6_override = override; |
| 601 | 602 | ||
| 602 | inc_opt |= ifp->idev->cnf.force_tllao; | ||
| 603 | __ndisc_send(dev, neigh, daddr, src_addr, | 603 | __ndisc_send(dev, neigh, daddr, src_addr, |
| 604 | &icmp6h, solicited_addr, | 604 | &icmp6h, solicited_addr, |
| 605 | inc_opt ? ND_OPT_TARGET_LL_ADDR : 0); | 605 | inc_opt ? ND_OPT_TARGET_LL_ADDR : 0); |
diff --git a/net/mac80211/work.c b/net/mac80211/work.c index be3d4a698692..b025dc7bb0fd 100644 --- a/net/mac80211/work.c +++ b/net/mac80211/work.c | |||
| @@ -715,7 +715,7 @@ static void ieee80211_work_rx_queued_mgmt(struct ieee80211_local *local, | |||
| 715 | struct ieee80211_rx_status *rx_status; | 715 | struct ieee80211_rx_status *rx_status; |
| 716 | struct ieee80211_mgmt *mgmt; | 716 | struct ieee80211_mgmt *mgmt; |
| 717 | struct ieee80211_work *wk; | 717 | struct ieee80211_work *wk; |
| 718 | enum work_action rma; | 718 | enum work_action rma = WORK_ACT_NONE; |
| 719 | u16 fc; | 719 | u16 fc; |
| 720 | 720 | ||
| 721 | rx_status = (struct ieee80211_rx_status *) skb->cb; | 721 | rx_status = (struct ieee80211_rx_status *) skb->cb; |
diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c index d8f7e8ef67b4..ff04e9edbed6 100644 --- a/net/netfilter/ipvs/ip_vs_conn.c +++ b/net/netfilter/ipvs/ip_vs_conn.c | |||
| @@ -162,6 +162,7 @@ static inline int ip_vs_conn_hash(struct ip_vs_conn *cp) | |||
| 162 | hash = ip_vs_conn_hashkey(cp->af, cp->protocol, &cp->caddr, cp->cport); | 162 | hash = ip_vs_conn_hashkey(cp->af, cp->protocol, &cp->caddr, cp->cport); |
| 163 | 163 | ||
| 164 | ct_write_lock(hash); | 164 | ct_write_lock(hash); |
| 165 | spin_lock(&cp->lock); | ||
| 165 | 166 | ||
| 166 | if (!(cp->flags & IP_VS_CONN_F_HASHED)) { | 167 | if (!(cp->flags & IP_VS_CONN_F_HASHED)) { |
| 167 | list_add(&cp->c_list, &ip_vs_conn_tab[hash]); | 168 | list_add(&cp->c_list, &ip_vs_conn_tab[hash]); |
| @@ -174,6 +175,7 @@ static inline int ip_vs_conn_hash(struct ip_vs_conn *cp) | |||
| 174 | ret = 0; | 175 | ret = 0; |
| 175 | } | 176 | } |
| 176 | 177 | ||
| 178 | spin_unlock(&cp->lock); | ||
| 177 | ct_write_unlock(hash); | 179 | ct_write_unlock(hash); |
| 178 | 180 | ||
| 179 | return ret; | 181 | return ret; |
| @@ -193,6 +195,7 @@ static inline int ip_vs_conn_unhash(struct ip_vs_conn *cp) | |||
| 193 | hash = ip_vs_conn_hashkey(cp->af, cp->protocol, &cp->caddr, cp->cport); | 195 | hash = ip_vs_conn_hashkey(cp->af, cp->protocol, &cp->caddr, cp->cport); |
| 194 | 196 | ||
| 195 | ct_write_lock(hash); | 197 | ct_write_lock(hash); |
| 198 | spin_lock(&cp->lock); | ||
| 196 | 199 | ||
| 197 | if (cp->flags & IP_VS_CONN_F_HASHED) { | 200 | if (cp->flags & IP_VS_CONN_F_HASHED) { |
| 198 | list_del(&cp->c_list); | 201 | list_del(&cp->c_list); |
| @@ -202,6 +205,7 @@ static inline int ip_vs_conn_unhash(struct ip_vs_conn *cp) | |||
| 202 | } else | 205 | } else |
| 203 | ret = 0; | 206 | ret = 0; |
| 204 | 207 | ||
| 208 | spin_unlock(&cp->lock); | ||
| 205 | ct_write_unlock(hash); | 209 | ct_write_unlock(hash); |
| 206 | 210 | ||
| 207 | return ret; | 211 | return ret; |
diff --git a/net/sched/sch_teql.c b/net/sched/sch_teql.c index 3415b6ce1c0a..807643bdcbac 100644 --- a/net/sched/sch_teql.c +++ b/net/sched/sch_teql.c | |||
| @@ -449,6 +449,7 @@ static __init void teql_master_setup(struct net_device *dev) | |||
| 449 | dev->tx_queue_len = 100; | 449 | dev->tx_queue_len = 100; |
| 450 | dev->flags = IFF_NOARP; | 450 | dev->flags = IFF_NOARP; |
| 451 | dev->hard_header_len = LL_MAX_HEADER; | 451 | dev->hard_header_len = LL_MAX_HEADER; |
| 452 | dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; | ||
| 452 | } | 453 | } |
| 453 | 454 | ||
| 454 | static LIST_HEAD(master_dev_list); | 455 | static LIST_HEAD(master_dev_list); |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 4bf27d901333..af1c173be4ad 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
| @@ -2300,7 +2300,8 @@ int xfrm_bundle_ok(struct xfrm_policy *pol, struct xfrm_dst *first, | |||
| 2300 | return 0; | 2300 | return 0; |
| 2301 | if (xdst->xfrm_genid != dst->xfrm->genid) | 2301 | if (xdst->xfrm_genid != dst->xfrm->genid) |
| 2302 | return 0; | 2302 | return 0; |
| 2303 | if (xdst->policy_genid != atomic_read(&xdst->pols[0]->genid)) | 2303 | if (xdst->num_pols > 0 && |
| 2304 | xdst->policy_genid != atomic_read(&xdst->pols[0]->genid)) | ||
| 2304 | return 0; | 2305 | return 0; |
| 2305 | 2306 | ||
| 2306 | if (strict && fl && | 2307 | if (strict && fl && |
