diff options
author | Chaoming_Li <chaoming_li@realsil.com.cn> | 2011-04-25 13:53:40 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-04-26 16:13:33 -0400 |
commit | 3ac5e26a1e935469a8bdae1d624bc3b59d1fcdc5 (patch) | |
tree | b6b38209110543bda9e9c62db96733226f035344 /drivers/net/wireless/rtlwifi/rtl8192c | |
parent | beb5bc4020436ee50bd50e82c5a64eb087f0e3b3 (diff) |
rtlwifi: rtl8192c-common: Change common firmware routines for addition of rtl8192se and rtl8192de
Change common firmware routines for addition of RTL8192SE and
RTL8192DE code.
Signed-off-by: Chaoming_Li <chaoming_li@realsil.com.cn>
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rtlwifi/rtl8192c')
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c | 81 | ||||
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h | 4 |
2 files changed, 52 insertions, 33 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c index bc9d24134ac4..50303e1adff1 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c +++ b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c | |||
@@ -223,29 +223,15 @@ int rtl92c_download_fw(struct ieee80211_hw *hw) | |||
223 | u8 *pfwdata; | 223 | u8 *pfwdata; |
224 | u32 fwsize; | 224 | u32 fwsize; |
225 | enum version_8192c version = rtlhal->version; | 225 | enum version_8192c version = rtlhal->version; |
226 | const struct firmware *firmware; | ||
227 | 226 | ||
228 | printk(KERN_INFO "rtl8192c: Loading firmware file %s\n", | 227 | printk(KERN_INFO "rtl8192c: Loading firmware file %s\n", |
229 | rtlpriv->cfg->fw_name); | 228 | rtlpriv->cfg->fw_name); |
230 | if (request_firmware(&firmware, rtlpriv->cfg->fw_name, | 229 | if (!rtlhal->pfirmware) |
231 | rtlpriv->io.dev)) { | ||
232 | printk(KERN_ERR "rtl8192c: Firmware loading failed\n"); | ||
233 | return 1; | 230 | return 1; |
234 | } | ||
235 | |||
236 | if (firmware->size > 0x4000) { | ||
237 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, | ||
238 | ("Firmware is too big!\n")); | ||
239 | release_firmware(firmware); | ||
240 | return 1; | ||
241 | } | ||
242 | |||
243 | memcpy(rtlhal->pfirmware, firmware->data, firmware->size); | ||
244 | fwsize = firmware->size; | ||
245 | release_firmware(firmware); | ||
246 | 231 | ||
247 | pfwheader = (struct rtl92c_firmware_header *)rtlhal->pfirmware; | 232 | pfwheader = (struct rtl92c_firmware_header *)rtlhal->pfirmware; |
248 | pfwdata = (u8 *) rtlhal->pfirmware; | 233 | pfwdata = (u8 *) rtlhal->pfirmware; |
234 | fwsize = rtlhal->fwsize; | ||
249 | 235 | ||
250 | if (IS_FW_HEADER_EXIST(pfwheader)) { | 236 | if (IS_FW_HEADER_EXIST(pfwheader)) { |
251 | RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG, | 237 | RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG, |
@@ -553,6 +539,39 @@ void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode) | |||
553 | } | 539 | } |
554 | EXPORT_SYMBOL(rtl92c_set_fw_pwrmode_cmd); | 540 | EXPORT_SYMBOL(rtl92c_set_fw_pwrmode_cmd); |
555 | 541 | ||
542 | static bool _rtl92c_cmd_send_packet(struct ieee80211_hw *hw, | ||
543 | struct sk_buff *skb) | ||
544 | { | ||
545 | struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
546 | struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); | ||
547 | struct rtl8192_tx_ring *ring; | ||
548 | struct rtl_tx_desc *pdesc; | ||
549 | u8 own; | ||
550 | unsigned long flags; | ||
551 | struct sk_buff *pskb = NULL; | ||
552 | |||
553 | ring = &rtlpci->tx_ring[BEACON_QUEUE]; | ||
554 | |||
555 | pskb = __skb_dequeue(&ring->queue); | ||
556 | if (pskb) | ||
557 | kfree_skb(pskb); | ||
558 | |||
559 | spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags); | ||
560 | |||
561 | pdesc = &ring->desc[0]; | ||
562 | own = (u8) rtlpriv->cfg->ops->get_desc((u8 *) pdesc, true, HW_DESC_OWN); | ||
563 | |||
564 | rtlpriv->cfg->ops->fill_tx_cmddesc(hw, (u8 *) pdesc, 1, 1, skb); | ||
565 | |||
566 | __skb_queue_tail(&ring->queue, skb); | ||
567 | |||
568 | spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags); | ||
569 | |||
570 | rtlpriv->cfg->ops->tx_polling(hw, BEACON_QUEUE); | ||
571 | |||
572 | return true; | ||
573 | } | ||
574 | |||
556 | #define BEACON_PG 0 /*->1*/ | 575 | #define BEACON_PG 0 /*->1*/ |
557 | #define PSPOLL_PG 2 | 576 | #define PSPOLL_PG 2 |
558 | #define NULL_PG 3 | 577 | #define NULL_PG 3 |
@@ -670,7 +689,7 @@ static u8 reserved_page_packet[TOTAL_RESERVED_PKT_LEN] = { | |||
670 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 689 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
671 | }; | 690 | }; |
672 | 691 | ||
673 | void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished) | 692 | void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool dl_finished) |
674 | { | 693 | { |
675 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 694 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
676 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); | 695 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); |
@@ -679,12 +698,12 @@ void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished) | |||
679 | u32 totalpacketlen; | 698 | u32 totalpacketlen; |
680 | bool rtstatus; | 699 | bool rtstatus; |
681 | u8 u1RsvdPageLoc[3] = {0}; | 700 | u8 u1RsvdPageLoc[3] = {0}; |
682 | bool b_dlok = false; | 701 | bool dlok = false; |
683 | 702 | ||
684 | u8 *beacon; | 703 | u8 *beacon; |
685 | u8 *p_pspoll; | 704 | u8 *pspoll; |
686 | u8 *nullfunc; | 705 | u8 *nullfunc; |
687 | u8 *p_probersp; | 706 | u8 *probersp; |
688 | /*--------------------------------------------------------- | 707 | /*--------------------------------------------------------- |
689 | (1) beacon | 708 | (1) beacon |
690 | ---------------------------------------------------------*/ | 709 | ---------------------------------------------------------*/ |
@@ -695,10 +714,10 @@ void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished) | |||
695 | /*------------------------------------------------------- | 714 | /*------------------------------------------------------- |
696 | (2) ps-poll | 715 | (2) ps-poll |
697 | --------------------------------------------------------*/ | 716 | --------------------------------------------------------*/ |
698 | p_pspoll = &reserved_page_packet[PSPOLL_PG * 128]; | 717 | pspoll = &reserved_page_packet[PSPOLL_PG * 128]; |
699 | SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000)); | 718 | SET_80211_PS_POLL_AID(pspoll, (mac->assoc_id | 0xc000)); |
700 | SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid); | 719 | SET_80211_PS_POLL_BSSID(pspoll, mac->bssid); |
701 | SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr); | 720 | SET_80211_PS_POLL_TA(pspoll, mac->mac_addr); |
702 | 721 | ||
703 | SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG); | 722 | SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG); |
704 | 723 | ||
@@ -715,10 +734,10 @@ void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished) | |||
715 | /*--------------------------------------------------------- | 734 | /*--------------------------------------------------------- |
716 | (4) probe response | 735 | (4) probe response |
717 | ----------------------------------------------------------*/ | 736 | ----------------------------------------------------------*/ |
718 | p_probersp = &reserved_page_packet[PROBERSP_PG * 128]; | 737 | probersp = &reserved_page_packet[PROBERSP_PG * 128]; |
719 | SET_80211_HDR_ADDRESS1(p_probersp, mac->bssid); | 738 | SET_80211_HDR_ADDRESS1(probersp, mac->bssid); |
720 | SET_80211_HDR_ADDRESS2(p_probersp, mac->mac_addr); | 739 | SET_80211_HDR_ADDRESS2(probersp, mac->mac_addr); |
721 | SET_80211_HDR_ADDRESS3(p_probersp, mac->bssid); | 740 | SET_80211_HDR_ADDRESS3(probersp, mac->bssid); |
722 | 741 | ||
723 | SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1RsvdPageLoc, PROBERSP_PG); | 742 | SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1RsvdPageLoc, PROBERSP_PG); |
724 | 743 | ||
@@ -736,12 +755,12 @@ void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished) | |||
736 | memcpy((u8 *) skb_put(skb, totalpacketlen), | 755 | memcpy((u8 *) skb_put(skb, totalpacketlen), |
737 | &reserved_page_packet, totalpacketlen); | 756 | &reserved_page_packet, totalpacketlen); |
738 | 757 | ||
739 | rtstatus = rtlpriv->cfg->ops->cmd_send_packet(hw, skb); | 758 | rtstatus = _rtl92c_cmd_send_packet(hw, skb); |
740 | 759 | ||
741 | if (rtstatus) | 760 | if (rtstatus) |
742 | b_dlok = true; | 761 | dlok = true; |
743 | 762 | ||
744 | if (b_dlok) { | 763 | if (dlok) { |
745 | RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, | 764 | RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, |
746 | ("Set RSVD page location to Fw.\n")); | 765 | ("Set RSVD page location to Fw.\n")); |
747 | RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, | 766 | RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h index 3db33bd14666..3d5823c12621 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h +++ b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h | |||
@@ -27,8 +27,8 @@ | |||
27 | * | 27 | * |
28 | *****************************************************************************/ | 28 | *****************************************************************************/ |
29 | 29 | ||
30 | #ifndef __RTL92C__FW__H__ | 30 | #ifndef __RTL92C__FW__COMMON__H__ |
31 | #define __RTL92C__FW__H__ | 31 | #define __RTL92C__FW__COMMON__H__ |
32 | 32 | ||
33 | #define FW_8192C_SIZE 0x3000 | 33 | #define FW_8192C_SIZE 0x3000 |
34 | #define FW_8192C_START_ADDRESS 0x1000 | 34 | #define FW_8192C_START_ADDRESS 0x1000 |