diff options
| -rw-r--r-- | drivers/net/niu.c | 56 | ||||
| -rw-r--r-- | drivers/net/wireless/ath9k/beacon.c | 13 | ||||
| -rw-r--r-- | drivers/net/wireless/ath9k/core.h | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/ath9k/main.c | 14 | ||||
| -rw-r--r-- | include/net/netlink.h | 2 | ||||
| -rw-r--r-- | net/bluetooth/hci_core.c | 3 |
6 files changed, 88 insertions, 1 deletions
diff --git a/drivers/net/niu.c b/drivers/net/niu.c index e4765b713aba..e3be81eba8a4 100644 --- a/drivers/net/niu.c +++ b/drivers/net/niu.c | |||
| @@ -5984,6 +5984,56 @@ static void niu_netif_start(struct niu *np) | |||
| 5984 | niu_enable_interrupts(np, 1); | 5984 | niu_enable_interrupts(np, 1); |
| 5985 | } | 5985 | } |
| 5986 | 5986 | ||
| 5987 | static void niu_reset_buffers(struct niu *np) | ||
| 5988 | { | ||
| 5989 | int i, j, k, err; | ||
| 5990 | |||
| 5991 | if (np->rx_rings) { | ||
| 5992 | for (i = 0; i < np->num_rx_rings; i++) { | ||
| 5993 | struct rx_ring_info *rp = &np->rx_rings[i]; | ||
| 5994 | |||
| 5995 | for (j = 0, k = 0; j < MAX_RBR_RING_SIZE; j++) { | ||
| 5996 | struct page *page; | ||
| 5997 | |||
| 5998 | page = rp->rxhash[j]; | ||
| 5999 | while (page) { | ||
| 6000 | struct page *next = | ||
| 6001 | (struct page *) page->mapping; | ||
| 6002 | u64 base = page->index; | ||
| 6003 | base = base >> RBR_DESCR_ADDR_SHIFT; | ||
| 6004 | rp->rbr[k++] = cpu_to_le32(base); | ||
| 6005 | page = next; | ||
| 6006 | } | ||
| 6007 | } | ||
| 6008 | for (; k < MAX_RBR_RING_SIZE; k++) { | ||
| 6009 | err = niu_rbr_add_page(np, rp, GFP_ATOMIC, k); | ||
| 6010 | if (unlikely(err)) | ||
| 6011 | break; | ||
| 6012 | } | ||
| 6013 | |||
| 6014 | rp->rbr_index = rp->rbr_table_size - 1; | ||
| 6015 | rp->rcr_index = 0; | ||
| 6016 | rp->rbr_pending = 0; | ||
| 6017 | rp->rbr_refill_pending = 0; | ||
| 6018 | } | ||
| 6019 | } | ||
| 6020 | if (np->tx_rings) { | ||
| 6021 | for (i = 0; i < np->num_tx_rings; i++) { | ||
| 6022 | struct tx_ring_info *rp = &np->tx_rings[i]; | ||
| 6023 | |||
| 6024 | for (j = 0; j < MAX_TX_RING_SIZE; j++) { | ||
| 6025 | if (rp->tx_buffs[j].skb) | ||
| 6026 | (void) release_tx_packet(np, rp, j); | ||
| 6027 | } | ||
| 6028 | |||
| 6029 | rp->pending = MAX_TX_RING_SIZE; | ||
| 6030 | rp->prod = 0; | ||
| 6031 | rp->cons = 0; | ||
| 6032 | rp->wrap_bit = 0; | ||
| 6033 | } | ||
| 6034 | } | ||
| 6035 | } | ||
| 6036 | |||
| 5987 | static void niu_reset_task(struct work_struct *work) | 6037 | static void niu_reset_task(struct work_struct *work) |
| 5988 | { | 6038 | { |
| 5989 | struct niu *np = container_of(work, struct niu, reset_task); | 6039 | struct niu *np = container_of(work, struct niu, reset_task); |
| @@ -6006,6 +6056,12 @@ static void niu_reset_task(struct work_struct *work) | |||
| 6006 | 6056 | ||
| 6007 | niu_stop_hw(np); | 6057 | niu_stop_hw(np); |
| 6008 | 6058 | ||
| 6059 | spin_unlock_irqrestore(&np->lock, flags); | ||
| 6060 | |||
| 6061 | niu_reset_buffers(np); | ||
| 6062 | |||
| 6063 | spin_lock_irqsave(&np->lock, flags); | ||
| 6064 | |||
| 6009 | err = niu_init_hw(np); | 6065 | err = niu_init_hw(np); |
| 6010 | if (!err) { | 6066 | if (!err) { |
| 6011 | np->timer.expires = jiffies + HZ; | 6067 | np->timer.expires = jiffies + HZ; |
diff --git a/drivers/net/wireless/ath9k/beacon.c b/drivers/net/wireless/ath9k/beacon.c index caf569401a34..00a0eaa08866 100644 --- a/drivers/net/wireless/ath9k/beacon.c +++ b/drivers/net/wireless/ath9k/beacon.c | |||
| @@ -209,6 +209,7 @@ static struct ath_buf *ath_beacon_generate(struct ath_softc *sc, int if_id) | |||
| 209 | unsigned int curlen; | 209 | unsigned int curlen; |
| 210 | struct ath_txq *cabq; | 210 | struct ath_txq *cabq; |
| 211 | struct ath_txq *mcastq; | 211 | struct ath_txq *mcastq; |
| 212 | struct ieee80211_tx_info *info; | ||
| 212 | avp = sc->sc_vaps[if_id]; | 213 | avp = sc->sc_vaps[if_id]; |
| 213 | 214 | ||
| 214 | mcastq = &avp->av_mcastq; | 215 | mcastq = &avp->av_mcastq; |
| @@ -232,6 +233,18 @@ static struct ath_buf *ath_beacon_generate(struct ath_softc *sc, int if_id) | |||
| 232 | */ | 233 | */ |
| 233 | curlen = skb->len; | 234 | curlen = skb->len; |
| 234 | 235 | ||
| 236 | info = IEEE80211_SKB_CB(skb); | ||
| 237 | if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { | ||
| 238 | /* | ||
| 239 | * TODO: make sure the seq# gets assigned properly (vs. other | ||
| 240 | * TX frames) | ||
| 241 | */ | ||
| 242 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | ||
| 243 | sc->seq_no += 0x10; | ||
| 244 | hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); | ||
| 245 | hdr->seq_ctrl |= cpu_to_le16(sc->seq_no); | ||
| 246 | } | ||
| 247 | |||
| 235 | /* XXX: spin_lock_bh should not be used here, but sparse bitches | 248 | /* XXX: spin_lock_bh should not be used here, but sparse bitches |
| 236 | * otherwise. We should fix sparse :) */ | 249 | * otherwise. We should fix sparse :) */ |
| 237 | spin_lock_bh(&mcastq->axq_lock); | 250 | spin_lock_bh(&mcastq->axq_lock); |
diff --git a/drivers/net/wireless/ath9k/core.h b/drivers/net/wireless/ath9k/core.h index 673b3d81133a..4ee695b76b88 100644 --- a/drivers/net/wireless/ath9k/core.h +++ b/drivers/net/wireless/ath9k/core.h | |||
| @@ -992,6 +992,7 @@ struct ath_softc { | |||
| 992 | u32 sc_txintrperiod; /* tx interrupt batching */ | 992 | u32 sc_txintrperiod; /* tx interrupt batching */ |
| 993 | int sc_haltype2q[ATH9K_WME_AC_VO+1]; /* HAL WME AC -> h/w qnum */ | 993 | int sc_haltype2q[ATH9K_WME_AC_VO+1]; /* HAL WME AC -> h/w qnum */ |
| 994 | u32 sc_ant_tx[8]; /* recent tx frames/antenna */ | 994 | u32 sc_ant_tx[8]; /* recent tx frames/antenna */ |
| 995 | u16 seq_no; /* TX sequence number */ | ||
| 995 | 996 | ||
| 996 | /* Beacon */ | 997 | /* Beacon */ |
| 997 | struct ath9k_tx_queue_info sc_beacon_qi; | 998 | struct ath9k_tx_queue_info sc_beacon_qi; |
diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c index c5107f269f24..99badf1404c3 100644 --- a/drivers/net/wireless/ath9k/main.c +++ b/drivers/net/wireless/ath9k/main.c | |||
| @@ -369,6 +369,20 @@ static int ath9k_tx(struct ieee80211_hw *hw, | |||
| 369 | { | 369 | { |
| 370 | struct ath_softc *sc = hw->priv; | 370 | struct ath_softc *sc = hw->priv; |
| 371 | int hdrlen, padsize; | 371 | int hdrlen, padsize; |
| 372 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||
| 373 | |||
| 374 | /* | ||
| 375 | * As a temporary workaround, assign seq# here; this will likely need | ||
| 376 | * to be cleaned up to work better with Beacon transmission and virtual | ||
| 377 | * BSSes. | ||
| 378 | */ | ||
| 379 | if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { | ||
| 380 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | ||
| 381 | if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT) | ||
| 382 | sc->seq_no += 0x10; | ||
| 383 | hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); | ||
| 384 | hdr->seq_ctrl |= cpu_to_le16(sc->seq_no); | ||
| 385 | } | ||
| 372 | 386 | ||
| 373 | /* Add the padding after the header if this is not already done */ | 387 | /* Add the padding after the header if this is not already done */ |
| 374 | hdrlen = ieee80211_get_hdrlen_from_skb(skb); | 388 | hdrlen = ieee80211_get_hdrlen_from_skb(skb); |
diff --git a/include/net/netlink.h b/include/net/netlink.h index 18024b8cecb8..208fe5a38546 100644 --- a/include/net/netlink.h +++ b/include/net/netlink.h | |||
| @@ -702,7 +702,7 @@ static inline int nla_len(const struct nlattr *nla) | |||
| 702 | */ | 702 | */ |
| 703 | static inline int nla_ok(const struct nlattr *nla, int remaining) | 703 | static inline int nla_ok(const struct nlattr *nla, int remaining) |
| 704 | { | 704 | { |
| 705 | return remaining >= sizeof(*nla) && | 705 | return remaining >= (int) sizeof(*nla) && |
| 706 | nla->nla_len >= sizeof(*nla) && | 706 | nla->nla_len >= sizeof(*nla) && |
| 707 | nla->nla_len <= remaining; | 707 | nla->nla_len <= remaining; |
| 708 | } | 708 | } |
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index f5b21cb93699..278a3ace14f6 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
| @@ -164,6 +164,9 @@ static inline int hci_request(struct hci_dev *hdev, void (*req)(struct hci_dev * | |||
| 164 | { | 164 | { |
| 165 | int ret; | 165 | int ret; |
| 166 | 166 | ||
| 167 | if (!test_bit(HCI_UP, &hdev->flags)) | ||
| 168 | return -ENETDOWN; | ||
| 169 | |||
| 167 | /* Serialize all requests */ | 170 | /* Serialize all requests */ |
| 168 | hci_req_lock(hdev); | 171 | hci_req_lock(hdev); |
| 169 | ret = __hci_request(hdev, req, opt, timeout); | 172 | ret = __hci_request(hdev, req, opt, timeout); |
