aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2500usb.c
diff options
context:
space:
mode:
authorIvo van Doorn <ivdoorn@gmail.com>2008-07-09 09:12:44 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-07-14 14:52:56 -0400
commitbd88a7812f1afd50549f3789cacb707b983fef54 (patch)
tree53818d0fbfacabca3ac5f64bf524f5f71952fa27 /drivers/net/wireless/rt2x00/rt2500usb.c
parente360c4cb2bc2fb2a37981809685984efe8433c52 (diff)
rt2x00: Reorganize beacon handling
With the new beacon handling from mac80211 we can reorganize the beacon handling in rt2x00 as well. This patch will move the function to the TX handlers, and move all duplicate code into rt2x00queue.c. After this change the descriptor helper functions from rt2x00queue.c no longer need to be exported outside of rt2x00lib and can be declared static. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2500usb.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt2500usb.c154
1 files changed, 60 insertions, 94 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index 8ce1726d7508..1423fd0bdbb3 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -1100,6 +1100,65 @@ static void rt2500usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
1100 rt2x00_desc_write(txd, 0, word); 1100 rt2x00_desc_write(txd, 0, word);
1101} 1101}
1102 1102
1103/*
1104 * TX data initialization
1105 */
1106static void rt2500usb_beacondone(struct urb *urb);
1107
1108static void rt2500usb_write_beacon(struct queue_entry *entry)
1109{
1110 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
1111 struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev);
1112 struct queue_entry_priv_usb_bcn *bcn_priv = entry->priv_data;
1113 struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
1114 int pipe = usb_sndbulkpipe(usb_dev, 1);
1115 int length;
1116 u16 reg;
1117
1118 /*
1119 * Add the descriptor in front of the skb.
1120 */
1121 skb_push(entry->skb, entry->queue->desc_size);
1122 memcpy(entry->skb->data, skbdesc->desc, skbdesc->desc_len);
1123 skbdesc->desc = entry->skb->data;
1124
1125 /*
1126 * Disable beaconing while we are reloading the beacon data,
1127 * otherwise we might be sending out invalid data.
1128 */
1129 rt2500usb_register_read(rt2x00dev, TXRX_CSR19, &reg);
1130 rt2x00_set_field16(&reg, TXRX_CSR19_TSF_COUNT, 0);
1131 rt2x00_set_field16(&reg, TXRX_CSR19_TBCN, 0);
1132 rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 0);
1133 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
1134
1135 /*
1136 * USB devices cannot blindly pass the skb->len as the
1137 * length of the data to usb_fill_bulk_urb. Pass the skb
1138 * to the driver to determine what the length should be.
1139 */
1140 length = rt2x00dev->ops->lib->get_tx_data_len(rt2x00dev, entry->skb);
1141
1142 usb_fill_bulk_urb(bcn_priv->urb, usb_dev, pipe,
1143 entry->skb->data, length, rt2500usb_beacondone,
1144 entry);
1145
1146 /*
1147 * Second we need to create the guardian byte.
1148 * We only need a single byte, so lets recycle
1149 * the 'flags' field we are not using for beacons.
1150 */
1151 bcn_priv->guardian_data = 0;
1152 usb_fill_bulk_urb(bcn_priv->guardian_urb, usb_dev, pipe,
1153 &bcn_priv->guardian_data, 1, rt2500usb_beacondone,
1154 entry);
1155
1156 /*
1157 * Send out the guardian byte.
1158 */
1159 usb_submit_urb(bcn_priv->guardian_urb, GFP_ATOMIC);
1160}
1161
1103static int rt2500usb_get_tx_data_len(struct rt2x00_dev *rt2x00dev, 1162static int rt2500usb_get_tx_data_len(struct rt2x00_dev *rt2x00dev,
1104 struct sk_buff *skb) 1163 struct sk_buff *skb)
1105{ 1164{
@@ -1115,9 +1174,6 @@ static int rt2500usb_get_tx_data_len(struct rt2x00_dev *rt2x00dev,
1115 return length; 1174 return length;
1116} 1175}
1117 1176
1118/*
1119 * TX data initialization
1120 */
1121static void rt2500usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev, 1177static void rt2500usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev,
1122 const enum data_queue_qid queue) 1178 const enum data_queue_qid queue)
1123{ 1179{
@@ -1672,96 +1728,6 @@ static int rt2500usb_probe_hw(struct rt2x00_dev *rt2x00dev)
1672 return 0; 1728 return 0;
1673} 1729}
1674 1730
1675/*
1676 * IEEE80211 stack callback functions.
1677 */
1678static int rt2500usb_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb)
1679{
1680 struct rt2x00_dev *rt2x00dev = hw->priv;
1681 struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev);
1682 struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
1683 struct rt2x00_intf *intf = vif_to_intf(tx_info->control.vif);
1684 struct queue_entry_priv_usb_bcn *bcn_priv;
1685 struct skb_frame_desc *skbdesc;
1686 struct txentry_desc txdesc;
1687 int pipe = usb_sndbulkpipe(usb_dev, 1);
1688 int length;
1689 u16 reg;
1690
1691 if (unlikely(!intf->beacon))
1692 return -ENOBUFS;
1693
1694 bcn_priv = intf->beacon->priv_data;
1695
1696 /*
1697 * Copy all TX descriptor information into txdesc,
1698 * after that we are free to use the skb->cb array
1699 * for our information.
1700 */
1701 intf->beacon->skb = skb;
1702 rt2x00queue_create_tx_descriptor(intf->beacon, &txdesc);
1703
1704 /*
1705 * Add the descriptor in front of the skb.
1706 */
1707 skb_push(skb, intf->beacon->queue->desc_size);
1708 memset(skb->data, 0, intf->beacon->queue->desc_size);
1709
1710 /*
1711 * Fill in skb descriptor
1712 */
1713 skbdesc = get_skb_frame_desc(skb);
1714 memset(skbdesc, 0, sizeof(*skbdesc));
1715 skbdesc->desc = skb->data;
1716 skbdesc->desc_len = intf->beacon->queue->desc_size;
1717 skbdesc->entry = intf->beacon;
1718
1719 /*
1720 * Disable beaconing while we are reloading the beacon data,
1721 * otherwise we might be sending out invalid data.
1722 */
1723 rt2500usb_register_read(rt2x00dev, TXRX_CSR19, &reg);
1724 rt2x00_set_field16(&reg, TXRX_CSR19_TSF_COUNT, 0);
1725 rt2x00_set_field16(&reg, TXRX_CSR19_TBCN, 0);
1726 rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 0);
1727 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
1728
1729 rt2x00queue_write_tx_descriptor(intf->beacon, &txdesc);
1730
1731 /*
1732 * USB devices cannot blindly pass the skb->len as the
1733 * length of the data to usb_fill_bulk_urb. Pass the skb
1734 * to the driver to determine what the length should be.
1735 */
1736 length = rt2500usb_get_tx_data_len(rt2x00dev, skb);
1737
1738 usb_fill_bulk_urb(bcn_priv->urb, usb_dev, pipe,
1739 skb->data, length, rt2500usb_beacondone,
1740 intf->beacon);
1741
1742 /*
1743 * Second we need to create the guardian byte.
1744 * We only need a single byte, so lets recycle
1745 * the 'flags' field we are not using for beacons.
1746 */
1747 bcn_priv->guardian_data = 0;
1748 usb_fill_bulk_urb(bcn_priv->guardian_urb, usb_dev, pipe,
1749 &bcn_priv->guardian_data, 1, rt2500usb_beacondone,
1750 intf->beacon);
1751
1752 /*
1753 * Send out the guardian byte.
1754 */
1755 usb_submit_urb(bcn_priv->guardian_urb, GFP_ATOMIC);
1756
1757 /*
1758 * Enable beacon generation.
1759 */
1760 rt2500usb_kick_tx_queue(rt2x00dev, QID_BEACON);
1761
1762 return 0;
1763}
1764
1765static const struct ieee80211_ops rt2500usb_mac80211_ops = { 1731static const struct ieee80211_ops rt2500usb_mac80211_ops = {
1766 .tx = rt2x00mac_tx, 1732 .tx = rt2x00mac_tx,
1767 .start = rt2x00mac_start, 1733 .start = rt2x00mac_start,
@@ -1789,10 +1755,10 @@ static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = {
1789 .link_tuner = rt2500usb_link_tuner, 1755 .link_tuner = rt2500usb_link_tuner,
1790 .write_tx_desc = rt2500usb_write_tx_desc, 1756 .write_tx_desc = rt2500usb_write_tx_desc,
1791 .write_tx_data = rt2x00usb_write_tx_data, 1757 .write_tx_data = rt2x00usb_write_tx_data,
1758 .write_beacon = rt2500usb_write_beacon,
1792 .get_tx_data_len = rt2500usb_get_tx_data_len, 1759 .get_tx_data_len = rt2500usb_get_tx_data_len,
1793 .kick_tx_queue = rt2500usb_kick_tx_queue, 1760 .kick_tx_queue = rt2500usb_kick_tx_queue,
1794 .fill_rxdone = rt2500usb_fill_rxdone, 1761 .fill_rxdone = rt2500usb_fill_rxdone,
1795 .beacon_update = rt2500usb_beacon_update,
1796 .config_filter = rt2500usb_config_filter, 1762 .config_filter = rt2500usb_config_filter,
1797 .config_intf = rt2500usb_config_intf, 1763 .config_intf = rt2500usb_config_intf,
1798 .config_erp = rt2500usb_config_erp, 1764 .config_erp = rt2500usb_config_erp,