static int fill_ctrlset(struct zd_mac *mac, struct sk_buff *skb, struct ieee80211_tx_control *control) { int r; struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; unsigned int frag_len = skb->len + FCS_LEN; unsigned int packet_length; struct zd_ctrlset *cs = (struct zd_ctrlset *) skb_push(skb, sizeof(struct zd_ctrlset)); ZD_ASSERT(frag_len <= 0xffff); cs->modulation = control->tx_rate->hw_value; if (control->flags & IEEE80211_TXCTL_SHORT_PREAMBLE) cs->modulation = control->tx_rate->hw_value_short; cs->tx_length = cpu_to_le16(frag_len); cs_set_control(mac, cs, hdr, control->flags); packet_length = frag_len + sizeof(struct zd_ctrlset) + 10; ZD_ASSERT(packet_length <= 0xffff); /* ZD1211B: Computing the length difference this way, gives us * flexibility to compute the packet length. */ cs->packet_length = cpu_to_le16(zd_chip_is_zd1211b(&mac->chip) ? packet_length - frag_len : packet_length); /* * CURRENT LENGTH: * - transmit frame length in microseconds * - seems to be derived from frame length * - see Cal_Us_Service() in zdinlinef.h * - if macp->bTxBurstEnable is enabled, then multiply by 4 * - bTxBurstEnable is never set in the vendor driver * * SERVICE: * - "for PLCP configuration" * - always 0 except in some situations at 802.11b 11M * - see line 53 of zdinlinef.h */ cs->service = 0; r = zd_calc_tx_length_us(&cs->service, ZD_RATE(cs->modulation), le16_to_cpu(cs->tx_length)); if (r < 0) return r; cs->current_length = cpu_to_le16(r); cs->next_frame_length = 0; return 0; }
static int fill_ctrlset(struct zd_mac *mac, struct ieee80211_txb *txb, int frag_num) { int r; struct sk_buff *skb = txb->fragments[frag_num]; struct ieee80211_hdr_4addr *hdr = (struct ieee80211_hdr_4addr *) skb->data; unsigned int frag_len = skb->len + IEEE80211_FCS_LEN; unsigned int next_frag_len; unsigned int packet_length; struct zd_ctrlset *cs = (struct zd_ctrlset *) skb_push(skb, sizeof(struct zd_ctrlset)); if (frag_num+1 < txb->nr_frags) { next_frag_len = txb->fragments[frag_num+1]->len + IEEE80211_FCS_LEN; } else { next_frag_len = 0; } ZD_ASSERT(frag_len <= 0xffff); ZD_ASSERT(next_frag_len <= 0xffff); cs_set_modulation(mac, cs, hdr); cs->tx_length = cpu_to_le16(frag_len); cs_set_control(mac, cs, hdr); packet_length = frag_len + sizeof(struct zd_ctrlset) + 10; ZD_ASSERT(packet_length <= 0xffff); /* ZD1211B: Computing the length difference this way, gives us * flexibility to compute the packet length. */ cs->packet_length = cpu_to_le16(mac->chip.is_zd1211b ? packet_length - frag_len : packet_length); /* * CURRENT LENGTH: * - transmit frame length in microseconds * - seems to be derived from frame length * - see Cal_Us_Service() in zdinlinef.h * - if macp->bTxBurstEnable is enabled, then multiply by 4 * - bTxBurstEnable is never set in the vendor driver * * SERVICE: * - "for PLCP configuration" * - always 0 except in some situations at 802.11b 11M * - see line 53 of zdinlinef.h */ cs->service = 0; r = zd_calc_tx_length_us(&cs->service, ZD_CS_RATE(cs->modulation), le16_to_cpu(cs->tx_length)); if (r < 0) return r; cs->current_length = cpu_to_le16(r); if (next_frag_len == 0) { cs->next_frame_length = 0; } else { r = zd_calc_tx_length_us(NULL, ZD_CS_RATE(cs->modulation), next_frag_len); if (r < 0) return r; cs->next_frame_length = cpu_to_le16(r); } return 0; }