diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/net/wireless/p54/fwio.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'drivers/net/wireless/p54/fwio.c')
-rw-r--r-- | drivers/net/wireless/p54/fwio.c | 58 |
1 files changed, 51 insertions, 7 deletions
diff --git a/drivers/net/wireless/p54/fwio.c b/drivers/net/wireless/p54/fwio.c index 15b20c29a604..b6a061cbbdec 100644 --- a/drivers/net/wireless/p54/fwio.c +++ b/drivers/net/wireless/p54/fwio.c | |||
@@ -123,10 +123,14 @@ int p54_parse_firmware(struct ieee80211_hw *dev, const struct firmware *fw) | |||
123 | bootrec = (struct bootrec *)&bootrec->data[len]; | 123 | bootrec = (struct bootrec *)&bootrec->data[len]; |
124 | } | 124 | } |
125 | 125 | ||
126 | if (fw_version) | 126 | if (fw_version) { |
127 | wiphy_info(priv->hw->wiphy, | 127 | wiphy_info(priv->hw->wiphy, |
128 | "FW rev %s - Softmac protocol %x.%x\n", | 128 | "FW rev %s - Softmac protocol %x.%x\n", |
129 | fw_version, priv->fw_var >> 8, priv->fw_var & 0xff); | 129 | fw_version, priv->fw_var >> 8, priv->fw_var & 0xff); |
130 | snprintf(dev->wiphy->fw_version, sizeof(dev->wiphy->fw_version), | ||
131 | "%s - %x.%x", fw_version, | ||
132 | priv->fw_var >> 8, priv->fw_var & 0xff); | ||
133 | } | ||
130 | 134 | ||
131 | if (priv->fw_var < 0x500) | 135 | if (priv->fw_var < 0x500) |
132 | wiphy_info(priv->hw->wiphy, | 136 | wiphy_info(priv->hw->wiphy, |
@@ -393,9 +397,9 @@ int p54_scan(struct p54_common *priv, u16 mode, u16 dwell) | |||
393 | union p54_scan_body_union *body; | 397 | union p54_scan_body_union *body; |
394 | struct p54_scan_tail_rate *rate; | 398 | struct p54_scan_tail_rate *rate; |
395 | struct pda_rssi_cal_entry *rssi; | 399 | struct pda_rssi_cal_entry *rssi; |
400 | struct p54_rssi_db_entry *rssi_data; | ||
396 | unsigned int i; | 401 | unsigned int i; |
397 | void *entry; | 402 | void *entry; |
398 | int band = priv->hw->conf.channel->band; | ||
399 | __le16 freq = cpu_to_le16(priv->hw->conf.channel->center_freq); | 403 | __le16 freq = cpu_to_le16(priv->hw->conf.channel->center_freq); |
400 | 404 | ||
401 | skb = p54_alloc_skb(priv, P54_HDR_FLAG_CONTROL_OPSET, sizeof(*head) + | 405 | skb = p54_alloc_skb(priv, P54_HDR_FLAG_CONTROL_OPSET, sizeof(*head) + |
@@ -499,13 +503,14 @@ int p54_scan(struct p54_common *priv, u16 mode, u16 dwell) | |||
499 | } | 503 | } |
500 | 504 | ||
501 | rssi = (struct pda_rssi_cal_entry *) skb_put(skb, sizeof(*rssi)); | 505 | rssi = (struct pda_rssi_cal_entry *) skb_put(skb, sizeof(*rssi)); |
502 | rssi->mul = cpu_to_le16(priv->rssical_db[band].mul); | 506 | rssi_data = p54_rssi_find(priv, le16_to_cpu(freq)); |
503 | rssi->add = cpu_to_le16(priv->rssical_db[band].add); | 507 | rssi->mul = cpu_to_le16(rssi_data->mul); |
508 | rssi->add = cpu_to_le16(rssi_data->add); | ||
504 | if (priv->rxhw == PDR_SYNTH_FRONTEND_LONGBOW) { | 509 | if (priv->rxhw == PDR_SYNTH_FRONTEND_LONGBOW) { |
505 | /* Longbow frontend needs ever more */ | 510 | /* Longbow frontend needs ever more */ |
506 | rssi = (void *) skb_put(skb, sizeof(*rssi)); | 511 | rssi = (void *) skb_put(skb, sizeof(*rssi)); |
507 | rssi->mul = cpu_to_le16(priv->rssical_db[band].longbow_unkn); | 512 | rssi->mul = cpu_to_le16(rssi_data->longbow_unkn); |
508 | rssi->add = cpu_to_le16(priv->rssical_db[band].longbow_unk2); | 513 | rssi->add = cpu_to_le16(rssi_data->longbow_unk2); |
509 | } | 514 | } |
510 | 515 | ||
511 | if (priv->fw_var >= 0x509) { | 516 | if (priv->fw_var >= 0x509) { |
@@ -519,6 +524,7 @@ int p54_scan(struct p54_common *priv, u16 mode, u16 dwell) | |||
519 | hdr->len = cpu_to_le16(skb->len - sizeof(*hdr)); | 524 | hdr->len = cpu_to_le16(skb->len - sizeof(*hdr)); |
520 | 525 | ||
521 | p54_tx(priv, skb); | 526 | p54_tx(priv, skb); |
527 | priv->cur_rssi = rssi_data; | ||
522 | return 0; | 528 | return 0; |
523 | 529 | ||
524 | err: | 530 | err: |
@@ -553,6 +559,7 @@ int p54_set_edcf(struct p54_common *priv) | |||
553 | { | 559 | { |
554 | struct sk_buff *skb; | 560 | struct sk_buff *skb; |
555 | struct p54_edcf *edcf; | 561 | struct p54_edcf *edcf; |
562 | u8 rtd; | ||
556 | 563 | ||
557 | skb = p54_alloc_skb(priv, P54_HDR_FLAG_CONTROL_OPSET, sizeof(*edcf), | 564 | skb = p54_alloc_skb(priv, P54_HDR_FLAG_CONTROL_OPSET, sizeof(*edcf), |
558 | P54_CONTROL_TYPE_DCFINIT, GFP_ATOMIC); | 565 | P54_CONTROL_TYPE_DCFINIT, GFP_ATOMIC); |
@@ -569,9 +576,15 @@ int p54_set_edcf(struct p54_common *priv) | |||
569 | edcf->sifs = 0x0a; | 576 | edcf->sifs = 0x0a; |
570 | edcf->eofpad = 0x06; | 577 | edcf->eofpad = 0x06; |
571 | } | 578 | } |
579 | /* | ||
580 | * calculate the extra round trip delay according to the | ||
581 | * formula from 802.11-2007 17.3.8.6. | ||
582 | */ | ||
583 | rtd = 3 * priv->coverage_class; | ||
584 | edcf->slottime += rtd; | ||
585 | edcf->round_trip_delay = cpu_to_le16(rtd); | ||
572 | /* (see prism54/isl_oid.h for further details) */ | 586 | /* (see prism54/isl_oid.h for further details) */ |
573 | edcf->frameburst = cpu_to_le16(0); | 587 | edcf->frameburst = cpu_to_le16(0); |
574 | edcf->round_trip_delay = cpu_to_le16(0); | ||
575 | edcf->flags = 0; | 588 | edcf->flags = 0; |
576 | memset(edcf->mapping, 0, sizeof(edcf->mapping)); | 589 | memset(edcf->mapping, 0, sizeof(edcf->mapping)); |
577 | memcpy(edcf->queue, priv->qos_params, sizeof(edcf->queue)); | 590 | memcpy(edcf->queue, priv->qos_params, sizeof(edcf->queue)); |
@@ -714,3 +727,34 @@ int p54_fetch_statistics(struct p54_common *priv) | |||
714 | p54_tx(priv, skb); | 727 | p54_tx(priv, skb); |
715 | return 0; | 728 | return 0; |
716 | } | 729 | } |
730 | |||
731 | int p54_set_groupfilter(struct p54_common *priv) | ||
732 | { | ||
733 | struct p54_group_address_table *grp; | ||
734 | struct sk_buff *skb; | ||
735 | bool on = false; | ||
736 | |||
737 | skb = p54_alloc_skb(priv, P54_HDR_FLAG_CONTROL_OPSET, sizeof(*grp), | ||
738 | P54_CONTROL_TYPE_GROUP_ADDRESS_TABLE, GFP_KERNEL); | ||
739 | if (!skb) | ||
740 | return -ENOMEM; | ||
741 | |||
742 | grp = (struct p54_group_address_table *)skb_put(skb, sizeof(*grp)); | ||
743 | |||
744 | on = !(priv->filter_flags & FIF_ALLMULTI) && | ||
745 | (priv->mc_maclist_num > 0 && | ||
746 | priv->mc_maclist_num <= MC_FILTER_ADDRESS_NUM); | ||
747 | |||
748 | if (on) { | ||
749 | grp->filter_enable = cpu_to_le16(1); | ||
750 | grp->num_address = cpu_to_le16(priv->mc_maclist_num); | ||
751 | memcpy(grp->mac_list, priv->mc_maclist, sizeof(grp->mac_list)); | ||
752 | } else { | ||
753 | grp->filter_enable = cpu_to_le16(0); | ||
754 | grp->num_address = cpu_to_le16(0); | ||
755 | memset(grp->mac_list, 0, sizeof(grp->mac_list)); | ||
756 | } | ||
757 | |||
758 | p54_tx(priv, skb); | ||
759 | return 0; | ||
760 | } | ||