aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-08-05 16:18:20 -0400
committerDavid S. Miller <davem@davemloft.net>2014-08-05 16:18:20 -0400
commitaef4f5b6db654e512ebcccab2a6e50424c05d2f9 (patch)
tree4daaee5ac85d1128233a45908dac5212f38ec7aa
parent61ab9efddf51cbc0d57356a4d650785cf5721fbe (diff)
parentdc6be9f54a4ecb0a09765d1f515ed947d86b7528 (diff)
Merge tag 'master-2014-07-31' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next
Conflicts: net/6lowpan/iphc.c Minor conflicts in iphc.c were changes overlapping with some style cleanups. John W. Linville says: ==================== Please pull this last(?) batch of wireless change intended for the 3.17 stream... For the NFC bits, Samuel says: "This is a rather quiet one, we have: - A new driver from ST Microelectronics for their NCI ST21NFCB, including device tree support. - p2p support for the ST21NFCA driver - A few fixes an enhancements for the NFC digital laye" For the Atheros bits, Kalle says: "Michal and Janusz did some important RX aggregation fixes, basically we were missing RX reordering altogether. The 10.1 firmware doesn't support Ad-Hoc mode and Michal fixed ath10k so that it doesn't advertise Ad-Hoc support with that firmware. Also he implemented a workaround for a KVM issue." For the Bluetooth bits, Gustavo and Johan say: "To quote Gustavo from his previous request: 'Some last minute fixes for -next. We have a fix for a use after free in RFCOMM, another fix to an issue with ADV_DIRECT_IND and one for ADV_IND with auto-connection handling. Last, we added support for reading the codec and MWS setting for controllers that support these features.' Additionally there are fixes to LE scanning, an update to conform to the 4.1 core specification as well as fixes for tracking the page scan state. All of these fixes are important for 3.17." And, "We've got: - 6lowpan fixes/cleanups - A couple crash fixes, one for the Marvell HCI driver and another in LE SMP. - Fix for an incorrect connected state check - Fix for the bondable requirement during pairing (an issue which had crept in because of using "pairable" when in fact the actual meaning was "bondable" (these have different meanings in Bluetooth)" Along with those are some late-breaking hardware support patches in brcmfmac and b43 as well as a stray ath9k patch. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--Documentation/devicetree/bindings/net/nfc/st21nfcb.txt33
-rw-r--r--Documentation/devicetree/bindings/net/wireless/brcm,bcm43xx-fmac.txt41
-rw-r--r--MAINTAINERS4
-rw-r--r--drivers/bcma/driver_chipcommon_pmu.c1
-rw-r--r--drivers/bcma/host_pci.c1
-rw-r--r--drivers/bcma/scan.c22
-rw-r--r--drivers/bcma/sprom.c1
-rw-r--r--drivers/bluetooth/btmrvl_main.c5
-rw-r--r--drivers/net/wireless/ath/ath10k/htc.c20
-rw-r--r--drivers/net/wireless/ath/ath10k/htt_rx.c122
-rw-r--r--drivers/net/wireless/ath/ath10k/htt_tx.c6
-rw-r--r--drivers/net/wireless/ath/ath10k/mac.c96
-rw-r--r--drivers/net/wireless/ath/ath10k/mac.h4
-rw-r--r--drivers/net/wireless/ath/ath10k/pci.c17
-rw-r--r--drivers/net/wireless/ath/ath10k/txrx.c3
-rw-r--r--drivers/net/wireless/ath/ath10k/txrx.h1
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi.c2
-rw-r--r--drivers/net/wireless/ath/ath9k/ahb.c1
-rw-r--r--drivers/net/wireless/b43/Kconfig22
-rw-r--r--drivers/net/wireless/b43/main.c3
-rw-r--r--drivers/net/wireless/b43/phy_n.c6
-rw-r--r--drivers/net/wireless/brcm80211/Kconfig10
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/Makefile7
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/bcdc.c20
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c20
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/chip.c8
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/commonring.c273
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/commonring.h69
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd.h7
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h33
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h36
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c9
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c25
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/flowring.c501
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/flowring.h84
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/fweh.c6
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/fweh.h5
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c1397
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/msgbuf.h40
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/of.c56
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/of.h22
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/pcie.c1846
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/pcie.h29
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/proto.c29
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/proto.h31
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h12
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c57
-rw-r--r--drivers/net/wireless/brcm80211/include/brcm_hw_ids.h11
-rw-r--r--drivers/net/wireless/iwlegacy/common.c3
-rw-r--r--drivers/nfc/Kconfig2
-rw-r--r--drivers/nfc/Makefile3
-rw-r--r--drivers/nfc/st21nfca/Makefile2
-rw-r--r--drivers/nfc/st21nfca/i2c.c9
-rw-r--r--drivers/nfc/st21nfca/st21nfca.c272
-rw-r--r--drivers/nfc/st21nfca/st21nfca.h26
-rw-r--r--drivers/nfc/st21nfca/st21nfca_dep.c661
-rw-r--r--drivers/nfc/st21nfca/st21nfca_dep.h43
-rw-r--r--drivers/nfc/st21nfcb/Kconfig22
-rw-r--r--drivers/nfc/st21nfcb/Makefile8
-rw-r--r--drivers/nfc/st21nfcb/i2c.c462
-rw-r--r--drivers/nfc/st21nfcb/ndlc.c298
-rw-r--r--drivers/nfc/st21nfcb/ndlc.h55
-rw-r--r--drivers/nfc/st21nfcb/st21nfcb.c129
-rw-r--r--drivers/nfc/st21nfcb/st21nfcb.h38
-rw-r--r--include/linux/bcma/bcma.h23
-rw-r--r--include/linux/platform_data/st21nfcb.h32
-rw-r--r--include/net/6lowpan.h50
-rw-r--r--include/net/bluetooth/hci.h6
-rw-r--r--include/net/bluetooth/hci_core.h3
-rw-r--r--include/net/bluetooth/mgmt.h4
-rw-r--r--include/net/nfc/digital.h13
-rw-r--r--include/net/nfc/hci.h1
-rw-r--r--net/6lowpan/iphc.c212
-rw-r--r--net/bluetooth/hci_core.c185
-rw-r--r--net/bluetooth/hci_event.c50
-rw-r--r--net/bluetooth/hidp/core.c2
-rw-r--r--net/bluetooth/mgmt.c57
-rw-r--r--net/bluetooth/rfcomm/core.c7
-rw-r--r--net/bluetooth/smp.c33
-rw-r--r--net/nfc/digital.h3
-rw-r--r--net/nfc/digital_core.c27
-rw-r--r--net/nfc/digital_dep.c11
-rw-r--r--net/nfc/digital_technology.c96
-rw-r--r--net/nfc/hci/core.c7
-rw-r--r--net/nfc/nci/ntf.c4
85 files changed, 7542 insertions, 371 deletions
diff --git a/Documentation/devicetree/bindings/net/nfc/st21nfcb.txt b/Documentation/devicetree/bindings/net/nfc/st21nfcb.txt
new file mode 100644
index 000000000000..3b58ae480344
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/nfc/st21nfcb.txt
@@ -0,0 +1,33 @@
1* STMicroelectronics SAS. ST21NFCB NFC Controller
2
3Required properties:
4- compatible: Should be "st,st21nfcb_i2c".
5- clock-frequency: I²C work frequency.
6- reg: address on the bus
7- interrupt-parent: phandle for the interrupt gpio controller
8- interrupts: GPIO interrupt to which the chip is connected
9- reset-gpios: Output GPIO pin used to reset the ST21NFCB
10
11Optional SoC Specific Properties:
12- pinctrl-names: Contains only one value - "default".
13- pintctrl-0: Specifies the pin control groups used for this controller.
14
15Example (for ARM-based BeagleBoard xM with ST21NFCB on I2C2):
16
17&i2c2 {
18
19 status = "okay";
20
21 st21nfcb: st21nfcb@8 {
22
23 compatible = "st,st21nfcb_i2c";
24
25 reg = <0x08>;
26 clock-frequency = <400000>;
27
28 interrupt-parent = <&gpio5>;
29 interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
30
31 reset-gpios = <&gpio5 29 GPIO_ACTIVE_HIGH>;
32 };
33};
diff --git a/Documentation/devicetree/bindings/net/wireless/brcm,bcm43xx-fmac.txt b/Documentation/devicetree/bindings/net/wireless/brcm,bcm43xx-fmac.txt
new file mode 100644
index 000000000000..5dbf169cd81c
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/wireless/brcm,bcm43xx-fmac.txt
@@ -0,0 +1,41 @@
1Broadcom BCM43xx Fullmac wireless SDIO devices
2
3This node provides properties for controlling the Broadcom wireless device. The
4node is expected to be specified as a child node to the SDIO controller that
5connects the device to the system.
6
7Required properties:
8
9 - compatible : Should be "brcm,bcm4329-fmac".
10
11Optional properties:
12 - brcm,drive-strength : drive strength used for SDIO pins on device in mA
13 (default = 6).
14 - interrupt-parent : the phandle for the interrupt controller to which the
15 device interrupts are connected.
16 - interrupts : specifies attributes for the out-of-band interrupt (host-wake).
17 When not specified the device will use in-band SDIO interrupts.
18 - interrupt-names : name of the out-of-band interrupt, which must be set
19 to "host-wake".
20
21Example:
22
23mmc3: mmc@01c12000 {
24 #address-cells = <1>;
25 #size-cells = <0>;
26
27 pinctrl-names = "default";
28 pinctrl-0 = <&mmc3_pins_a>;
29 vmmc-supply = <&reg_vmmc3>;
30 bus-width = <4>;
31 non-removable;
32 status = "okay";
33
34 brcmf: bcrmf@1 {
35 reg = <1>;
36 compatible = "brcm,bcm4329-fmac";
37 interrupt-parent = <&pio>;
38 interrupts = <10 8>; /* PH10 / EINT10 */
39 interrupt-names = "host-wake";
40 };
41};
diff --git a/MAINTAINERS b/MAINTAINERS
index c77a0effe5dd..f00d2c52faeb 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -154,6 +154,7 @@ L: linux-zigbee-devel@lists.sourceforge.net (moderated for non-subscribers)
154L: linux-bluetooth@vger.kernel.org 154L: linux-bluetooth@vger.kernel.org
155S: Maintained 155S: Maintained
156F: net/6lowpan/ 156F: net/6lowpan/
157F: include/net/6lowpan.h
157 158
1586PACK NETWORK DRIVER FOR AX.25 1596PACK NETWORK DRIVER FOR AX.25
159M: Andreas Koensgen <ajk@comnets.uni-bremen.de> 160M: Andreas Koensgen <ajk@comnets.uni-bremen.de>
@@ -5714,7 +5715,8 @@ S: Maintained
5714F: drivers/net/ethernet/marvell/mvneta.* 5715F: drivers/net/ethernet/marvell/mvneta.*
5715 5716
5716MARVELL MWIFIEX WIRELESS DRIVER 5717MARVELL MWIFIEX WIRELESS DRIVER
5717M: Bing Zhao <bzhao@marvell.com> 5718M: Amitkumar Karwar <akarwar@marvell.com>
5719M: Avinash Patil <patila@marvell.com>
5718L: linux-wireless@vger.kernel.org 5720L: linux-wireless@vger.kernel.org
5719S: Maintained 5721S: Maintained
5720F: drivers/net/wireless/mwifiex/ 5722F: drivers/net/wireless/mwifiex/
diff --git a/drivers/bcma/driver_chipcommon_pmu.c b/drivers/bcma/driver_chipcommon_pmu.c
index bb694e2e9f32..fe0d48cb1778 100644
--- a/drivers/bcma/driver_chipcommon_pmu.c
+++ b/drivers/bcma/driver_chipcommon_pmu.c
@@ -603,6 +603,7 @@ void bcma_pmu_spuravoid_pllupdate(struct bcma_drv_cc *cc, int spuravoid)
603 tmp = BCMA_CC_PMU_CTL_PLL_UPD | BCMA_CC_PMU_CTL_NOILPONW; 603 tmp = BCMA_CC_PMU_CTL_PLL_UPD | BCMA_CC_PMU_CTL_NOILPONW;
604 break; 604 break;
605 605
606 case BCMA_CHIP_ID_BCM43131:
606 case BCMA_CHIP_ID_BCM43217: 607 case BCMA_CHIP_ID_BCM43217:
607 case BCMA_CHIP_ID_BCM43227: 608 case BCMA_CHIP_ID_BCM43227:
608 case BCMA_CHIP_ID_BCM43228: 609 case BCMA_CHIP_ID_BCM43228:
diff --git a/drivers/bcma/host_pci.c b/drivers/bcma/host_pci.c
index 3cf725a49dc1..294a7dd25190 100644
--- a/drivers/bcma/host_pci.c
+++ b/drivers/bcma/host_pci.c
@@ -280,6 +280,7 @@ static const struct pci_device_id bcma_pci_bridge_tbl[] = {
280 { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) }, 280 { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) },
281 { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4365) }, 281 { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4365) },
282 { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a9) }, 282 { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a9) },
283 { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43aa) },
283 { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4727) }, 284 { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4727) },
284 { 0, }, 285 { 0, },
285}; 286};
diff --git a/drivers/bcma/scan.c b/drivers/bcma/scan.c
index 37768401d113..b4764c6bcf17 100644
--- a/drivers/bcma/scan.c
+++ b/drivers/bcma/scan.c
@@ -32,17 +32,17 @@ static const struct bcma_device_id_name bcma_bcm_device_names[] = {
32 { BCMA_CORE_4706_CHIPCOMMON, "BCM4706 ChipCommon" }, 32 { BCMA_CORE_4706_CHIPCOMMON, "BCM4706 ChipCommon" },
33 { BCMA_CORE_4706_SOC_RAM, "BCM4706 SOC RAM" }, 33 { BCMA_CORE_4706_SOC_RAM, "BCM4706 SOC RAM" },
34 { BCMA_CORE_4706_MAC_GBIT, "BCM4706 GBit MAC" }, 34 { BCMA_CORE_4706_MAC_GBIT, "BCM4706 GBit MAC" },
35 { BCMA_CORE_PCIEG2, "PCIe Gen 2" }, 35 { BCMA_CORE_NS_PCIEG2, "PCIe Gen 2" },
36 { BCMA_CORE_DMA, "DMA" }, 36 { BCMA_CORE_NS_DMA, "DMA" },
37 { BCMA_CORE_SDIO3, "SDIO3" }, 37 { BCMA_CORE_NS_SDIO3, "SDIO3" },
38 { BCMA_CORE_USB20, "USB 2.0" }, 38 { BCMA_CORE_NS_USB20, "USB 2.0" },
39 { BCMA_CORE_USB30, "USB 3.0" }, 39 { BCMA_CORE_NS_USB30, "USB 3.0" },
40 { BCMA_CORE_A9JTAG, "ARM Cortex A9 JTAG" }, 40 { BCMA_CORE_NS_A9JTAG, "ARM Cortex A9 JTAG" },
41 { BCMA_CORE_DDR23, "Denali DDR2/DDR3 memory controller" }, 41 { BCMA_CORE_NS_DDR23, "Denali DDR2/DDR3 memory controller" },
42 { BCMA_CORE_ROM, "ROM" }, 42 { BCMA_CORE_NS_ROM, "ROM" },
43 { BCMA_CORE_NAND, "NAND flash controller" }, 43 { BCMA_CORE_NS_NAND, "NAND flash controller" },
44 { BCMA_CORE_QSPI, "SPI flash controller" }, 44 { BCMA_CORE_NS_QSPI, "SPI flash controller" },
45 { BCMA_CORE_CHIPCOMMON_B, "Chipcommon B" }, 45 { BCMA_CORE_NS_CHIPCOMMON_B, "Chipcommon B" },
46 { BCMA_CORE_ARMCA9, "ARM Cortex A9 core (ihost)" }, 46 { BCMA_CORE_ARMCA9, "ARM Cortex A9 core (ihost)" },
47 { BCMA_CORE_AMEMC, "AMEMC (DDR)" }, 47 { BCMA_CORE_AMEMC, "AMEMC (DDR)" },
48 { BCMA_CORE_ALTA, "ALTA (I2S)" }, 48 { BCMA_CORE_ALTA, "ALTA (I2S)" },
diff --git a/drivers/bcma/sprom.c b/drivers/bcma/sprom.c
index 97bb38e9ed65..efb037f9c98a 100644
--- a/drivers/bcma/sprom.c
+++ b/drivers/bcma/sprom.c
@@ -534,6 +534,7 @@ static bool bcma_sprom_onchip_available(struct bcma_bus *bus)
534 /* for these chips OTP is always available */ 534 /* for these chips OTP is always available */
535 present = true; 535 present = true;
536 break; 536 break;
537 case BCMA_CHIP_ID_BCM43131:
537 case BCMA_CHIP_ID_BCM43217: 538 case BCMA_CHIP_ID_BCM43217:
538 case BCMA_CHIP_ID_BCM43227: 539 case BCMA_CHIP_ID_BCM43227:
539 case BCMA_CHIP_ID_BCM43228: 540 case BCMA_CHIP_ID_BCM43228:
diff --git a/drivers/bluetooth/btmrvl_main.c b/drivers/bluetooth/btmrvl_main.c
index bae8e6a0ecf6..1d7db2064889 100644
--- a/drivers/bluetooth/btmrvl_main.c
+++ b/drivers/bluetooth/btmrvl_main.c
@@ -710,12 +710,17 @@ struct btmrvl_private *btmrvl_add_card(void *card)
710 init_waitqueue_head(&priv->main_thread.wait_q); 710 init_waitqueue_head(&priv->main_thread.wait_q);
711 priv->main_thread.task = kthread_run(btmrvl_service_main_thread, 711 priv->main_thread.task = kthread_run(btmrvl_service_main_thread,
712 &priv->main_thread, "btmrvl_main_service"); 712 &priv->main_thread, "btmrvl_main_service");
713 if (IS_ERR(priv->main_thread.task))
714 goto err_thread;
713 715
714 priv->btmrvl_dev.card = card; 716 priv->btmrvl_dev.card = card;
715 priv->btmrvl_dev.tx_dnld_rdy = true; 717 priv->btmrvl_dev.tx_dnld_rdy = true;
716 718
717 return priv; 719 return priv;
718 720
721err_thread:
722 btmrvl_free_adapter(priv);
723
719err_adapter: 724err_adapter:
720 kfree(priv); 725 kfree(priv);
721 726
diff --git a/drivers/net/wireless/ath/ath10k/htc.c b/drivers/net/wireless/ath/ath10k/htc.c
index e493db4b4a41..5fdc40d3b378 100644
--- a/drivers/net/wireless/ath/ath10k/htc.c
+++ b/drivers/net/wireless/ath/ath10k/htc.c
@@ -546,7 +546,7 @@ static u8 ath10k_htc_get_credit_allocation(struct ath10k_htc *htc,
546 546
547int ath10k_htc_wait_target(struct ath10k_htc *htc) 547int ath10k_htc_wait_target(struct ath10k_htc *htc)
548{ 548{
549 int status = 0; 549 int i, status = 0;
550 struct ath10k_htc_svc_conn_req conn_req; 550 struct ath10k_htc_svc_conn_req conn_req;
551 struct ath10k_htc_svc_conn_resp conn_resp; 551 struct ath10k_htc_svc_conn_resp conn_resp;
552 struct ath10k_htc_msg *msg; 552 struct ath10k_htc_msg *msg;
@@ -556,10 +556,26 @@ int ath10k_htc_wait_target(struct ath10k_htc *htc)
556 556
557 status = wait_for_completion_timeout(&htc->ctl_resp, 557 status = wait_for_completion_timeout(&htc->ctl_resp,
558 ATH10K_HTC_WAIT_TIMEOUT_HZ); 558 ATH10K_HTC_WAIT_TIMEOUT_HZ);
559 if (status <= 0) { 559 if (status == 0) {
560 /* Workaround: In some cases the PCI HIF doesn't
561 * receive interrupt for the control response message
562 * even if the buffer was completed. It is suspected
563 * iomap writes unmasking PCI CE irqs aren't propagated
564 * properly in KVM PCI-passthrough sometimes.
565 */
566 ath10k_warn("failed to receive control response completion, polling..\n");
567
568 for (i = 0; i < CE_COUNT; i++)
569 ath10k_hif_send_complete_check(htc->ar, i, 1);
570
571 status = wait_for_completion_timeout(&htc->ctl_resp,
572 ATH10K_HTC_WAIT_TIMEOUT_HZ);
573
560 if (status == 0) 574 if (status == 0)
561 status = -ETIMEDOUT; 575 status = -ETIMEDOUT;
576 }
562 577
578 if (status < 0) {
563 ath10k_err("ctl_resp never came in (%d)\n", status); 579 ath10k_err("ctl_resp never came in (%d)\n", status);
564 return status; 580 return status;
565 } 581 }
diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c
index eebc860c3655..80cdac15588a 100644
--- a/drivers/net/wireless/ath/ath10k/htt_rx.c
+++ b/drivers/net/wireless/ath/ath10k/htt_rx.c
@@ -21,6 +21,7 @@
21#include "txrx.h" 21#include "txrx.h"
22#include "debug.h" 22#include "debug.h"
23#include "trace.h" 23#include "trace.h"
24#include "mac.h"
24 25
25#include <linux/log2.h> 26#include <linux/log2.h>
26 27
@@ -307,7 +308,8 @@ static void ath10k_htt_rx_free_msdu_chain(struct sk_buff *skb)
307static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt, 308static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt,
308 u8 **fw_desc, int *fw_desc_len, 309 u8 **fw_desc, int *fw_desc_len,
309 struct sk_buff **head_msdu, 310 struct sk_buff **head_msdu,
310 struct sk_buff **tail_msdu) 311 struct sk_buff **tail_msdu,
312 u32 *attention)
311{ 313{
312 int msdu_len, msdu_chaining = 0; 314 int msdu_len, msdu_chaining = 0;
313 struct sk_buff *msdu; 315 struct sk_buff *msdu;
@@ -357,6 +359,11 @@ static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt,
357 break; 359 break;
358 } 360 }
359 361
362 *attention |= __le32_to_cpu(rx_desc->attention.flags) &
363 (RX_ATTENTION_FLAGS_TKIP_MIC_ERR |
364 RX_ATTENTION_FLAGS_DECRYPT_ERR |
365 RX_ATTENTION_FLAGS_FCS_ERR |
366 RX_ATTENTION_FLAGS_MGMT_TYPE);
360 /* 367 /*
361 * Copy the FW rx descriptor for this MSDU from the rx 368 * Copy the FW rx descriptor for this MSDU from the rx
362 * indication message into the MSDU's netbuf. HL uses the 369 * indication message into the MSDU's netbuf. HL uses the
@@ -1215,13 +1222,15 @@ static void ath10k_htt_rx_handler(struct ath10k_htt *htt,
1215 for (j = 0; j < mpdu_ranges[i].mpdu_count; j++) { 1222 for (j = 0; j < mpdu_ranges[i].mpdu_count; j++) {
1216 struct sk_buff *msdu_head, *msdu_tail; 1223 struct sk_buff *msdu_head, *msdu_tail;
1217 1224
1225 attention = 0;
1218 msdu_head = NULL; 1226 msdu_head = NULL;
1219 msdu_tail = NULL; 1227 msdu_tail = NULL;
1220 ret = ath10k_htt_rx_amsdu_pop(htt, 1228 ret = ath10k_htt_rx_amsdu_pop(htt,
1221 &fw_desc, 1229 &fw_desc,
1222 &fw_desc_len, 1230 &fw_desc_len,
1223 &msdu_head, 1231 &msdu_head,
1224 &msdu_tail); 1232 &msdu_tail,
1233 &attention);
1225 1234
1226 if (ret < 0) { 1235 if (ret < 0) {
1227 ath10k_warn("failed to pop amsdu from htt rx ring %d\n", 1236 ath10k_warn("failed to pop amsdu from htt rx ring %d\n",
@@ -1233,7 +1242,6 @@ static void ath10k_htt_rx_handler(struct ath10k_htt *htt,
1233 rxd = container_of((void *)msdu_head->data, 1242 rxd = container_of((void *)msdu_head->data,
1234 struct htt_rx_desc, 1243 struct htt_rx_desc,
1235 msdu_payload); 1244 msdu_payload);
1236 attention = __le32_to_cpu(rxd->attention.flags);
1237 1245
1238 if (!ath10k_htt_rx_amsdu_allowed(htt, msdu_head, 1246 if (!ath10k_htt_rx_amsdu_allowed(htt, msdu_head,
1239 status, 1247 status,
@@ -1286,6 +1294,7 @@ static void ath10k_htt_rx_frag_handler(struct ath10k_htt *htt,
1286 u8 *fw_desc; 1294 u8 *fw_desc;
1287 int fw_desc_len, hdrlen, paramlen; 1295 int fw_desc_len, hdrlen, paramlen;
1288 int trim; 1296 int trim;
1297 u32 attention = 0;
1289 1298
1290 fw_desc_len = __le16_to_cpu(frag->fw_rx_desc_bytes); 1299 fw_desc_len = __le16_to_cpu(frag->fw_rx_desc_bytes);
1291 fw_desc = (u8 *)frag->fw_msdu_rx_desc; 1300 fw_desc = (u8 *)frag->fw_msdu_rx_desc;
@@ -1295,7 +1304,8 @@ static void ath10k_htt_rx_frag_handler(struct ath10k_htt *htt,
1295 1304
1296 spin_lock_bh(&htt->rx_ring.lock); 1305 spin_lock_bh(&htt->rx_ring.lock);
1297 ret = ath10k_htt_rx_amsdu_pop(htt, &fw_desc, &fw_desc_len, 1306 ret = ath10k_htt_rx_amsdu_pop(htt, &fw_desc, &fw_desc_len,
1298 &msdu_head, &msdu_tail); 1307 &msdu_head, &msdu_tail,
1308 &attention);
1299 spin_unlock_bh(&htt->rx_ring.lock); 1309 spin_unlock_bh(&htt->rx_ring.lock);
1300 1310
1301 ath10k_dbg(ATH10K_DBG_HTT_DUMP, "htt rx frag ahead\n"); 1311 ath10k_dbg(ATH10K_DBG_HTT_DUMP, "htt rx frag ahead\n");
@@ -1312,10 +1322,8 @@ static void ath10k_htt_rx_frag_handler(struct ath10k_htt *htt,
1312 1322
1313 hdr = (struct ieee80211_hdr *)msdu_head->data; 1323 hdr = (struct ieee80211_hdr *)msdu_head->data;
1314 rxd = (void *)msdu_head->data - sizeof(*rxd); 1324 rxd = (void *)msdu_head->data - sizeof(*rxd);
1315 tkip_mic_err = !!(__le32_to_cpu(rxd->attention.flags) & 1325 tkip_mic_err = !!(attention & RX_ATTENTION_FLAGS_TKIP_MIC_ERR);
1316 RX_ATTENTION_FLAGS_TKIP_MIC_ERR); 1326 decrypt_err = !!(attention & RX_ATTENTION_FLAGS_DECRYPT_ERR);
1317 decrypt_err = !!(__le32_to_cpu(rxd->attention.flags) &
1318 RX_ATTENTION_FLAGS_DECRYPT_ERR);
1319 fmt = MS(__le32_to_cpu(rxd->msdu_start.info1), 1327 fmt = MS(__le32_to_cpu(rxd->msdu_start.info1),
1320 RX_MSDU_START_INFO1_DECAP_FORMAT); 1328 RX_MSDU_START_INFO1_DECAP_FORMAT);
1321 1329
@@ -1422,6 +1430,86 @@ static void ath10k_htt_rx_frm_tx_compl(struct ath10k *ar,
1422 } 1430 }
1423} 1431}
1424 1432
1433static void ath10k_htt_rx_addba(struct ath10k *ar, struct htt_resp *resp)
1434{
1435 struct htt_rx_addba *ev = &resp->rx_addba;
1436 struct ath10k_peer *peer;
1437 struct ath10k_vif *arvif;
1438 u16 info0, tid, peer_id;
1439
1440 info0 = __le16_to_cpu(ev->info0);
1441 tid = MS(info0, HTT_RX_BA_INFO0_TID);
1442 peer_id = MS(info0, HTT_RX_BA_INFO0_PEER_ID);
1443
1444 ath10k_dbg(ATH10K_DBG_HTT,
1445 "htt rx addba tid %hu peer_id %hu size %hhu\n",
1446 tid, peer_id, ev->window_size);
1447
1448 spin_lock_bh(&ar->data_lock);
1449 peer = ath10k_peer_find_by_id(ar, peer_id);
1450 if (!peer) {
1451 ath10k_warn("received addba event for invalid peer_id: %hu\n",
1452 peer_id);
1453 spin_unlock_bh(&ar->data_lock);
1454 return;
1455 }
1456
1457 arvif = ath10k_get_arvif(ar, peer->vdev_id);
1458 if (!arvif) {
1459 ath10k_warn("received addba event for invalid vdev_id: %u\n",
1460 peer->vdev_id);
1461 spin_unlock_bh(&ar->data_lock);
1462 return;
1463 }
1464
1465 ath10k_dbg(ATH10K_DBG_HTT,
1466 "htt rx start rx ba session sta %pM tid %hu size %hhu\n",
1467 peer->addr, tid, ev->window_size);
1468
1469 ieee80211_start_rx_ba_session_offl(arvif->vif, peer->addr, tid);
1470 spin_unlock_bh(&ar->data_lock);
1471}
1472
1473static void ath10k_htt_rx_delba(struct ath10k *ar, struct htt_resp *resp)
1474{
1475 struct htt_rx_delba *ev = &resp->rx_delba;
1476 struct ath10k_peer *peer;
1477 struct ath10k_vif *arvif;
1478 u16 info0, tid, peer_id;
1479
1480 info0 = __le16_to_cpu(ev->info0);
1481 tid = MS(info0, HTT_RX_BA_INFO0_TID);
1482 peer_id = MS(info0, HTT_RX_BA_INFO0_PEER_ID);
1483
1484 ath10k_dbg(ATH10K_DBG_HTT,
1485 "htt rx delba tid %hu peer_id %hu\n",
1486 tid, peer_id);
1487
1488 spin_lock_bh(&ar->data_lock);
1489 peer = ath10k_peer_find_by_id(ar, peer_id);
1490 if (!peer) {
1491 ath10k_warn("received addba event for invalid peer_id: %hu\n",
1492 peer_id);
1493 spin_unlock_bh(&ar->data_lock);
1494 return;
1495 }
1496
1497 arvif = ath10k_get_arvif(ar, peer->vdev_id);
1498 if (!arvif) {
1499 ath10k_warn("received addba event for invalid vdev_id: %u\n",
1500 peer->vdev_id);
1501 spin_unlock_bh(&ar->data_lock);
1502 return;
1503 }
1504
1505 ath10k_dbg(ATH10K_DBG_HTT,
1506 "htt rx stop rx ba session sta %pM tid %hu\n",
1507 peer->addr, tid);
1508
1509 ieee80211_stop_rx_ba_session_offl(arvif->vif, peer->addr, tid);
1510 spin_unlock_bh(&ar->data_lock);
1511}
1512
1425void ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb) 1513void ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb)
1426{ 1514{
1427 struct ath10k_htt *htt = &ar->htt; 1515 struct ath10k_htt *htt = &ar->htt;
@@ -1516,9 +1604,25 @@ void ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb)
1516 trace_ath10k_htt_stats(skb->data, skb->len); 1604 trace_ath10k_htt_stats(skb->data, skb->len);
1517 break; 1605 break;
1518 case HTT_T2H_MSG_TYPE_TX_INSPECT_IND: 1606 case HTT_T2H_MSG_TYPE_TX_INSPECT_IND:
1607 /* Firmware can return tx frames if it's unable to fully
1608 * process them and suspects host may be able to fix it. ath10k
1609 * sends all tx frames as already inspected so this shouldn't
1610 * happen unless fw has a bug.
1611 */
1612 ath10k_warn("received an unexpected htt tx inspect event\n");
1613 break;
1519 case HTT_T2H_MSG_TYPE_RX_ADDBA: 1614 case HTT_T2H_MSG_TYPE_RX_ADDBA:
1615 ath10k_htt_rx_addba(ar, resp);
1616 break;
1520 case HTT_T2H_MSG_TYPE_RX_DELBA: 1617 case HTT_T2H_MSG_TYPE_RX_DELBA:
1521 case HTT_T2H_MSG_TYPE_RX_FLUSH: 1618 ath10k_htt_rx_delba(ar, resp);
1619 break;
1620 case HTT_T2H_MSG_TYPE_RX_FLUSH: {
1621 /* Ignore this event because mac80211 takes care of Rx
1622 * aggregation reordering.
1623 */
1624 break;
1625 }
1522 default: 1626 default:
1523 ath10k_dbg(ATH10K_DBG_HTT, "htt event (%d) not handled\n", 1627 ath10k_dbg(ATH10K_DBG_HTT, "htt event (%d) not handled\n",
1524 resp->hdr.msg_type); 1628 resp->hdr.msg_type);
diff --git a/drivers/net/wireless/ath/ath10k/htt_tx.c b/drivers/net/wireless/ath/ath10k/htt_tx.c
index accb6b4f6faf..8b27bfcc1de3 100644
--- a/drivers/net/wireless/ath/ath10k/htt_tx.c
+++ b/drivers/net/wireless/ath/ath10k/htt_tx.c
@@ -531,6 +531,12 @@ int ath10k_htt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
531 flags1 |= HTT_DATA_TX_DESC_FLAGS1_CKSUM_L3_OFFLOAD; 531 flags1 |= HTT_DATA_TX_DESC_FLAGS1_CKSUM_L3_OFFLOAD;
532 flags1 |= HTT_DATA_TX_DESC_FLAGS1_CKSUM_L4_OFFLOAD; 532 flags1 |= HTT_DATA_TX_DESC_FLAGS1_CKSUM_L4_OFFLOAD;
533 533
534 /* Prevent firmware from sending up tx inspection requests. There's
535 * nothing ath10k can do with frames requested for inspection so force
536 * it to simply rely a regular tx completion with discard status.
537 */
538 flags1 |= HTT_DATA_TX_DESC_FLAGS1_POSTPONED;
539
534 skb_cb->htt.txbuf->cmd_hdr.msg_type = HTT_H2T_MSG_TYPE_TX_FRM; 540 skb_cb->htt.txbuf->cmd_hdr.msg_type = HTT_H2T_MSG_TYPE_TX_FRM;
535 skb_cb->htt.txbuf->cmd_tx.flags0 = flags0; 541 skb_cb->htt.txbuf->cmd_tx.flags0 = flags0;
536 skb_cb->htt.txbuf->cmd_tx.flags1 = __cpu_to_le16(flags1); 542 skb_cb->htt.txbuf->cmd_tx.flags1 = __cpu_to_le16(flags1);
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index b8314a534972..9d61bb157189 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -1865,15 +1865,13 @@ static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar,
1865 return 0; 1865 return 0;
1866} 1866}
1867 1867
1868/* 1868/* HTT Tx uses Native Wifi tx mode which expects 802.11 frames without QoS
1869 * Frames sent to the FW have to be in "Native Wifi" format. 1869 * Control in the header.
1870 * Strip the QoS field from the 802.11 header.
1871 */ 1870 */
1872static void ath10k_tx_h_qos_workaround(struct ieee80211_hw *hw, 1871static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
1873 struct ieee80211_tx_control *control,
1874 struct sk_buff *skb)
1875{ 1872{
1876 struct ieee80211_hdr *hdr = (void *)skb->data; 1873 struct ieee80211_hdr *hdr = (void *)skb->data;
1874 struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
1877 u8 *qos_ctl; 1875 u8 *qos_ctl;
1878 1876
1879 if (!ieee80211_is_data_qos(hdr->frame_control)) 1877 if (!ieee80211_is_data_qos(hdr->frame_control))
@@ -1883,6 +1881,16 @@ static void ath10k_tx_h_qos_workaround(struct ieee80211_hw *hw,
1883 memmove(skb->data + IEEE80211_QOS_CTL_LEN, 1881 memmove(skb->data + IEEE80211_QOS_CTL_LEN,
1884 skb->data, (void *)qos_ctl - (void *)skb->data); 1882 skb->data, (void *)qos_ctl - (void *)skb->data);
1885 skb_pull(skb, IEEE80211_QOS_CTL_LEN); 1883 skb_pull(skb, IEEE80211_QOS_CTL_LEN);
1884
1885 /* Fw/Hw generates a corrupted QoS Control Field for QoS NullFunc
1886 * frames. Powersave is handled by the fw/hw so QoS NyllFunc frames are
1887 * used only for CQM purposes (e.g. hostapd station keepalive ping) so
1888 * it is safe to downgrade to NullFunc.
1889 */
1890 if (ieee80211_is_qos_nullfunc(hdr->frame_control)) {
1891 hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
1892 cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
1893 }
1886} 1894}
1887 1895
1888static void ath10k_tx_wep_key_work(struct work_struct *work) 1896static void ath10k_tx_wep_key_work(struct work_struct *work)
@@ -1919,14 +1927,13 @@ unlock:
1919 mutex_unlock(&arvif->ar->conf_mutex); 1927 mutex_unlock(&arvif->ar->conf_mutex);
1920} 1928}
1921 1929
1922static void ath10k_tx_h_update_wep_key(struct sk_buff *skb) 1930static void ath10k_tx_h_update_wep_key(struct ieee80211_vif *vif,
1931 struct ieee80211_key_conf *key,
1932 struct sk_buff *skb)
1923{ 1933{
1924 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1925 struct ieee80211_vif *vif = info->control.vif;
1926 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); 1934 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1927 struct ath10k *ar = arvif->ar; 1935 struct ath10k *ar = arvif->ar;
1928 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 1936 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1929 struct ieee80211_key_conf *key = info->control.hw_key;
1930 1937
1931 if (!ieee80211_has_protected(hdr->frame_control)) 1938 if (!ieee80211_has_protected(hdr->frame_control))
1932 return; 1939 return;
@@ -1948,11 +1955,11 @@ static void ath10k_tx_h_update_wep_key(struct sk_buff *skb)
1948 ieee80211_queue_work(ar->hw, &arvif->wep_key_work); 1955 ieee80211_queue_work(ar->hw, &arvif->wep_key_work);
1949} 1956}
1950 1957
1951static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar, struct sk_buff *skb) 1958static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
1959 struct ieee80211_vif *vif,
1960 struct sk_buff *skb)
1952{ 1961{
1953 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 1962 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1954 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1955 struct ieee80211_vif *vif = info->control.vif;
1956 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); 1963 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1957 1964
1958 /* This is case only for P2P_GO */ 1965 /* This is case only for P2P_GO */
@@ -2254,33 +2261,28 @@ static void ath10k_tx(struct ieee80211_hw *hw,
2254 struct ieee80211_tx_control *control, 2261 struct ieee80211_tx_control *control,
2255 struct sk_buff *skb) 2262 struct sk_buff *skb)
2256{ 2263{
2264 struct ath10k *ar = hw->priv;
2257 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 2265 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2266 struct ieee80211_vif *vif = info->control.vif;
2267 struct ieee80211_key_conf *key = info->control.hw_key;
2258 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 2268 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
2259 struct ath10k *ar = hw->priv;
2260 u8 tid, vdev_id;
2261 2269
2262 /* We should disable CCK RATE due to P2P */ 2270 /* We should disable CCK RATE due to P2P */
2263 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE) 2271 if (info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)
2264 ath10k_dbg(ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n"); 2272 ath10k_dbg(ATH10K_DBG_MAC, "IEEE80211_TX_CTL_NO_CCK_RATE\n");
2265 2273
2266 /* we must calculate tid before we apply qos workaround 2274 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
2267 * as we'd lose the qos control field */ 2275 ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
2268 tid = ath10k_tx_h_get_tid(hdr); 2276 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, info);
2269 vdev_id = ath10k_tx_h_get_vdev_id(ar, info);
2270 2277
2271 /* it makes no sense to process injected frames like that */ 2278 /* it makes no sense to process injected frames like that */
2272 if (info->control.vif && 2279 if (vif && vif->type != NL80211_IFTYPE_MONITOR) {
2273 info->control.vif->type != NL80211_IFTYPE_MONITOR) { 2280 ath10k_tx_h_nwifi(hw, skb);
2274 ath10k_tx_h_qos_workaround(hw, control, skb); 2281 ath10k_tx_h_update_wep_key(vif, key, skb);
2275 ath10k_tx_h_update_wep_key(skb); 2282 ath10k_tx_h_add_p2p_noa_ie(ar, vif, skb);
2276 ath10k_tx_h_add_p2p_noa_ie(ar, skb); 2283 ath10k_tx_h_seq_no(vif, skb);
2277 ath10k_tx_h_seq_no(skb);
2278 } 2284 }
2279 2285
2280 ATH10K_SKB_CB(skb)->vdev_id = vdev_id;
2281 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
2282 ATH10K_SKB_CB(skb)->htt.tid = tid;
2283
2284 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) { 2286 if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
2285 spin_lock_bh(&ar->data_lock); 2287 spin_lock_bh(&ar->data_lock);
2286 ATH10K_SKB_CB(skb)->htt.is_offchan = true; 2288 ATH10K_SKB_CB(skb)->htt.is_offchan = true;
@@ -4331,6 +4333,38 @@ static u64 ath10k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
4331 return 0; 4333 return 0;
4332} 4334}
4333 4335
4336static int ath10k_ampdu_action(struct ieee80211_hw *hw,
4337 struct ieee80211_vif *vif,
4338 enum ieee80211_ampdu_mlme_action action,
4339 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
4340 u8 buf_size)
4341{
4342 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
4343
4344 ath10k_dbg(ATH10K_DBG_MAC, "mac ampdu vdev_id %i sta %pM tid %hu action %d\n",
4345 arvif->vdev_id, sta->addr, tid, action);
4346
4347 switch (action) {
4348 case IEEE80211_AMPDU_RX_START:
4349 case IEEE80211_AMPDU_RX_STOP:
4350 /* HTT AddBa/DelBa events trigger mac80211 Rx BA session
4351 * creation/removal. Do we need to verify this?
4352 */
4353 return 0;
4354 case IEEE80211_AMPDU_TX_START:
4355 case IEEE80211_AMPDU_TX_STOP_CONT:
4356 case IEEE80211_AMPDU_TX_STOP_FLUSH:
4357 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
4358 case IEEE80211_AMPDU_TX_OPERATIONAL:
4359 /* Firmware offloads Tx aggregation entirely so deny mac80211
4360 * Tx aggregation requests.
4361 */
4362 return -EOPNOTSUPP;
4363 }
4364
4365 return -EINVAL;
4366}
4367
4334static const struct ieee80211_ops ath10k_ops = { 4368static const struct ieee80211_ops ath10k_ops = {
4335 .tx = ath10k_tx, 4369 .tx = ath10k_tx,
4336 .start = ath10k_start, 4370 .start = ath10k_start,
@@ -4358,6 +4392,7 @@ static const struct ieee80211_ops ath10k_ops = {
4358 .set_bitrate_mask = ath10k_set_bitrate_mask, 4392 .set_bitrate_mask = ath10k_set_bitrate_mask,
4359 .sta_rc_update = ath10k_sta_rc_update, 4393 .sta_rc_update = ath10k_sta_rc_update,
4360 .get_tsf = ath10k_get_tsf, 4394 .get_tsf = ath10k_get_tsf,
4395 .ampdu_action = ath10k_ampdu_action,
4361#ifdef CONFIG_PM 4396#ifdef CONFIG_PM
4362 .suspend = ath10k_suspend, 4397 .suspend = ath10k_suspend,
4363 .resume = ath10k_resume, 4398 .resume = ath10k_resume,
@@ -4698,7 +4733,6 @@ int ath10k_mac_register(struct ath10k *ar)
4698 4733
4699 ar->hw->wiphy->interface_modes = 4734 ar->hw->wiphy->interface_modes =
4700 BIT(NL80211_IFTYPE_STATION) | 4735 BIT(NL80211_IFTYPE_STATION) |
4701 BIT(NL80211_IFTYPE_ADHOC) |
4702 BIT(NL80211_IFTYPE_AP); 4736 BIT(NL80211_IFTYPE_AP);
4703 4737
4704 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) { 4738 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
@@ -4768,6 +4802,8 @@ int ath10k_mac_register(struct ath10k *ar)
4768 ar->hw->wiphy->iface_combinations = ath10k_if_comb; 4802 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
4769 ar->hw->wiphy->n_iface_combinations = 4803 ar->hw->wiphy->n_iface_combinations =
4770 ARRAY_SIZE(ath10k_if_comb); 4804 ARRAY_SIZE(ath10k_if_comb);
4805
4806 ar->hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_ADHOC);
4771 } 4807 }
4772 4808
4773 ar->hw->netdev_features = NETIF_F_HW_CSUM; 4809 ar->hw->netdev_features = NETIF_F_HW_CSUM;
diff --git a/drivers/net/wireless/ath/ath10k/mac.h b/drivers/net/wireless/ath/ath10k/mac.h
index ba1021997b8f..ef4f84376d7c 100644
--- a/drivers/net/wireless/ath/ath10k/mac.h
+++ b/drivers/net/wireless/ath/ath10k/mac.h
@@ -43,11 +43,11 @@ static inline struct ath10k_vif *ath10k_vif_to_arvif(struct ieee80211_vif *vif)
43 return (struct ath10k_vif *)vif->drv_priv; 43 return (struct ath10k_vif *)vif->drv_priv;
44} 44}
45 45
46static inline void ath10k_tx_h_seq_no(struct sk_buff *skb) 46static inline void ath10k_tx_h_seq_no(struct ieee80211_vif *vif,
47 struct sk_buff *skb)
47{ 48{
48 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 49 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
49 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 50 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
50 struct ieee80211_vif *vif = info->control.vif;
51 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); 51 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
52 52
53 if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { 53 if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) {
diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c
index 06840d101c45..0ffff205478d 100644
--- a/drivers/net/wireless/ath/ath10k/pci.c
+++ b/drivers/net/wireless/ath/ath10k/pci.c
@@ -726,18 +726,12 @@ static void ath10k_pci_ce_recv_data(struct ath10k_ce_pipe *ce_state)
726 unsigned int nbytes, max_nbytes; 726 unsigned int nbytes, max_nbytes;
727 unsigned int transfer_id; 727 unsigned int transfer_id;
728 unsigned int flags; 728 unsigned int flags;
729 int err; 729 int err, num_replenish = 0;
730 730
731 while (ath10k_ce_completed_recv_next(ce_state, &transfer_context, 731 while (ath10k_ce_completed_recv_next(ce_state, &transfer_context,
732 &ce_data, &nbytes, &transfer_id, 732 &ce_data, &nbytes, &transfer_id,
733 &flags) == 0) { 733 &flags) == 0) {
734 err = ath10k_pci_post_rx_pipe(pipe_info, 1); 734 num_replenish++;
735 if (unlikely(err)) {
736 /* FIXME: retry */
737 ath10k_warn("failed to replenish CE rx ring %d: %d\n",
738 pipe_info->pipe_num, err);
739 }
740
741 skb = transfer_context; 735 skb = transfer_context;
742 max_nbytes = skb->len + skb_tailroom(skb); 736 max_nbytes = skb->len + skb_tailroom(skb);
743 dma_unmap_single(ar->dev, ATH10K_SKB_CB(skb)->paddr, 737 dma_unmap_single(ar->dev, ATH10K_SKB_CB(skb)->paddr,
@@ -753,6 +747,13 @@ static void ath10k_pci_ce_recv_data(struct ath10k_ce_pipe *ce_state)
753 skb_put(skb, nbytes); 747 skb_put(skb, nbytes);
754 cb->rx_completion(ar, skb, pipe_info->pipe_num); 748 cb->rx_completion(ar, skb, pipe_info->pipe_num);
755 } 749 }
750
751 err = ath10k_pci_post_rx_pipe(pipe_info, num_replenish);
752 if (unlikely(err)) {
753 /* FIXME: retry */
754 ath10k_warn("failed to replenish CE rx ring %d (%d bufs): %d\n",
755 pipe_info->pipe_num, num_replenish, err);
756 }
756} 757}
757 758
758static int ath10k_pci_hif_tx_sg(struct ath10k *ar, u8 pipe_id, 759static int ath10k_pci_hif_tx_sg(struct ath10k *ar, u8 pipe_id,
diff --git a/drivers/net/wireless/ath/ath10k/txrx.c b/drivers/net/wireless/ath/ath10k/txrx.c
index 82669a77e553..f4fa22d1d591 100644
--- a/drivers/net/wireless/ath/ath10k/txrx.c
+++ b/drivers/net/wireless/ath/ath10k/txrx.c
@@ -119,8 +119,7 @@ struct ath10k_peer *ath10k_peer_find(struct ath10k *ar, int vdev_id,
119 return NULL; 119 return NULL;
120} 120}
121 121
122static struct ath10k_peer *ath10k_peer_find_by_id(struct ath10k *ar, 122struct ath10k_peer *ath10k_peer_find_by_id(struct ath10k *ar, int peer_id)
123 int peer_id)
124{ 123{
125 struct ath10k_peer *peer; 124 struct ath10k_peer *peer;
126 125
diff --git a/drivers/net/wireless/ath/ath10k/txrx.h b/drivers/net/wireless/ath/ath10k/txrx.h
index aee3e20058f8..a90e09f5c7f2 100644
--- a/drivers/net/wireless/ath/ath10k/txrx.h
+++ b/drivers/net/wireless/ath/ath10k/txrx.h
@@ -24,6 +24,7 @@ void ath10k_txrx_tx_unref(struct ath10k_htt *htt,
24 24
25struct ath10k_peer *ath10k_peer_find(struct ath10k *ar, int vdev_id, 25struct ath10k_peer *ath10k_peer_find(struct ath10k *ar, int vdev_id,
26 const u8 *addr); 26 const u8 *addr);
27struct ath10k_peer *ath10k_peer_find_by_id(struct ath10k *ar, int peer_id);
27int ath10k_wait_for_peer_created(struct ath10k *ar, int vdev_id, 28int ath10k_wait_for_peer_created(struct ath10k *ar, int vdev_id,
28 const u8 *addr); 29 const u8 *addr);
29int ath10k_wait_for_peer_deleted(struct ath10k *ar, int vdev_id, 30int ath10k_wait_for_peer_deleted(struct ath10k *ar, int vdev_id,
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index 6f83cae57655..c2c87c916b5a 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -1432,7 +1432,7 @@ static void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb)
1432 continue; 1432 continue;
1433 } 1433 }
1434 1434
1435 ath10k_tx_h_seq_no(bcn); 1435 ath10k_tx_h_seq_no(arvif->vif, bcn);
1436 ath10k_wmi_update_tim(ar, arvif, bcn, bcn_info); 1436 ath10k_wmi_update_tim(ar, arvif, bcn, bcn_info);
1437 ath10k_wmi_update_noa(ar, arvif, bcn, bcn_info); 1437 ath10k_wmi_update_noa(ar, arvif, bcn, bcn_info);
1438 1438
diff --git a/drivers/net/wireless/ath/ath9k/ahb.c b/drivers/net/wireless/ath/ath9k/ahb.c
index be3eb2a8d602..4173838f4684 100644
--- a/drivers/net/wireless/ath/ath9k/ahb.c
+++ b/drivers/net/wireless/ath/ath9k/ahb.c
@@ -113,6 +113,7 @@ static int ath_ahb_probe(struct platform_device *pdev)
113 113
114 irq = res->start; 114 irq = res->start;
115 115
116 ath9k_fill_chanctx_ops();
116 hw = ieee80211_alloc_hw(sizeof(struct ath_softc), &ath9k_ops); 117 hw = ieee80211_alloc_hw(sizeof(struct ath_softc), &ath9k_ops);
117 if (hw == NULL) { 118 if (hw == NULL) {
118 dev_err(&pdev->dev, "no memory for ieee80211_hw\n"); 119 dev_err(&pdev->dev, "no memory for ieee80211_hw\n");
diff --git a/drivers/net/wireless/b43/Kconfig b/drivers/net/wireless/b43/Kconfig
index d4c6ae3a9210..64a5b672e30a 100644
--- a/drivers/net/wireless/b43/Kconfig
+++ b/drivers/net/wireless/b43/Kconfig
@@ -132,35 +132,31 @@ config B43_PHY_G
132 SoC: BCM4712, BCM5352E 132 SoC: BCM4712, BCM5352E
133 133
134config B43_PHY_N 134config B43_PHY_N
135 bool "Support for 802.11n (N-PHY) devices" 135 bool "Support for N-PHY (the main 802.11n series) devices"
136 depends on B43 136 depends on B43
137 default y 137 default y
138 ---help--- 138 ---help---
139 Support for the N-PHY. 139 This PHY type can be found in the following chipsets:
140 140 PCI: BCM4321, BCM4322,
141 This enables support for devices with N-PHY. 141 BCM43222, BCM43224, BCM43225,
142 142 BCM43131, BCM43217, BCM43227, BCM43228
143 Say N if you expect high stability and performance. Saying Y will not 143 SoC: BCM4716, BCM4717, BCM4718, BCM5356, BCM5357, BCM5358
144 affect other devices support and may provide support for basic needs.
145 144
146config B43_PHY_LP 145config B43_PHY_LP
147 bool "Support for low-power (LP-PHY) devices" 146 bool "Support for LP-PHY (low-power 802.11g) devices"
148 depends on B43 && B43_SSB 147 depends on B43 && B43_SSB
149 default y 148 default y
150 ---help--- 149 ---help---
151 Support for the LP-PHY.
152 The LP-PHY is a low-power PHY built into some notebooks 150 The LP-PHY is a low-power PHY built into some notebooks
153 and embedded devices. It supports 802.11a/b/g 151 and embedded devices. It supports 802.11a/b/g
154 (802.11a support is optional, and currently disabled). 152 (802.11a support is optional, and currently disabled).
155 153
156config B43_PHY_HT 154config B43_PHY_HT
157 bool "Support for HT-PHY (high throughput) devices" 155 bool "Support for HT-PHY (high throughput 802.11n) devices"
158 depends on B43 && B43_BCMA 156 depends on B43 && B43_BCMA
159 default y 157 default y
160 ---help--- 158 ---help---
161 Support for the HT-PHY. 159 This PHY type with 3x3:3 MIMO can be found in the BCM4331 PCI chipset.
162
163 Enables support for BCM4331 and possibly other chipsets with that PHY.
164 160
165config B43_PHY_LCN 161config B43_PHY_LCN
166 bool "Support for LCN-PHY devices (BROKEN)" 162 bool "Support for LCN-PHY devices (BROKEN)"
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index d7055febe119..2af1ac396eb4 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -2985,7 +2985,8 @@ void b43_mac_switch_freq(struct b43_wldev *dev, u8 spurmode)
2985{ 2985{
2986 u16 chip_id = dev->dev->chip_id; 2986 u16 chip_id = dev->dev->chip_id;
2987 2987
2988 if (chip_id == BCMA_CHIP_ID_BCM43217 || 2988 if (chip_id == BCMA_CHIP_ID_BCM43131 ||
2989 chip_id == BCMA_CHIP_ID_BCM43217 ||
2989 chip_id == BCMA_CHIP_ID_BCM43222 || 2990 chip_id == BCMA_CHIP_ID_BCM43222 ||
2990 chip_id == BCMA_CHIP_ID_BCM43224 || 2991 chip_id == BCMA_CHIP_ID_BCM43224 ||
2991 chip_id == BCMA_CHIP_ID_BCM43225 || 2992 chip_id == BCMA_CHIP_ID_BCM43225 ||
diff --git a/drivers/net/wireless/b43/phy_n.c b/drivers/net/wireless/b43/phy_n.c
index d269fbb27b9e..e2a3f0d5bcc2 100644
--- a/drivers/net/wireless/b43/phy_n.c
+++ b/drivers/net/wireless/b43/phy_n.c
@@ -4982,7 +4982,8 @@ static void b43_nphy_int_pa_set_tx_dig_filters(struct b43_wldev *dev)
4982 if (dev->phy.rev == 16) 4982 if (dev->phy.rev == 16)
4983 b43_nphy_pa_set_tx_dig_filter(dev, 0x186, dig_filter_phy_rev16); 4983 b43_nphy_pa_set_tx_dig_filter(dev, 0x186, dig_filter_phy_rev16);
4984 4984
4985 if (dev->dev->chip_id == BCMA_CHIP_ID_BCM43217) { 4985 /* Verified with BCM43131 and BCM43217 */
4986 if (dev->phy.rev == 17) {
4986 b43_nphy_pa_set_tx_dig_filter(dev, 0x186, dig_filter_phy_rev16); 4987 b43_nphy_pa_set_tx_dig_filter(dev, 0x186, dig_filter_phy_rev16);
4987 b43_nphy_pa_set_tx_dig_filter(dev, 0x195, 4988 b43_nphy_pa_set_tx_dig_filter(dev, 0x195,
4988 tbl_tx_filter_coef_rev4[1]); 4989 tbl_tx_filter_coef_rev4[1]);
@@ -6216,6 +6217,9 @@ static void b43_nphy_channel_setup(struct b43_wldev *dev,
6216 u16 tmp16; 6217 u16 tmp16;
6217 6218
6218 if (new_channel->band == IEEE80211_BAND_5GHZ) { 6219 if (new_channel->band == IEEE80211_BAND_5GHZ) {
6220 /* Switch to 2 GHz for a moment to access B43_PHY_B_BBCFG */
6221 b43_phy_mask(dev, B43_NPHY_BANDCTL, ~B43_NPHY_BANDCTL_5GHZ);
6222
6219 tmp16 = b43_read16(dev, B43_MMIO_PSM_PHY_HDR); 6223 tmp16 = b43_read16(dev, B43_MMIO_PSM_PHY_HDR);
6220 b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16 | 4); 6224 b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16 | 4);
6221 /* Put BPHY in the reset */ 6225 /* Put BPHY in the reset */
diff --git a/drivers/net/wireless/brcm80211/Kconfig b/drivers/net/wireless/brcm80211/Kconfig
index fcfed6b99a62..b8e2561ea645 100644
--- a/drivers/net/wireless/brcm80211/Kconfig
+++ b/drivers/net/wireless/brcm80211/Kconfig
@@ -48,6 +48,16 @@ config BRCMFMAC_USB
48 IEEE802.11n embedded FullMAC WLAN driver. Say Y if you want to 48 IEEE802.11n embedded FullMAC WLAN driver. Say Y if you want to
49 use the driver for an USB wireless card. 49 use the driver for an USB wireless card.
50 50
51config BRCMFMAC_PCIE
52 bool "PCIE bus interface support for FullMAC driver"
53 depends on BRCMFMAC
54 depends on PCI
55 select FW_LOADER
56 ---help---
57 This option enables the PCIE bus interface support for Broadcom
58 IEEE802.11ac embedded FullMAC WLAN driver. Say Y if you want to
59 use the driver for an PCIE wireless card.
60
51config BRCM_TRACING 61config BRCM_TRACING
52 bool "Broadcom device tracing" 62 bool "Broadcom device tracing"
53 depends on BRCMSMAC || BRCMFMAC 63 depends on BRCMSMAC || BRCMFMAC
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/Makefile b/drivers/net/wireless/brcm80211/brcmfmac/Makefile
index de0cff3df389..c35adf4bc70b 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/Makefile
+++ b/drivers/net/wireless/brcm80211/brcmfmac/Makefile
@@ -31,6 +31,9 @@ brcmfmac-objs += \
31 p2p.o \ 31 p2p.o \
32 proto.o \ 32 proto.o \
33 bcdc.o \ 33 bcdc.o \
34 commonring.o \
35 flowring.o \
36 msgbuf.o \
34 dhd_common.o \ 37 dhd_common.o \
35 dhd_linux.o \ 38 dhd_linux.o \
36 firmware.o \ 39 firmware.o \
@@ -42,7 +45,11 @@ brcmfmac-$(CONFIG_BRCMFMAC_SDIO) += \
42 bcmsdh.o 45 bcmsdh.o
43brcmfmac-$(CONFIG_BRCMFMAC_USB) += \ 46brcmfmac-$(CONFIG_BRCMFMAC_USB) += \
44 usb.o 47 usb.o
48brcmfmac-$(CONFIG_BRCMFMAC_PCIE) += \
49 pcie.o
45brcmfmac-$(CONFIG_BRCMDBG) += \ 50brcmfmac-$(CONFIG_BRCMDBG) += \
46 dhd_dbg.o 51 dhd_dbg.o
47brcmfmac-$(CONFIG_BRCM_TRACING) += \ 52brcmfmac-$(CONFIG_BRCM_TRACING) += \
48 tracepoint.o 53 tracepoint.o
54brcmfmac-$(CONFIG_OF) += \
55 of.o
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c b/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c
index c229210d50ba..a159ff3427de 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcdc.c
@@ -337,6 +337,23 @@ brcmf_proto_bcdc_txdata(struct brcmf_pub *drvr, int ifidx, u8 offset,
337 return brcmf_bus_txdata(drvr->bus_if, pktbuf); 337 return brcmf_bus_txdata(drvr->bus_if, pktbuf);
338} 338}
339 339
340static void
341brcmf_proto_bcdc_configure_addr_mode(struct brcmf_pub *drvr, int ifidx,
342 enum proto_addr_mode addr_mode)
343{
344}
345
346static void
347brcmf_proto_bcdc_delete_peer(struct brcmf_pub *drvr, int ifidx,
348 u8 peer[ETH_ALEN])
349{
350}
351
352static void
353brcmf_proto_bcdc_add_tdls_peer(struct brcmf_pub *drvr, int ifidx,
354 u8 peer[ETH_ALEN])
355{
356}
340 357
341int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) 358int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
342{ 359{
@@ -356,6 +373,9 @@ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
356 drvr->proto->query_dcmd = brcmf_proto_bcdc_query_dcmd; 373 drvr->proto->query_dcmd = brcmf_proto_bcdc_query_dcmd;
357 drvr->proto->set_dcmd = brcmf_proto_bcdc_set_dcmd; 374 drvr->proto->set_dcmd = brcmf_proto_bcdc_set_dcmd;
358 drvr->proto->txdata = brcmf_proto_bcdc_txdata; 375 drvr->proto->txdata = brcmf_proto_bcdc_txdata;
376 drvr->proto->configure_addr_mode = brcmf_proto_bcdc_configure_addr_mode;
377 drvr->proto->delete_peer = brcmf_proto_bcdc_delete_peer;
378 drvr->proto->add_tdls_peer = brcmf_proto_bcdc_add_tdls_peer;
359 drvr->proto->pd = bcdc; 379 drvr->proto->pd = bcdc;
360 380
361 drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES; 381 drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
index f467cafe3e8f..8dbd5dbb78fd 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
@@ -38,10 +38,13 @@
38#include <brcm_hw_ids.h> 38#include <brcm_hw_ids.h>
39#include <brcmu_utils.h> 39#include <brcmu_utils.h>
40#include <brcmu_wifi.h> 40#include <brcmu_wifi.h>
41#include <chipcommon.h>
41#include <soc.h> 42#include <soc.h>
43#include "chip.h"
42#include "dhd_bus.h" 44#include "dhd_bus.h"
43#include "dhd_dbg.h" 45#include "dhd_dbg.h"
44#include "sdio_host.h" 46#include "sdio_host.h"
47#include "of.h"
45 48
46#define SDIOH_API_ACCESS_RETRY_LIMIT 2 49#define SDIOH_API_ACCESS_RETRY_LIMIT 2
47 50
@@ -117,6 +120,7 @@ int brcmf_sdiod_intr_register(struct brcmf_sdio_dev *sdiodev)
117{ 120{
118 int ret = 0; 121 int ret = 0;
119 u8 data; 122 u8 data;
123 u32 addr, gpiocontrol;
120 unsigned long flags; 124 unsigned long flags;
121 125
122 if ((sdiodev->pdata) && (sdiodev->pdata->oob_irq_supported)) { 126 if ((sdiodev->pdata) && (sdiodev->pdata->oob_irq_supported)) {
@@ -146,6 +150,19 @@ int brcmf_sdiod_intr_register(struct brcmf_sdio_dev *sdiodev)
146 150
147 sdio_claim_host(sdiodev->func[1]); 151 sdio_claim_host(sdiodev->func[1]);
148 152
153 if (sdiodev->bus_if->chip == BRCM_CC_43362_CHIP_ID) {
154 /* assign GPIO to SDIO core */
155 addr = CORE_CC_REG(SI_ENUM_BASE, gpiocontrol);
156 gpiocontrol = brcmf_sdiod_regrl(sdiodev, addr, &ret);
157 gpiocontrol |= 0x2;
158 brcmf_sdiod_regwl(sdiodev, addr, gpiocontrol, &ret);
159
160 brcmf_sdiod_regwb(sdiodev, SBSDIO_GPIO_SELECT, 0xf,
161 &ret);
162 brcmf_sdiod_regwb(sdiodev, SBSDIO_GPIO_OUT, 0, &ret);
163 brcmf_sdiod_regwb(sdiodev, SBSDIO_GPIO_EN, 0x2, &ret);
164 }
165
149 /* must configure SDIO_CCCR_IENx to enable irq */ 166 /* must configure SDIO_CCCR_IENx to enable irq */
150 data = brcmf_sdiod_regrb(sdiodev, SDIO_CCCR_IENx, &ret); 167 data = brcmf_sdiod_regrb(sdiodev, SDIO_CCCR_IENx, &ret);
151 data |= 1 << SDIO_FUNC_1 | 1 << SDIO_FUNC_2 | 1; 168 data |= 1 << SDIO_FUNC_1 | 1 << SDIO_FUNC_2 | 1;
@@ -1044,6 +1061,9 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
1044 sdiodev->dev = &sdiodev->func[1]->dev; 1061 sdiodev->dev = &sdiodev->func[1]->dev;
1045 sdiodev->pdata = brcmfmac_sdio_pdata; 1062 sdiodev->pdata = brcmfmac_sdio_pdata;
1046 1063
1064 if (!sdiodev->pdata)
1065 brcmf_of_probe(sdiodev);
1066
1047 atomic_set(&sdiodev->suspend, false); 1067 atomic_set(&sdiodev->suspend, false);
1048 init_waitqueue_head(&sdiodev->request_word_wait); 1068 init_waitqueue_head(&sdiodev->request_word_wait);
1049 init_waitqueue_head(&sdiodev->request_buffer_wait); 1069 init_waitqueue_head(&sdiodev->request_buffer_wait);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/brcm80211/brcmfmac/chip.c
index 96800db0536b..95efde868db8 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/chip.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.c
@@ -506,9 +506,17 @@ static void brcmf_chip_get_raminfo(struct brcmf_chip_priv *ci)
506 break; 506 break;
507 case BRCM_CC_4339_CHIP_ID: 507 case BRCM_CC_4339_CHIP_ID:
508 case BRCM_CC_4354_CHIP_ID: 508 case BRCM_CC_4354_CHIP_ID:
509 case BRCM_CC_4356_CHIP_ID:
510 case BRCM_CC_43567_CHIP_ID:
511 case BRCM_CC_43569_CHIP_ID:
512 case BRCM_CC_43570_CHIP_ID:
509 ci->pub.ramsize = 0xc0000; 513 ci->pub.ramsize = 0xc0000;
510 ci->pub.rambase = 0x180000; 514 ci->pub.rambase = 0x180000;
511 break; 515 break;
516 case BRCM_CC_43602_CHIP_ID:
517 ci->pub.ramsize = 0xf0000;
518 ci->pub.rambase = 0x180000;
519 break;
512 default: 520 default:
513 brcmf_err("unknown chip: %s\n", ci->pub.name); 521 brcmf_err("unknown chip: %s\n", ci->pub.name);
514 break; 522 break;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/commonring.c b/drivers/net/wireless/brcm80211/brcmfmac/commonring.c
new file mode 100644
index 000000000000..c6d65b8e1e15
--- /dev/null
+++ b/drivers/net/wireless/brcm80211/brcmfmac/commonring.c
@@ -0,0 +1,273 @@
1/* Copyright (c) 2014 Broadcom Corporation
2 *
3 * Permission to use, copy, modify, and/or distribute this software for any
4 * purpose with or without fee is hereby granted, provided that the above
5 * copyright notice and this permission notice appear in all copies.
6 *
7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14 */
15
16#include <linux/types.h>
17#include <linux/netdevice.h>
18
19#include <brcmu_utils.h>
20#include <brcmu_wifi.h>
21
22#include "dhd.h"
23#include "commonring.h"
24
25
26/* dma flushing needs implementation for mips and arm platforms. Should
27 * be put in util. Note, this is not real flushing. It is virtual non
28 * cached memory. Only write buffers should have to be drained. Though
29 * this may be different depending on platform......
30 * SEE ALSO msgbuf.c
31 */
32#define brcmf_dma_flush(addr, len)
33#define brcmf_dma_invalidate_cache(addr, len)
34
35
36void brcmf_commonring_register_cb(struct brcmf_commonring *commonring,
37 int (*cr_ring_bell)(void *ctx),
38 int (*cr_update_rptr)(void *ctx),
39 int (*cr_update_wptr)(void *ctx),
40 int (*cr_write_rptr)(void *ctx),
41 int (*cr_write_wptr)(void *ctx), void *ctx)
42{
43 commonring->cr_ring_bell = cr_ring_bell;
44 commonring->cr_update_rptr = cr_update_rptr;
45 commonring->cr_update_wptr = cr_update_wptr;
46 commonring->cr_write_rptr = cr_write_rptr;
47 commonring->cr_write_wptr = cr_write_wptr;
48 commonring->cr_ctx = ctx;
49}
50
51
52void brcmf_commonring_config(struct brcmf_commonring *commonring, u16 depth,
53 u16 item_len, void *buf_addr)
54{
55 commonring->depth = depth;
56 commonring->item_len = item_len;
57 commonring->buf_addr = buf_addr;
58 if (!commonring->inited) {
59 spin_lock_init(&commonring->lock);
60 commonring->inited = true;
61 }
62 commonring->r_ptr = 0;
63 if (commonring->cr_write_rptr)
64 commonring->cr_write_rptr(commonring->cr_ctx);
65 commonring->w_ptr = 0;
66 if (commonring->cr_write_wptr)
67 commonring->cr_write_wptr(commonring->cr_ctx);
68 commonring->f_ptr = 0;
69}
70
71
72void brcmf_commonring_lock(struct brcmf_commonring *commonring)
73 __acquires(&commonring->lock)
74{
75 unsigned long flags;
76
77 spin_lock_irqsave(&commonring->lock, flags);
78 commonring->flags = flags;
79}
80
81
82void brcmf_commonring_unlock(struct brcmf_commonring *commonring)
83 __releases(&commonring->lock)
84{
85 spin_unlock_irqrestore(&commonring->lock, commonring->flags);
86}
87
88
89bool brcmf_commonring_write_available(struct brcmf_commonring *commonring)
90{
91 u16 available;
92 bool retry = true;
93
94again:
95 if (commonring->r_ptr <= commonring->w_ptr)
96 available = commonring->depth - commonring->w_ptr +
97 commonring->r_ptr;
98 else
99 available = commonring->r_ptr - commonring->w_ptr;
100
101 if (available > 1) {
102 if (!commonring->was_full)
103 return true;
104 if (available > commonring->depth / 8) {
105 commonring->was_full = false;
106 return true;
107 }
108 if (retry) {
109 if (commonring->cr_update_rptr)
110 commonring->cr_update_rptr(commonring->cr_ctx);
111 retry = false;
112 goto again;
113 }
114 return false;
115 }
116
117 if (retry) {
118 if (commonring->cr_update_rptr)
119 commonring->cr_update_rptr(commonring->cr_ctx);
120 retry = false;
121 goto again;
122 }
123
124 commonring->was_full = true;
125 return false;
126}
127
128
129void *brcmf_commonring_reserve_for_write(struct brcmf_commonring *commonring)
130{
131 void *ret_ptr;
132 u16 available;
133 bool retry = true;
134
135again:
136 if (commonring->r_ptr <= commonring->w_ptr)
137 available = commonring->depth - commonring->w_ptr +
138 commonring->r_ptr;
139 else
140 available = commonring->r_ptr - commonring->w_ptr;
141
142 if (available > 1) {
143 ret_ptr = commonring->buf_addr +
144 (commonring->w_ptr * commonring->item_len);
145 commonring->w_ptr++;
146 if (commonring->w_ptr == commonring->depth)
147 commonring->w_ptr = 0;
148 return ret_ptr;
149 }
150
151 if (retry) {
152 if (commonring->cr_update_rptr)
153 commonring->cr_update_rptr(commonring->cr_ctx);
154 retry = false;
155 goto again;
156 }
157
158 commonring->was_full = true;
159 return NULL;
160}
161
162
163void *
164brcmf_commonring_reserve_for_write_multiple(struct brcmf_commonring *commonring,
165 u16 n_items, u16 *alloced)
166{
167 void *ret_ptr;
168 u16 available;
169 bool retry = true;
170
171again:
172 if (commonring->r_ptr <= commonring->w_ptr)
173 available = commonring->depth - commonring->w_ptr +
174 commonring->r_ptr;
175 else
176 available = commonring->r_ptr - commonring->w_ptr;
177
178 if (available > 1) {
179 ret_ptr = commonring->buf_addr +
180 (commonring->w_ptr * commonring->item_len);
181 *alloced = min_t(u16, n_items, available - 1);
182 if (*alloced + commonring->w_ptr > commonring->depth)
183 *alloced = commonring->depth - commonring->w_ptr;
184 commonring->w_ptr += *alloced;
185 if (commonring->w_ptr == commonring->depth)
186 commonring->w_ptr = 0;
187 return ret_ptr;
188 }
189
190 if (retry) {
191 if (commonring->cr_update_rptr)
192 commonring->cr_update_rptr(commonring->cr_ctx);
193 retry = false;
194 goto again;
195 }
196
197 commonring->was_full = true;
198 return NULL;
199}
200
201
202int brcmf_commonring_write_complete(struct brcmf_commonring *commonring)
203{
204 void *address;
205
206 address = commonring->buf_addr;
207 address += (commonring->f_ptr * commonring->item_len);
208 if (commonring->f_ptr > commonring->w_ptr) {
209 brcmf_dma_flush(address,
210 (commonring->depth - commonring->f_ptr) *
211 commonring->item_len);
212 address = commonring->buf_addr;
213 commonring->f_ptr = 0;
214 }
215 brcmf_dma_flush(address, (commonring->w_ptr - commonring->f_ptr) *
216 commonring->item_len);
217
218 commonring->f_ptr = commonring->w_ptr;
219
220 if (commonring->cr_write_wptr)
221 commonring->cr_write_wptr(commonring->cr_ctx);
222 if (commonring->cr_ring_bell)
223 return commonring->cr_ring_bell(commonring->cr_ctx);
224
225 return -EIO;
226}
227
228
229void brcmf_commonring_write_cancel(struct brcmf_commonring *commonring,
230 u16 n_items)
231{
232 if (commonring->w_ptr == 0)
233 commonring->w_ptr = commonring->depth - n_items;
234 else
235 commonring->w_ptr -= n_items;
236}
237
238
239void *brcmf_commonring_get_read_ptr(struct brcmf_commonring *commonring,
240 u16 *n_items)
241{
242 void *ret_addr;
243
244 if (commonring->cr_update_wptr)
245 commonring->cr_update_wptr(commonring->cr_ctx);
246
247 *n_items = (commonring->w_ptr >= commonring->r_ptr) ?
248 (commonring->w_ptr - commonring->r_ptr) :
249 (commonring->depth - commonring->r_ptr);
250
251 if (*n_items == 0)
252 return NULL;
253
254 ret_addr = commonring->buf_addr +
255 (commonring->r_ptr * commonring->item_len);
256
257 commonring->r_ptr += *n_items;
258 if (commonring->r_ptr == commonring->depth)
259 commonring->r_ptr = 0;
260
261 brcmf_dma_invalidate_cache(ret_addr, *n_ items * commonring->item_len);
262
263 return ret_addr;
264}
265
266
267int brcmf_commonring_read_complete(struct brcmf_commonring *commonring)
268{
269 if (commonring->cr_write_rptr)
270 return commonring->cr_write_rptr(commonring->cr_ctx);
271
272 return -EIO;
273}
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/commonring.h b/drivers/net/wireless/brcm80211/brcmfmac/commonring.h
new file mode 100644
index 000000000000..002336e35764
--- /dev/null
+++ b/drivers/net/wireless/brcm80211/brcmfmac/commonring.h
@@ -0,0 +1,69 @@
1/* Copyright (c) 2014 Broadcom Corporation
2 *
3 * Permission to use, copy, modify, and/or distribute this software for any
4 * purpose with or without fee is hereby granted, provided that the above
5 * copyright notice and this permission notice appear in all copies.
6 *
7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14 */
15#ifndef BRCMFMAC_COMMONRING_H
16#define BRCMFMAC_COMMONRING_H
17
18
19struct brcmf_commonring {
20 u16 r_ptr;
21 u16 w_ptr;
22 u16 f_ptr;
23 u16 depth;
24 u16 item_len;
25
26 void *buf_addr;
27
28 int (*cr_ring_bell)(void *ctx);
29 int (*cr_update_rptr)(void *ctx);
30 int (*cr_update_wptr)(void *ctx);
31 int (*cr_write_rptr)(void *ctx);
32 int (*cr_write_wptr)(void *ctx);
33
34 void *cr_ctx;
35
36 spinlock_t lock;
37 unsigned long flags;
38 bool inited;
39 bool was_full;
40};
41
42
43void brcmf_commonring_register_cb(struct brcmf_commonring *commonring,
44 int (*cr_ring_bell)(void *ctx),
45 int (*cr_update_rptr)(void *ctx),
46 int (*cr_update_wptr)(void *ctx),
47 int (*cr_write_rptr)(void *ctx),
48 int (*cr_write_wptr)(void *ctx), void *ctx);
49void brcmf_commonring_config(struct brcmf_commonring *commonring, u16 depth,
50 u16 item_len, void *buf_addr);
51void brcmf_commonring_lock(struct brcmf_commonring *commonring);
52void brcmf_commonring_unlock(struct brcmf_commonring *commonring);
53bool brcmf_commonring_write_available(struct brcmf_commonring *commonring);
54void *brcmf_commonring_reserve_for_write(struct brcmf_commonring *commonring);
55void *
56brcmf_commonring_reserve_for_write_multiple(struct brcmf_commonring *commonring,
57 u16 n_items, u16 *alloced);
58int brcmf_commonring_write_complete(struct brcmf_commonring *commonring);
59void brcmf_commonring_write_cancel(struct brcmf_commonring *commonring,
60 u16 n_items);
61void *brcmf_commonring_get_read_ptr(struct brcmf_commonring *commonring,
62 u16 *n_items);
63int brcmf_commonring_read_complete(struct brcmf_commonring *commonring);
64
65#define brcmf_commonring_n_items(commonring) (commonring->depth)
66#define brcmf_commonring_len_item(commonring) (commonring->item_len)
67
68
69#endif /* BRCMFMAC_COMMONRING_H */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
index 7da6441bcfa8..5e4317dbc2b0 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
@@ -121,12 +121,12 @@ struct brcmf_fws_mac_descriptor;
121 * 121 *
122 * @BRCMF_NETIF_STOP_REASON_FWS_FC: 122 * @BRCMF_NETIF_STOP_REASON_FWS_FC:
123 * netif stopped due to firmware signalling flow control. 123 * netif stopped due to firmware signalling flow control.
124 * @BRCMF_NETIF_STOP_REASON_BLOCK_BUS: 124 * @BRCMF_NETIF_STOP_REASON_FLOW:
125 * netif stopped due to bus blocking. 125 * netif stopped due to flowring full.
126 */ 126 */
127enum brcmf_netif_stop_reason { 127enum brcmf_netif_stop_reason {
128 BRCMF_NETIF_STOP_REASON_FWS_FC = 1, 128 BRCMF_NETIF_STOP_REASON_FWS_FC = 1,
129 BRCMF_NETIF_STOP_REASON_BLOCK_BUS = 2 129 BRCMF_NETIF_STOP_REASON_FLOW = 2
130}; 130};
131 131
132/** 132/**
@@ -181,6 +181,7 @@ void brcmf_txflowblock_if(struct brcmf_if *ifp,
181 enum brcmf_netif_stop_reason reason, bool state); 181 enum brcmf_netif_stop_reason reason, bool state);
182void brcmf_txfinalize(struct brcmf_pub *drvr, struct sk_buff *txp, u8 ifidx, 182void brcmf_txfinalize(struct brcmf_pub *drvr, struct sk_buff *txp, u8 ifidx,
183 bool success); 183 bool success);
184void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb);
184 185
185/* Sets dongle media info (drv_version, mac address). */ 186/* Sets dongle media info (drv_version, mac address). */
186int brcmf_c_preinit_dcmds(struct brcmf_if *ifp); 187int brcmf_c_preinit_dcmds(struct brcmf_if *ifp);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
index 7735328fff21..3122b86050a1 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
@@ -19,6 +19,18 @@
19 19
20#include "dhd_dbg.h" 20#include "dhd_dbg.h"
21 21
22/* IDs of the 6 default common rings of msgbuf protocol */
23#define BRCMF_H2D_MSGRING_CONTROL_SUBMIT 0
24#define BRCMF_H2D_MSGRING_RXPOST_SUBMIT 1
25#define BRCMF_D2H_MSGRING_CONTROL_COMPLETE 2
26#define BRCMF_D2H_MSGRING_TX_COMPLETE 3
27#define BRCMF_D2H_MSGRING_RX_COMPLETE 4
28
29#define BRCMF_NROF_H2D_COMMON_MSGRINGS 2
30#define BRCMF_NROF_D2H_COMMON_MSGRINGS 3
31#define BRCMF_NROF_COMMON_MSGRINGS (BRCMF_NROF_H2D_COMMON_MSGRINGS + \
32 BRCMF_NROF_D2H_COMMON_MSGRINGS)
33
22/* The level of bus communication with the dongle */ 34/* The level of bus communication with the dongle */
23enum brcmf_bus_state { 35enum brcmf_bus_state {
24 BRCMF_BUS_UNKNOWN, /* Not determined yet */ 36 BRCMF_BUS_UNKNOWN, /* Not determined yet */
@@ -70,6 +82,25 @@ struct brcmf_bus_ops {
70 struct pktq * (*gettxq)(struct device *dev); 82 struct pktq * (*gettxq)(struct device *dev);
71}; 83};
72 84
85
86/**
87 * struct brcmf_bus_msgbuf - bus ringbuf if in case of msgbuf.
88 *
89 * @commonrings: commonrings which are always there.
90 * @flowrings: commonrings which are dynamically created and destroyed for data.
91 * @rx_dataoffset: if set then all rx data has this this offset.
92 * @max_rxbufpost: maximum number of buffers to post for rx.
93 * @nrof_flowrings: number of flowrings.
94 */
95struct brcmf_bus_msgbuf {
96 struct brcmf_commonring *commonrings[BRCMF_NROF_COMMON_MSGRINGS];
97 struct brcmf_commonring **flowrings;
98 u32 rx_dataoffset;
99 u32 max_rxbufpost;
100 u32 nrof_flowrings;
101};
102
103
73/** 104/**
74 * struct brcmf_bus - interface structure between common and bus layer 105 * struct brcmf_bus - interface structure between common and bus layer
75 * 106 *
@@ -89,6 +120,7 @@ struct brcmf_bus {
89 union { 120 union {
90 struct brcmf_sdio_dev *sdio; 121 struct brcmf_sdio_dev *sdio;
91 struct brcmf_usbdev *usb; 122 struct brcmf_usbdev *usb;
123 struct brcmf_pciedev *pcie;
92 } bus_priv; 124 } bus_priv;
93 enum brcmf_bus_protocol_type proto_type; 125 enum brcmf_bus_protocol_type proto_type;
94 struct device *dev; 126 struct device *dev;
@@ -101,6 +133,7 @@ struct brcmf_bus {
101 bool always_use_fws_queue; 133 bool always_use_fws_queue;
102 134
103 struct brcmf_bus_ops *ops; 135 struct brcmf_bus_ops *ops;
136 struct brcmf_bus_msgbuf *msgbuf;
104}; 137};
105 138
106/* 139/*
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h
index 6eade7c60c63..dec40d316c82 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.h
@@ -18,23 +18,25 @@
18#define _BRCMF_DBG_H_ 18#define _BRCMF_DBG_H_
19 19
20/* message levels */ 20/* message levels */
21#define BRCMF_TRACE_VAL 0x00000002 21#define BRCMF_TRACE_VAL 0x00000002
22#define BRCMF_INFO_VAL 0x00000004 22#define BRCMF_INFO_VAL 0x00000004
23#define BRCMF_DATA_VAL 0x00000008 23#define BRCMF_DATA_VAL 0x00000008
24#define BRCMF_CTL_VAL 0x00000010 24#define BRCMF_CTL_VAL 0x00000010
25#define BRCMF_TIMER_VAL 0x00000020 25#define BRCMF_TIMER_VAL 0x00000020
26#define BRCMF_HDRS_VAL 0x00000040 26#define BRCMF_HDRS_VAL 0x00000040
27#define BRCMF_BYTES_VAL 0x00000080 27#define BRCMF_BYTES_VAL 0x00000080
28#define BRCMF_INTR_VAL 0x00000100 28#define BRCMF_INTR_VAL 0x00000100
29#define BRCMF_GLOM_VAL 0x00000200 29#define BRCMF_GLOM_VAL 0x00000200
30#define BRCMF_EVENT_VAL 0x00000400 30#define BRCMF_EVENT_VAL 0x00000400
31#define BRCMF_BTA_VAL 0x00000800 31#define BRCMF_BTA_VAL 0x00000800
32#define BRCMF_FIL_VAL 0x00001000 32#define BRCMF_FIL_VAL 0x00001000
33#define BRCMF_USB_VAL 0x00002000 33#define BRCMF_USB_VAL 0x00002000
34#define BRCMF_SCAN_VAL 0x00004000 34#define BRCMF_SCAN_VAL 0x00004000
35#define BRCMF_CONN_VAL 0x00008000 35#define BRCMF_CONN_VAL 0x00008000
36#define BRCMF_BCDC_VAL 0x00010000 36#define BRCMF_BCDC_VAL 0x00010000
37#define BRCMF_SDIO_VAL 0x00020000 37#define BRCMF_SDIO_VAL 0x00020000
38#define BRCMF_MSGBUF_VAL 0x00040000
39#define BRCMF_PCIE_VAL 0x00080000
38 40
39/* set default print format */ 41/* set default print format */
40#undef pr_fmt 42#undef pr_fmt
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
index 347b4260f45b..fb1043908a23 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
@@ -32,6 +32,7 @@
32#include "fwsignal.h" 32#include "fwsignal.h"
33#include "feature.h" 33#include "feature.h"
34#include "proto.h" 34#include "proto.h"
35#include "pcie.h"
35 36
36MODULE_AUTHOR("Broadcom Corporation"); 37MODULE_AUTHOR("Broadcom Corporation");
37MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver."); 38MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver.");
@@ -288,7 +289,7 @@ void brcmf_txflowblock(struct device *dev, bool state)
288 brcmf_fws_bus_blocked(drvr, state); 289 brcmf_fws_bus_blocked(drvr, state);
289} 290}
290 291
291static void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb) 292void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb)
292{ 293{
293 skb->dev = ifp->ndev; 294 skb->dev = ifp->ndev;
294 skb->protocol = eth_type_trans(skb, skb->dev); 295 skb->protocol = eth_type_trans(skb, skb->dev);
@@ -1085,6 +1086,9 @@ static void brcmf_driver_register(struct work_struct *work)
1085#ifdef CONFIG_BRCMFMAC_USB 1086#ifdef CONFIG_BRCMFMAC_USB
1086 brcmf_usb_register(); 1087 brcmf_usb_register();
1087#endif 1088#endif
1089#ifdef CONFIG_BRCMFMAC_PCIE
1090 brcmf_pcie_register();
1091#endif
1088} 1092}
1089static DECLARE_WORK(brcmf_driver_work, brcmf_driver_register); 1093static DECLARE_WORK(brcmf_driver_work, brcmf_driver_register);
1090 1094
@@ -1110,6 +1114,9 @@ static void __exit brcmfmac_module_exit(void)
1110#ifdef CONFIG_BRCMFMAC_USB 1114#ifdef CONFIG_BRCMFMAC_USB
1111 brcmf_usb_exit(); 1115 brcmf_usb_exit();
1112#endif 1116#endif
1117#ifdef CONFIG_BRCMFMAC_PCIE
1118 brcmf_pcie_exit();
1119#endif
1113 brcmf_debugfs_exit(); 1120 brcmf_debugfs_exit();
1114} 1121}
1115 1122
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
index 67d91d5cc13d..f55f625fd06b 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
@@ -670,6 +670,8 @@ static int brcmf_sdio_get_fwnames(struct brcmf_chip *ci,
670 struct brcmf_sdio_dev *sdiodev) 670 struct brcmf_sdio_dev *sdiodev)
671{ 671{
672 int i; 672 int i;
673 uint fw_len, nv_len;
674 char end;
673 675
674 for (i = 0; i < ARRAY_SIZE(brcmf_fwname_data); i++) { 676 for (i = 0; i < ARRAY_SIZE(brcmf_fwname_data); i++) {
675 if (brcmf_fwname_data[i].chipid == ci->chip && 677 if (brcmf_fwname_data[i].chipid == ci->chip &&
@@ -682,16 +684,25 @@ static int brcmf_sdio_get_fwnames(struct brcmf_chip *ci,
682 return -ENODEV; 684 return -ENODEV;
683 } 685 }
684 686
687 fw_len = sizeof(sdiodev->fw_name) - 1;
688 nv_len = sizeof(sdiodev->nvram_name) - 1;
685 /* check if firmware path is provided by module parameter */ 689 /* check if firmware path is provided by module parameter */
686 if (brcmf_firmware_path[0] != '\0') { 690 if (brcmf_firmware_path[0] != '\0') {
687 if (brcmf_firmware_path[strlen(brcmf_firmware_path) - 1] != '/') 691 strncpy(sdiodev->fw_name, brcmf_firmware_path, fw_len);
688 strcat(brcmf_firmware_path, "/"); 692 strncpy(sdiodev->nvram_name, brcmf_firmware_path, nv_len);
689 693 fw_len -= strlen(sdiodev->fw_name);
690 strcpy(sdiodev->fw_name, brcmf_firmware_path); 694 nv_len -= strlen(sdiodev->nvram_name);
691 strcpy(sdiodev->nvram_name, brcmf_firmware_path); 695
696 end = brcmf_firmware_path[strlen(brcmf_firmware_path) - 1];
697 if (end != '/') {
698 strncat(sdiodev->fw_name, "/", fw_len);
699 strncat(sdiodev->nvram_name, "/", nv_len);
700 fw_len--;
701 nv_len--;
702 }
692 } 703 }
693 strcat(sdiodev->fw_name, brcmf_fwname_data[i].bin); 704 strncat(sdiodev->fw_name, brcmf_fwname_data[i].bin, fw_len);
694 strcat(sdiodev->nvram_name, brcmf_fwname_data[i].nv); 705 strncat(sdiodev->nvram_name, brcmf_fwname_data[i].nv, nv_len);
695 706
696 return 0; 707 return 0;
697} 708}
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/flowring.c b/drivers/net/wireless/brcm80211/brcmfmac/flowring.c
new file mode 100644
index 000000000000..a1016b811284
--- /dev/null
+++ b/drivers/net/wireless/brcm80211/brcmfmac/flowring.c
@@ -0,0 +1,501 @@
1/* Copyright (c) 2014 Broadcom Corporation
2 *
3 * Permission to use, copy, modify, and/or distribute this software for any
4 * purpose with or without fee is hereby granted, provided that the above
5 * copyright notice and this permission notice appear in all copies.
6 *
7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14 */
15
16
17#include <linux/types.h>
18#include <linux/netdevice.h>
19#include <linux/etherdevice.h>
20#include <brcmu_utils.h>
21
22#include "dhd.h"
23#include "dhd_dbg.h"
24#include "dhd_bus.h"
25#include "proto.h"
26#include "flowring.h"
27#include "msgbuf.h"
28
29
30#define BRCMF_FLOWRING_HIGH 1024
31#define BRCMF_FLOWRING_LOW (BRCMF_FLOWRING_HIGH - 256)
32#define BRCMF_FLOWRING_INVALID_IFIDX 0xff
33
34#define BRCMF_FLOWRING_HASH_AP(da, fifo, ifidx) (da[5] + fifo + ifidx * 16)
35#define BRCMF_FLOWRING_HASH_STA(fifo, ifidx) (fifo + ifidx * 16)
36
37static const u8 ALLZEROMAC[ETH_ALEN] = { 0, 0, 0, 0, 0, 0 };
38static const u8 ALLFFMAC[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
39
40static const u8 brcmf_flowring_prio2fifo[] = {
41 1,
42 0,
43 0,
44 1,
45 2,
46 2,
47 3,
48 3
49};
50
51
52static bool
53brcmf_flowring_is_tdls_mac(struct brcmf_flowring *flow, u8 mac[ETH_ALEN])
54{
55 struct brcmf_flowring_tdls_entry *search;
56
57 search = flow->tdls_entry;
58
59 while (search) {
60 if (memcmp(search->mac, mac, ETH_ALEN) == 0)
61 return true;
62 search = search->next;
63 }
64
65 return false;
66}
67
68
69u32 brcmf_flowring_lookup(struct brcmf_flowring *flow, u8 da[ETH_ALEN],
70 u8 prio, u8 ifidx)
71{
72 struct brcmf_flowring_hash *hash;
73 u8 hash_idx;
74 u32 i;
75 bool found;
76 bool sta;
77 u8 fifo;
78 u8 *mac;
79
80 fifo = brcmf_flowring_prio2fifo[prio];
81 sta = (flow->addr_mode[ifidx] == ADDR_INDIRECT);
82 mac = da;
83 if ((!sta) && (is_multicast_ether_addr(da))) {
84 mac = (u8 *)ALLFFMAC;
85 fifo = 0;
86 }
87 if ((sta) && (flow->tdls_active) &&
88 (brcmf_flowring_is_tdls_mac(flow, da))) {
89 sta = false;
90 }
91 hash_idx = sta ? BRCMF_FLOWRING_HASH_STA(fifo, ifidx) :
92 BRCMF_FLOWRING_HASH_AP(mac, fifo, ifidx);
93 found = false;
94 hash = flow->hash;
95 for (i = 0; i < BRCMF_FLOWRING_HASHSIZE; i++) {
96 if ((sta || (memcmp(hash[hash_idx].mac, mac, ETH_ALEN) == 0)) &&
97 (hash[hash_idx].fifo == fifo) &&
98 (hash[hash_idx].ifidx == ifidx)) {
99 found = true;
100 break;
101 }
102 hash_idx++;
103 }
104 if (found)
105 return hash[hash_idx].flowid;
106
107 return BRCMF_FLOWRING_INVALID_ID;
108}
109
110
111u32 brcmf_flowring_create(struct brcmf_flowring *flow, u8 da[ETH_ALEN],
112 u8 prio, u8 ifidx)
113{
114 struct brcmf_flowring_ring *ring;
115 struct brcmf_flowring_hash *hash;
116 u8 hash_idx;
117 u32 i;
118 bool found;
119 u8 fifo;
120 bool sta;
121 u8 *mac;
122
123 fifo = brcmf_flowring_prio2fifo[prio];
124 sta = (flow->addr_mode[ifidx] == ADDR_INDIRECT);
125 mac = da;
126 if ((!sta) && (is_multicast_ether_addr(da))) {
127 mac = (u8 *)ALLFFMAC;
128 fifo = 0;
129 }
130 if ((sta) && (flow->tdls_active) &&
131 (brcmf_flowring_is_tdls_mac(flow, da))) {
132 sta = false;
133 }
134 hash_idx = sta ? BRCMF_FLOWRING_HASH_STA(fifo, ifidx) :
135 BRCMF_FLOWRING_HASH_AP(mac, fifo, ifidx);
136 found = false;
137 hash = flow->hash;
138 for (i = 0; i < BRCMF_FLOWRING_HASHSIZE; i++) {
139 if ((hash[hash_idx].ifidx == BRCMF_FLOWRING_INVALID_IFIDX) &&
140 (memcmp(hash[hash_idx].mac, ALLZEROMAC, ETH_ALEN) == 0)) {
141 found = true;
142 break;
143 }
144 hash_idx++;
145 }
146 if (found) {
147 for (i = 0; i < flow->nrofrings; i++) {
148 if (flow->rings[i] == NULL)
149 break;
150 }
151 if (i == flow->nrofrings)
152 return -ENOMEM;
153
154 ring = kzalloc(sizeof(*ring), GFP_ATOMIC);
155 if (!ring)
156 return -ENOMEM;
157
158 memcpy(hash[hash_idx].mac, mac, ETH_ALEN);
159 hash[hash_idx].fifo = fifo;
160 hash[hash_idx].ifidx = ifidx;
161 hash[hash_idx].flowid = i;
162
163 ring->hash_id = hash_idx;
164 ring->status = RING_CLOSED;
165 skb_queue_head_init(&ring->skblist);
166 flow->rings[i] = ring;
167
168 return i;
169 }
170 return BRCMF_FLOWRING_INVALID_ID;
171}
172
173
174u8 brcmf_flowring_tid(struct brcmf_flowring *flow, u8 flowid)
175{
176 struct brcmf_flowring_ring *ring;
177
178 ring = flow->rings[flowid];
179
180 return flow->hash[ring->hash_id].fifo;
181}
182
183
184static void brcmf_flowring_block(struct brcmf_flowring *flow, u8 flowid,
185 bool blocked)
186{
187 struct brcmf_flowring_ring *ring;
188 struct brcmf_bus *bus_if;
189 struct brcmf_pub *drvr;
190 struct brcmf_if *ifp;
191 bool currently_blocked;
192 int i;
193 u8 ifidx;
194 unsigned long flags;
195
196 spin_lock_irqsave(&flow->block_lock, flags);
197
198 ring = flow->rings[flowid];
199 ifidx = brcmf_flowring_ifidx_get(flow, flowid);
200
201 currently_blocked = false;
202 for (i = 0; i < flow->nrofrings; i++) {
203 if (flow->rings[i]) {
204 ring = flow->rings[i];
205 if ((ring->status == RING_OPEN) &&
206 (brcmf_flowring_ifidx_get(flow, i) == ifidx)) {
207 if (ring->blocked) {
208 currently_blocked = true;
209 break;
210 }
211 }
212 }
213 }
214 ring->blocked = blocked;
215 if (currently_blocked == blocked) {
216 spin_unlock_irqrestore(&flow->block_lock, flags);
217 return;
218 }
219
220 bus_if = dev_get_drvdata(flow->dev);
221 drvr = bus_if->drvr;
222 ifp = drvr->iflist[ifidx];
223 brcmf_txflowblock_if(ifp, BRCMF_NETIF_STOP_REASON_FLOW, blocked);
224
225 spin_unlock_irqrestore(&flow->block_lock, flags);
226}
227
228
229void brcmf_flowring_delete(struct brcmf_flowring *flow, u8 flowid)
230{
231 struct brcmf_flowring_ring *ring;
232 u8 hash_idx;
233 struct sk_buff *skb;
234
235 ring = flow->rings[flowid];
236 if (!ring)
237 return;
238 brcmf_flowring_block(flow, flowid, false);
239 hash_idx = ring->hash_id;
240 flow->hash[hash_idx].ifidx = BRCMF_FLOWRING_INVALID_IFIDX;
241 memset(flow->hash[hash_idx].mac, 0, ETH_ALEN);
242 flow->rings[flowid] = NULL;
243
244 skb = skb_dequeue(&ring->skblist);
245 while (skb) {
246 brcmu_pkt_buf_free_skb(skb);
247 skb = skb_dequeue(&ring->skblist);
248 }
249
250 kfree(ring);
251}
252
253
254void brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
255 struct sk_buff *skb)
256{
257 struct brcmf_flowring_ring *ring;
258
259 ring = flow->rings[flowid];
260
261 skb_queue_tail(&ring->skblist, skb);
262
263 if (!ring->blocked &&
264 (skb_queue_len(&ring->skblist) > BRCMF_FLOWRING_HIGH)) {
265 brcmf_flowring_block(flow, flowid, true);
266 brcmf_dbg(MSGBUF, "Flowcontrol: BLOCK for ring %d\n", flowid);
267 /* To prevent (work around) possible race condition, check
268 * queue len again. It is also possible to use locking to
269 * protect, but that is undesirable for every enqueue and
270 * dequeue. This simple check will solve a possible race
271 * condition if it occurs.
272 */
273 if (skb_queue_len(&ring->skblist) < BRCMF_FLOWRING_LOW)
274 brcmf_flowring_block(flow, flowid, false);
275 }
276}
277
278
279struct sk_buff *brcmf_flowring_dequeue(struct brcmf_flowring *flow, u8 flowid)
280{
281 struct brcmf_flowring_ring *ring;
282 struct sk_buff *skb;
283
284 ring = flow->rings[flowid];
285 if (ring->status != RING_OPEN)
286 return NULL;
287
288 skb = skb_dequeue(&ring->skblist);
289
290 if (ring->blocked &&
291 (skb_queue_len(&ring->skblist) < BRCMF_FLOWRING_LOW)) {
292 brcmf_flowring_block(flow, flowid, false);
293 brcmf_dbg(MSGBUF, "Flowcontrol: OPEN for ring %d\n", flowid);
294 }
295
296 return skb;
297}
298
299
300void brcmf_flowring_reinsert(struct brcmf_flowring *flow, u8 flowid,
301 struct sk_buff *skb)
302{
303 struct brcmf_flowring_ring *ring;
304
305 ring = flow->rings[flowid];
306
307 skb_queue_head(&ring->skblist, skb);
308}
309
310
311u32 brcmf_flowring_qlen(struct brcmf_flowring *flow, u8 flowid)
312{
313 struct brcmf_flowring_ring *ring;
314
315 ring = flow->rings[flowid];
316 if (!ring)
317 return 0;
318
319 if (ring->status != RING_OPEN)
320 return 0;
321
322 return skb_queue_len(&ring->skblist);
323}
324
325
326void brcmf_flowring_open(struct brcmf_flowring *flow, u8 flowid)
327{
328 struct brcmf_flowring_ring *ring;
329
330 ring = flow->rings[flowid];
331 if (!ring) {
332 brcmf_err("Ring NULL, for flowid %d\n", flowid);
333 return;
334 }
335
336 ring->status = RING_OPEN;
337}
338
339
340u8 brcmf_flowring_ifidx_get(struct brcmf_flowring *flow, u8 flowid)
341{
342 struct brcmf_flowring_ring *ring;
343 u8 hash_idx;
344
345 ring = flow->rings[flowid];
346 hash_idx = ring->hash_id;
347
348 return flow->hash[hash_idx].ifidx;
349}
350
351
352struct brcmf_flowring *brcmf_flowring_attach(struct device *dev, u16 nrofrings)
353{
354 struct brcmf_flowring *flow;
355 u32 i;
356
357 flow = kzalloc(sizeof(*flow), GFP_ATOMIC);
358 if (flow) {
359 flow->dev = dev;
360 flow->nrofrings = nrofrings;
361 spin_lock_init(&flow->block_lock);
362 for (i = 0; i < ARRAY_SIZE(flow->addr_mode); i++)
363 flow->addr_mode[i] = ADDR_INDIRECT;
364 for (i = 0; i < ARRAY_SIZE(flow->hash); i++)
365 flow->hash[i].ifidx = BRCMF_FLOWRING_INVALID_IFIDX;
366 flow->rings = kcalloc(nrofrings, sizeof(*flow->rings),
367 GFP_ATOMIC);
368 if (!flow->rings) {
369 kfree(flow);
370 flow = NULL;
371 }
372 }
373
374 return flow;
375}
376
377
378void brcmf_flowring_detach(struct brcmf_flowring *flow)
379{
380 struct brcmf_bus *bus_if = dev_get_drvdata(flow->dev);
381 struct brcmf_pub *drvr = bus_if->drvr;
382 struct brcmf_flowring_tdls_entry *search;
383 struct brcmf_flowring_tdls_entry *remove;
384 u8 flowid;
385
386 for (flowid = 0; flowid < flow->nrofrings; flowid++) {
387 if (flow->rings[flowid])
388 brcmf_msgbuf_delete_flowring(drvr, flowid);
389 }
390
391 search = flow->tdls_entry;
392 while (search) {
393 remove = search;
394 search = search->next;
395 kfree(remove);
396 }
397 kfree(flow->rings);
398 kfree(flow);
399}
400
401
402void brcmf_flowring_configure_addr_mode(struct brcmf_flowring *flow, int ifidx,
403 enum proto_addr_mode addr_mode)
404{
405 struct brcmf_bus *bus_if = dev_get_drvdata(flow->dev);
406 struct brcmf_pub *drvr = bus_if->drvr;
407 u32 i;
408 u8 flowid;
409
410 if (flow->addr_mode[ifidx] != addr_mode) {
411 for (i = 0; i < ARRAY_SIZE(flow->hash); i++) {
412 if (flow->hash[i].ifidx == ifidx) {
413 flowid = flow->hash[i].flowid;
414 if (flow->rings[flowid]->status != RING_OPEN)
415 continue;
416 flow->rings[flowid]->status = RING_CLOSING;
417 brcmf_msgbuf_delete_flowring(drvr, flowid);
418 }
419 }
420 flow->addr_mode[ifidx] = addr_mode;
421 }
422}
423
424
425void brcmf_flowring_delete_peer(struct brcmf_flowring *flow, int ifidx,
426 u8 peer[ETH_ALEN])
427{
428 struct brcmf_bus *bus_if = dev_get_drvdata(flow->dev);
429 struct brcmf_pub *drvr = bus_if->drvr;
430 struct brcmf_flowring_hash *hash;
431 struct brcmf_flowring_tdls_entry *prev;
432 struct brcmf_flowring_tdls_entry *search;
433 u32 i;
434 u8 flowid;
435 bool sta;
436
437 sta = (flow->addr_mode[ifidx] == ADDR_INDIRECT);
438
439 search = flow->tdls_entry;
440 prev = NULL;
441 while (search) {
442 if (memcmp(search->mac, peer, ETH_ALEN) == 0) {
443 sta = false;
444 break;
445 }
446 prev = search;
447 search = search->next;
448 }
449
450 hash = flow->hash;
451 for (i = 0; i < BRCMF_FLOWRING_HASHSIZE; i++) {
452 if ((sta || (memcmp(hash[i].mac, peer, ETH_ALEN) == 0)) &&
453 (hash[i].ifidx == ifidx)) {
454 flowid = flow->hash[i].flowid;
455 if (flow->rings[flowid]->status == RING_OPEN) {
456 flow->rings[flowid]->status = RING_CLOSING;
457 brcmf_msgbuf_delete_flowring(drvr, flowid);
458 }
459 }
460 }
461
462 if (search) {
463 if (prev)
464 prev->next = search->next;
465 else
466 flow->tdls_entry = search->next;
467 kfree(search);
468 if (flow->tdls_entry == NULL)
469 flow->tdls_active = false;
470 }
471}
472
473
474void brcmf_flowring_add_tdls_peer(struct brcmf_flowring *flow, int ifidx,
475 u8 peer[ETH_ALEN])
476{
477 struct brcmf_flowring_tdls_entry *tdls_entry;
478 struct brcmf_flowring_tdls_entry *search;
479
480 tdls_entry = kzalloc(sizeof(*tdls_entry), GFP_ATOMIC);
481 if (tdls_entry == NULL)
482 return;
483
484 memcpy(tdls_entry->mac, peer, ETH_ALEN);
485 tdls_entry->next = NULL;
486 if (flow->tdls_entry == NULL) {
487 flow->tdls_entry = tdls_entry;
488 } else {
489 search = flow->tdls_entry;
490 if (memcmp(search->mac, peer, ETH_ALEN) == 0)
491 return;
492 while (search->next) {
493 search = search->next;
494 if (memcmp(search->mac, peer, ETH_ALEN) == 0)
495 return;
496 }
497 search->next = tdls_entry;
498 }
499
500 flow->tdls_active = true;
501}
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/flowring.h b/drivers/net/wireless/brcm80211/brcmfmac/flowring.h
new file mode 100644
index 000000000000..a34cd394c616
--- /dev/null
+++ b/drivers/net/wireless/brcm80211/brcmfmac/flowring.h
@@ -0,0 +1,84 @@
1/* Copyright (c) 2014 Broadcom Corporation
2 *
3 * Permission to use, copy, modify, and/or distribute this software for any
4 * purpose with or without fee is hereby granted, provided that the above
5 * copyright notice and this permission notice appear in all copies.
6 *
7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14 */
15#ifndef BRCMFMAC_FLOWRING_H
16#define BRCMFMAC_FLOWRING_H
17
18
19#define BRCMF_FLOWRING_HASHSIZE 256
20#define BRCMF_FLOWRING_INVALID_ID 0xFFFFFFFF
21
22
23struct brcmf_flowring_hash {
24 u8 mac[ETH_ALEN];
25 u8 fifo;
26 u8 ifidx;
27 u8 flowid;
28};
29
30enum ring_status {
31 RING_CLOSED,
32 RING_CLOSING,
33 RING_OPEN
34};
35
36struct brcmf_flowring_ring {
37 u8 hash_id;
38 bool blocked;
39 enum ring_status status;
40 struct sk_buff_head skblist;
41};
42
43struct brcmf_flowring_tdls_entry {
44 u8 mac[ETH_ALEN];
45 struct brcmf_flowring_tdls_entry *next;
46};
47
48struct brcmf_flowring {
49 struct device *dev;
50 struct brcmf_flowring_hash hash[BRCMF_FLOWRING_HASHSIZE];
51 struct brcmf_flowring_ring **rings;
52 spinlock_t block_lock;
53 enum proto_addr_mode addr_mode[BRCMF_MAX_IFS];
54 u16 nrofrings;
55 bool tdls_active;
56 struct brcmf_flowring_tdls_entry *tdls_entry;
57};
58
59
60u32 brcmf_flowring_lookup(struct brcmf_flowring *flow, u8 da[ETH_ALEN],
61 u8 prio, u8 ifidx);
62u32 brcmf_flowring_create(struct brcmf_flowring *flow, u8 da[ETH_ALEN],
63 u8 prio, u8 ifidx);
64void brcmf_flowring_delete(struct brcmf_flowring *flow, u8 flowid);
65void brcmf_flowring_open(struct brcmf_flowring *flow, u8 flowid);
66u8 brcmf_flowring_tid(struct brcmf_flowring *flow, u8 flowid);
67void brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid,
68 struct sk_buff *skb);
69struct sk_buff *brcmf_flowring_dequeue(struct brcmf_flowring *flow, u8 flowid);
70void brcmf_flowring_reinsert(struct brcmf_flowring *flow, u8 flowid,
71 struct sk_buff *skb);
72u32 brcmf_flowring_qlen(struct brcmf_flowring *flow, u8 flowid);
73u8 brcmf_flowring_ifidx_get(struct brcmf_flowring *flow, u8 flowid);
74struct brcmf_flowring *brcmf_flowring_attach(struct device *dev, u16 nrofrings);
75void brcmf_flowring_detach(struct brcmf_flowring *flow);
76void brcmf_flowring_configure_addr_mode(struct brcmf_flowring *flow, int ifidx,
77 enum proto_addr_mode addr_mode);
78void brcmf_flowring_delete_peer(struct brcmf_flowring *flow, int ifidx,
79 u8 peer[ETH_ALEN]);
80void brcmf_flowring_add_tdls_peer(struct brcmf_flowring *flow, int ifidx,
81 u8 peer[ETH_ALEN]);
82
83
84#endif /* BRCMFMAC_FLOWRING_H */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
index fad77dd2a3a5..4f1daabc551b 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c
@@ -293,7 +293,11 @@ static void brcmf_fweh_event_worker(struct work_struct *work)
293 goto event_free; 293 goto event_free;
294 } 294 }
295 295
296 ifp = drvr->iflist[emsg.bsscfgidx]; 296 if ((event->code == BRCMF_E_TDLS_PEER_EVENT) &&
297 (emsg.bsscfgidx == 1))
298 ifp = drvr->iflist[0];
299 else
300 ifp = drvr->iflist[emsg.bsscfgidx];
297 err = brcmf_fweh_call_event_handler(ifp, event->code, &emsg, 301 err = brcmf_fweh_call_event_handler(ifp, event->code, &emsg,
298 event->data); 302 event->data);
299 if (err) { 303 if (err) {
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fweh.h b/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
index 51b53a73d074..dd20b1862d44 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.h
@@ -102,6 +102,7 @@ struct brcmf_event;
102 BRCMF_ENUM_DEF(DCS_REQUEST, 73) \ 102 BRCMF_ENUM_DEF(DCS_REQUEST, 73) \
103 BRCMF_ENUM_DEF(FIFO_CREDIT_MAP, 74) \ 103 BRCMF_ENUM_DEF(FIFO_CREDIT_MAP, 74) \
104 BRCMF_ENUM_DEF(ACTION_FRAME_RX, 75) \ 104 BRCMF_ENUM_DEF(ACTION_FRAME_RX, 75) \
105 BRCMF_ENUM_DEF(TDLS_PEER_EVENT, 92) \
105 BRCMF_ENUM_DEF(BCMC_CREDIT_SUPPORT, 127) \ 106 BRCMF_ENUM_DEF(BCMC_CREDIT_SUPPORT, 127) \
106 BRCMF_ENUM_DEF(PSTA_PRIMARY_INTF_IND, 128) 107 BRCMF_ENUM_DEF(PSTA_PRIMARY_INTF_IND, 128)
107 108
@@ -155,6 +156,10 @@ enum brcmf_fweh_event_code {
155#define BRCMF_E_REASON_TSPEC_REJECTED 7 156#define BRCMF_E_REASON_TSPEC_REJECTED 7
156#define BRCMF_E_REASON_BETTER_AP 8 157#define BRCMF_E_REASON_BETTER_AP 8
157 158
159#define BRCMF_E_REASON_TDLS_PEER_DISCOVERED 0
160#define BRCMF_E_REASON_TDLS_PEER_CONNECTED 1
161#define BRCMF_E_REASON_TDLS_PEER_DISCONNECTED 2
162
158/* action field values for brcmf_ifevent */ 163/* action field values for brcmf_ifevent */
159#define BRCMF_E_IF_ADD 1 164#define BRCMF_E_IF_ADD 1
160#define BRCMF_E_IF_DEL 2 165#define BRCMF_E_IF_DEL 2
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
new file mode 100644
index 000000000000..535c7eb01b3a
--- /dev/null
+++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
@@ -0,0 +1,1397 @@
1/* Copyright (c) 2014 Broadcom Corporation
2 *
3 * Permission to use, copy, modify, and/or distribute this software for any
4 * purpose with or without fee is hereby granted, provided that the above
5 * copyright notice and this permission notice appear in all copies.
6 *
7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14 */
15
16/*******************************************************************************
17 * Communicates with the dongle by using dcmd codes.
18 * For certain dcmd codes, the dongle interprets string data from the host.
19 ******************************************************************************/
20
21#include <linux/types.h>
22#include <linux/netdevice.h>
23
24#include <brcmu_utils.h>
25#include <brcmu_wifi.h>
26
27#include "dhd.h"
28#include "dhd_dbg.h"
29#include "proto.h"
30#include "msgbuf.h"
31#include "commonring.h"
32#include "flowring.h"
33#include "dhd_bus.h"
34#include "tracepoint.h"
35
36
37#define MSGBUF_IOCTL_RESP_TIMEOUT 2000
38
39#define MSGBUF_TYPE_GEN_STATUS 0x1
40#define MSGBUF_TYPE_RING_STATUS 0x2
41#define MSGBUF_TYPE_FLOW_RING_CREATE 0x3
42#define MSGBUF_TYPE_FLOW_RING_CREATE_CMPLT 0x4
43#define MSGBUF_TYPE_FLOW_RING_DELETE 0x5
44#define MSGBUF_TYPE_FLOW_RING_DELETE_CMPLT 0x6
45#define MSGBUF_TYPE_FLOW_RING_FLUSH 0x7
46#define MSGBUF_TYPE_FLOW_RING_FLUSH_CMPLT 0x8
47#define MSGBUF_TYPE_IOCTLPTR_REQ 0x9
48#define MSGBUF_TYPE_IOCTLPTR_REQ_ACK 0xA
49#define MSGBUF_TYPE_IOCTLRESP_BUF_POST 0xB
50#define MSGBUF_TYPE_IOCTL_CMPLT 0xC
51#define MSGBUF_TYPE_EVENT_BUF_POST 0xD
52#define MSGBUF_TYPE_WL_EVENT 0xE
53#define MSGBUF_TYPE_TX_POST 0xF
54#define MSGBUF_TYPE_TX_STATUS 0x10
55#define MSGBUF_TYPE_RXBUF_POST 0x11
56#define MSGBUF_TYPE_RX_CMPLT 0x12
57#define MSGBUF_TYPE_LPBK_DMAXFER 0x13
58#define MSGBUF_TYPE_LPBK_DMAXFER_CMPLT 0x14
59
60#define NR_TX_PKTIDS 2048
61#define NR_RX_PKTIDS 1024
62
63#define BRCMF_IOCTL_REQ_PKTID 0xFFFE
64
65#define BRCMF_MSGBUF_MAX_PKT_SIZE 2048
66#define BRCMF_MSGBUF_RXBUFPOST_THRESHOLD 32
67#define BRCMF_MSGBUF_MAX_IOCTLRESPBUF_POST 8
68#define BRCMF_MSGBUF_MAX_EVENTBUF_POST 8
69
70#define BRCMF_MSGBUF_PKT_FLAGS_FRAME_802_3 0x01
71#define BRCMF_MSGBUF_PKT_FLAGS_PRIO_SHIFT 5
72
73#define BRCMF_MSGBUF_TX_FLUSH_CNT1 32
74#define BRCMF_MSGBUF_TX_FLUSH_CNT2 96
75
76
77struct msgbuf_common_hdr {
78 u8 msgtype;
79 u8 ifidx;
80 u8 flags;
81 u8 rsvd0;
82 __le32 request_id;
83};
84
85struct msgbuf_buf_addr {
86 __le32 low_addr;
87 __le32 high_addr;
88};
89
90struct msgbuf_ioctl_req_hdr {
91 struct msgbuf_common_hdr msg;
92 __le32 cmd;
93 __le16 trans_id;
94 __le16 input_buf_len;
95 __le16 output_buf_len;
96 __le16 rsvd0[3];
97 struct msgbuf_buf_addr req_buf_addr;
98 __le32 rsvd1[2];
99};
100
101struct msgbuf_tx_msghdr {
102 struct msgbuf_common_hdr msg;
103 u8 txhdr[ETH_HLEN];
104 u8 flags;
105 u8 seg_cnt;
106 struct msgbuf_buf_addr metadata_buf_addr;
107 struct msgbuf_buf_addr data_buf_addr;
108 __le16 metadata_buf_len;
109 __le16 data_len;
110 __le32 rsvd0;
111};
112
113struct msgbuf_rx_bufpost {
114 struct msgbuf_common_hdr msg;
115 __le16 metadata_buf_len;
116 __le16 data_buf_len;
117 __le32 rsvd0;
118 struct msgbuf_buf_addr metadata_buf_addr;
119 struct msgbuf_buf_addr data_buf_addr;
120};
121
122struct msgbuf_rx_ioctl_resp_or_event {
123 struct msgbuf_common_hdr msg;
124 __le16 host_buf_len;
125 __le16 rsvd0[3];
126 struct msgbuf_buf_addr host_buf_addr;
127 __le32 rsvd1[4];
128};
129
130struct msgbuf_completion_hdr {
131 __le16 status;
132 __le16 flow_ring_id;
133};
134
135struct msgbuf_rx_event {
136 struct msgbuf_common_hdr msg;
137 struct msgbuf_completion_hdr compl_hdr;
138 __le16 event_data_len;
139 __le16 seqnum;
140 __le16 rsvd0[4];
141};
142
143struct msgbuf_ioctl_resp_hdr {
144 struct msgbuf_common_hdr msg;
145 struct msgbuf_completion_hdr compl_hdr;
146 __le16 resp_len;
147 __le16 trans_id;
148 __le32 cmd;
149 __le32 rsvd0;
150};
151
152struct msgbuf_tx_status {
153 struct msgbuf_common_hdr msg;
154 struct msgbuf_completion_hdr compl_hdr;
155 __le16 metadata_len;
156 __le16 tx_status;
157};
158
159struct msgbuf_rx_complete {
160 struct msgbuf_common_hdr msg;
161 struct msgbuf_completion_hdr compl_hdr;
162 __le16 metadata_len;
163 __le16 data_len;
164 __le16 data_offset;
165 __le16 flags;
166 __le32 rx_status_0;
167 __le32 rx_status_1;
168 __le32 rsvd0;
169};
170
171struct msgbuf_tx_flowring_create_req {
172 struct msgbuf_common_hdr msg;
173 u8 da[ETH_ALEN];
174 u8 sa[ETH_ALEN];
175 u8 tid;
176 u8 if_flags;
177 __le16 flow_ring_id;
178 u8 tc;
179 u8 priority;
180 __le16 int_vector;
181 __le16 max_items;
182 __le16 len_item;
183 struct msgbuf_buf_addr flow_ring_addr;
184};
185
186struct msgbuf_tx_flowring_delete_req {
187 struct msgbuf_common_hdr msg;
188 __le16 flow_ring_id;
189 __le16 reason;
190 __le32 rsvd0[7];
191};
192
193struct msgbuf_flowring_create_resp {
194 struct msgbuf_common_hdr msg;
195 struct msgbuf_completion_hdr compl_hdr;
196 __le32 rsvd0[3];
197};
198
199struct msgbuf_flowring_delete_resp {
200 struct msgbuf_common_hdr msg;
201 struct msgbuf_completion_hdr compl_hdr;
202 __le32 rsvd0[3];
203};
204
205struct msgbuf_flowring_flush_resp {
206 struct msgbuf_common_hdr msg;
207 struct msgbuf_completion_hdr compl_hdr;
208 __le32 rsvd0[3];
209};
210
211struct brcmf_msgbuf {
212 struct brcmf_pub *drvr;
213
214 struct brcmf_commonring **commonrings;
215 struct brcmf_commonring **flowrings;
216 dma_addr_t *flowring_dma_handle;
217 u16 nrof_flowrings;
218
219 u16 rx_dataoffset;
220 u32 max_rxbufpost;
221 u16 rx_metadata_offset;
222 u32 rxbufpost;
223
224 u32 max_ioctlrespbuf;
225 u32 cur_ioctlrespbuf;
226 u32 max_eventbuf;
227 u32 cur_eventbuf;
228
229 void *ioctbuf;
230 dma_addr_t ioctbuf_handle;
231 u32 ioctbuf_phys_hi;
232 u32 ioctbuf_phys_lo;
233 u32 ioctl_resp_status;
234 u32 ioctl_resp_ret_len;
235 u32 ioctl_resp_pktid;
236
237 u16 data_seq_no;
238 u16 ioctl_seq_no;
239 u32 reqid;
240 wait_queue_head_t ioctl_resp_wait;
241 bool ctl_completed;
242
243 struct brcmf_msgbuf_pktids *tx_pktids;
244 struct brcmf_msgbuf_pktids *rx_pktids;
245 struct brcmf_flowring *flow;
246
247 struct workqueue_struct *txflow_wq;
248 struct work_struct txflow_work;
249 unsigned long *flow_map;
250 unsigned long *txstatus_done_map;
251};
252
253struct brcmf_msgbuf_pktid {
254 atomic_t allocated;
255 u16 data_offset;
256 struct sk_buff *skb;
257 dma_addr_t physaddr;
258};
259
260struct brcmf_msgbuf_pktids {
261 u32 array_size;
262 u32 last_allocated_idx;
263 enum dma_data_direction direction;
264 struct brcmf_msgbuf_pktid *array;
265};
266
267
268/* dma flushing needs implementation for mips and arm platforms. Should
269 * be put in util. Note, this is not real flushing. It is virtual non
270 * cached memory. Only write buffers should have to be drained. Though
271 * this may be different depending on platform......
272 */
273#define brcmf_dma_flush(addr, len)
274#define brcmf_dma_invalidate_cache(addr, len)
275
276
277static void brcmf_msgbuf_rxbuf_ioctlresp_post(struct brcmf_msgbuf *msgbuf);
278
279
280static struct brcmf_msgbuf_pktids *
281brcmf_msgbuf_init_pktids(u32 nr_array_entries,
282 enum dma_data_direction direction)
283{
284 struct brcmf_msgbuf_pktid *array;
285 struct brcmf_msgbuf_pktids *pktids;
286
287 array = kcalloc(nr_array_entries, sizeof(*array), GFP_ATOMIC);
288 if (!array)
289 return NULL;
290
291 pktids = kzalloc(sizeof(*pktids), GFP_ATOMIC);
292 if (!pktids) {
293 kfree(array);
294 return NULL;
295 }
296 pktids->array = array;
297 pktids->array_size = nr_array_entries;
298
299 return pktids;
300}
301
302
303static int
304brcmf_msgbuf_alloc_pktid(struct device *dev,
305 struct brcmf_msgbuf_pktids *pktids,
306 struct sk_buff *skb, u16 data_offset,
307 dma_addr_t *physaddr, u32 *idx)
308{
309 struct brcmf_msgbuf_pktid *array;
310 u32 count;
311
312 array = pktids->array;
313
314 *physaddr = dma_map_single(dev, skb->data + data_offset,
315 skb->len - data_offset, pktids->direction);
316
317 if (dma_mapping_error(dev, *physaddr)) {
318 brcmf_err("dma_map_single failed !!\n");
319 return -ENOMEM;
320 }
321
322 *idx = pktids->last_allocated_idx;
323
324 count = 0;
325 do {
326 (*idx)++;
327 if (*idx == pktids->array_size)
328 *idx = 0;
329 if (array[*idx].allocated.counter == 0)
330 if (atomic_cmpxchg(&array[*idx].allocated, 0, 1) == 0)
331 break;
332 count++;
333 } while (count < pktids->array_size);
334
335 if (count == pktids->array_size)
336 return -ENOMEM;
337
338 array[*idx].data_offset = data_offset;
339 array[*idx].physaddr = *physaddr;
340 array[*idx].skb = skb;
341
342 pktids->last_allocated_idx = *idx;
343
344 return 0;
345}
346
347
348static struct sk_buff *
349brcmf_msgbuf_get_pktid(struct device *dev, struct brcmf_msgbuf_pktids *pktids,
350 u32 idx)
351{
352 struct brcmf_msgbuf_pktid *pktid;
353 struct sk_buff *skb;
354
355 if (idx >= pktids->array_size) {
356 brcmf_err("Invalid packet id %d (max %d)\n", idx,
357 pktids->array_size);
358 return NULL;
359 }
360 if (pktids->array[idx].allocated.counter) {
361 pktid = &pktids->array[idx];
362 dma_unmap_single(dev, pktid->physaddr,
363 pktid->skb->len - pktid->data_offset,
364 pktids->direction);
365 skb = pktid->skb;
366 pktid->allocated.counter = 0;
367 return skb;
368 } else {
369 brcmf_err("Invalid packet id %d (not in use)\n", idx);
370 }
371
372 return NULL;
373}
374
375
376static void
377brcmf_msgbuf_release_array(struct device *dev,
378 struct brcmf_msgbuf_pktids *pktids)
379{
380 struct brcmf_msgbuf_pktid *array;
381 struct brcmf_msgbuf_pktid *pktid;
382 u32 count;
383
384 array = pktids->array;
385 count = 0;
386 do {
387 if (array[count].allocated.counter) {
388 pktid = &array[count];
389 dma_unmap_single(dev, pktid->physaddr,
390 pktid->skb->len - pktid->data_offset,
391 pktids->direction);
392 brcmu_pkt_buf_free_skb(pktid->skb);
393 }
394 count++;
395 } while (count < pktids->array_size);
396
397 kfree(array);
398 kfree(pktids);
399}
400
401
402static void brcmf_msgbuf_release_pktids(struct brcmf_msgbuf *msgbuf)
403{
404 if (msgbuf->rx_pktids)
405 brcmf_msgbuf_release_array(msgbuf->drvr->bus_if->dev,
406 msgbuf->rx_pktids);
407 if (msgbuf->tx_pktids)
408 brcmf_msgbuf_release_array(msgbuf->drvr->bus_if->dev,
409 msgbuf->tx_pktids);
410}
411
412
413static int brcmf_msgbuf_tx_ioctl(struct brcmf_pub *drvr, int ifidx,
414 uint cmd, void *buf, uint len)
415{
416 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
417 struct brcmf_commonring *commonring;
418 struct msgbuf_ioctl_req_hdr *request;
419 u16 buf_len;
420 void *ret_ptr;
421 int err;
422
423 commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_CONTROL_SUBMIT];
424 brcmf_commonring_lock(commonring);
425 ret_ptr = brcmf_commonring_reserve_for_write(commonring);
426 if (!ret_ptr) {
427 brcmf_err("Failed to reserve space in commonring\n");
428 brcmf_commonring_unlock(commonring);
429 return -ENOMEM;
430 }
431
432 msgbuf->reqid++;
433
434 request = (struct msgbuf_ioctl_req_hdr *)ret_ptr;
435 request->msg.msgtype = MSGBUF_TYPE_IOCTLPTR_REQ;
436 request->msg.ifidx = (u8)ifidx;
437 request->msg.flags = 0;
438 request->msg.request_id = cpu_to_le32(BRCMF_IOCTL_REQ_PKTID);
439 request->cmd = cpu_to_le32(cmd);
440 request->output_buf_len = cpu_to_le16(len);
441 request->trans_id = cpu_to_le16(msgbuf->reqid);
442
443 buf_len = min_t(u16, len, BRCMF_TX_IOCTL_MAX_MSG_SIZE);
444 request->input_buf_len = cpu_to_le16(buf_len);
445 request->req_buf_addr.high_addr = cpu_to_le32(msgbuf->ioctbuf_phys_hi);
446 request->req_buf_addr.low_addr = cpu_to_le32(msgbuf->ioctbuf_phys_lo);
447 if (buf)
448 memcpy(msgbuf->ioctbuf, buf, buf_len);
449 else
450 memset(msgbuf->ioctbuf, 0, buf_len);
451 brcmf_dma_flush(ioctl_buf, buf_len);
452
453 err = brcmf_commonring_write_complete(commonring);
454 brcmf_commonring_unlock(commonring);
455
456 return err;
457}
458
459
460static int brcmf_msgbuf_ioctl_resp_wait(struct brcmf_msgbuf *msgbuf)
461{
462 return wait_event_timeout(msgbuf->ioctl_resp_wait,
463 msgbuf->ctl_completed,
464 msecs_to_jiffies(MSGBUF_IOCTL_RESP_TIMEOUT));
465}
466
467
468static void brcmf_msgbuf_ioctl_resp_wake(struct brcmf_msgbuf *msgbuf)
469{
470 if (waitqueue_active(&msgbuf->ioctl_resp_wait)) {
471 msgbuf->ctl_completed = true;
472 wake_up(&msgbuf->ioctl_resp_wait);
473 }
474}
475
476
477static int brcmf_msgbuf_query_dcmd(struct brcmf_pub *drvr, int ifidx,
478 uint cmd, void *buf, uint len)
479{
480 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
481 struct sk_buff *skb = NULL;
482 int timeout;
483 int err;
484
485 brcmf_dbg(MSGBUF, "ifidx=%d, cmd=%d, len=%d\n", ifidx, cmd, len);
486 msgbuf->ctl_completed = false;
487 err = brcmf_msgbuf_tx_ioctl(drvr, ifidx, cmd, buf, len);
488 if (err)
489 return err;
490
491 timeout = brcmf_msgbuf_ioctl_resp_wait(msgbuf);
492 if (!timeout) {
493 brcmf_err("Timeout on response for query command\n");
494 return -EIO;
495 }
496
497 skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev,
498 msgbuf->rx_pktids,
499 msgbuf->ioctl_resp_pktid);
500 if (msgbuf->ioctl_resp_ret_len != 0) {
501 if (!skb) {
502 brcmf_err("Invalid packet id idx recv'd %d\n",
503 msgbuf->ioctl_resp_pktid);
504 return -EBADF;
505 }
506 memcpy(buf, skb->data, (len < msgbuf->ioctl_resp_ret_len) ?
507 len : msgbuf->ioctl_resp_ret_len);
508 }
509 if (skb)
510 brcmu_pkt_buf_free_skb(skb);
511
512 return msgbuf->ioctl_resp_status;
513}
514
515
516static int brcmf_msgbuf_set_dcmd(struct brcmf_pub *drvr, int ifidx,
517 uint cmd, void *buf, uint len)
518{
519 return brcmf_msgbuf_query_dcmd(drvr, ifidx, cmd, buf, len);
520}
521
522
523static int brcmf_msgbuf_hdrpull(struct brcmf_pub *drvr, bool do_fws,
524 u8 *ifidx, struct sk_buff *skb)
525{
526 return -ENODEV;
527}
528
529
530static void
531brcmf_msgbuf_remove_flowring(struct brcmf_msgbuf *msgbuf, u16 flowid)
532{
533 u32 dma_sz;
534 void *dma_buf;
535
536 brcmf_dbg(MSGBUF, "Removing flowring %d\n", flowid);
537
538 dma_sz = BRCMF_H2D_TXFLOWRING_MAX_ITEM * BRCMF_H2D_TXFLOWRING_ITEMSIZE;
539 dma_buf = msgbuf->flowrings[flowid]->buf_addr;
540 dma_free_coherent(msgbuf->drvr->bus_if->dev, dma_sz, dma_buf,
541 msgbuf->flowring_dma_handle[flowid]);
542
543 brcmf_flowring_delete(msgbuf->flow, flowid);
544}
545
546
547static u32 brcmf_msgbuf_flowring_create(struct brcmf_msgbuf *msgbuf, int ifidx,
548 struct sk_buff *skb)
549{
550 struct msgbuf_tx_flowring_create_req *create;
551 struct ethhdr *eh = (struct ethhdr *)(skb->data);
552 struct brcmf_commonring *commonring;
553 void *ret_ptr;
554 u32 flowid;
555 void *dma_buf;
556 u32 dma_sz;
557 long long address;
558 int err;
559
560 flowid = brcmf_flowring_create(msgbuf->flow, eh->h_dest,
561 skb->priority, ifidx);
562 if (flowid == BRCMF_FLOWRING_INVALID_ID)
563 return flowid;
564
565 dma_sz = BRCMF_H2D_TXFLOWRING_MAX_ITEM * BRCMF_H2D_TXFLOWRING_ITEMSIZE;
566
567 dma_buf = dma_alloc_coherent(msgbuf->drvr->bus_if->dev, dma_sz,
568 &msgbuf->flowring_dma_handle[flowid],
569 GFP_ATOMIC);
570 if (!dma_buf) {
571 brcmf_err("dma_alloc_coherent failed\n");
572 brcmf_flowring_delete(msgbuf->flow, flowid);
573 return BRCMF_FLOWRING_INVALID_ID;
574 }
575
576 brcmf_commonring_config(msgbuf->flowrings[flowid],
577 BRCMF_H2D_TXFLOWRING_MAX_ITEM,
578 BRCMF_H2D_TXFLOWRING_ITEMSIZE, dma_buf);
579
580 commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_CONTROL_SUBMIT];
581 brcmf_commonring_lock(commonring);
582 ret_ptr = brcmf_commonring_reserve_for_write(commonring);
583 if (!ret_ptr) {
584 brcmf_err("Failed to reserve space in commonring\n");
585 brcmf_commonring_unlock(commonring);
586 brcmf_msgbuf_remove_flowring(msgbuf, flowid);
587 return BRCMF_FLOWRING_INVALID_ID;
588 }
589
590 create = (struct msgbuf_tx_flowring_create_req *)ret_ptr;
591 create->msg.msgtype = MSGBUF_TYPE_FLOW_RING_CREATE;
592 create->msg.ifidx = ifidx;
593 create->msg.request_id = 0;
594 create->tid = brcmf_flowring_tid(msgbuf->flow, flowid);
595 create->flow_ring_id = cpu_to_le16(flowid +
596 BRCMF_NROF_H2D_COMMON_MSGRINGS);
597 memcpy(create->sa, eh->h_source, ETH_ALEN);
598 memcpy(create->da, eh->h_dest, ETH_ALEN);
599 address = (long long)(long)msgbuf->flowring_dma_handle[flowid];
600 create->flow_ring_addr.high_addr = cpu_to_le32(address >> 32);
601 create->flow_ring_addr.low_addr = cpu_to_le32(address & 0xffffffff);
602 create->max_items = cpu_to_le16(BRCMF_H2D_TXFLOWRING_MAX_ITEM);
603 create->len_item = cpu_to_le16(BRCMF_H2D_TXFLOWRING_ITEMSIZE);
604
605 brcmf_dbg(MSGBUF, "Send Flow Create Req flow ID %d for peer %pM prio %d ifindex %d\n",
606 flowid, eh->h_dest, create->tid, ifidx);
607
608 err = brcmf_commonring_write_complete(commonring);
609 brcmf_commonring_unlock(commonring);
610 if (err) {
611 brcmf_err("Failed to write commonring\n");
612 brcmf_msgbuf_remove_flowring(msgbuf, flowid);
613 return BRCMF_FLOWRING_INVALID_ID;
614 }
615
616 return flowid;
617}
618
619
620static void brcmf_msgbuf_txflow(struct brcmf_msgbuf *msgbuf, u8 flowid)
621{
622 struct brcmf_flowring *flow = msgbuf->flow;
623 struct brcmf_commonring *commonring;
624 void *ret_ptr;
625 u32 count;
626 struct sk_buff *skb;
627 dma_addr_t physaddr;
628 u32 pktid;
629 struct msgbuf_tx_msghdr *tx_msghdr;
630 long long address;
631
632 commonring = msgbuf->flowrings[flowid];
633 if (!brcmf_commonring_write_available(commonring))
634 return;
635
636 brcmf_commonring_lock(commonring);
637
638 count = BRCMF_MSGBUF_TX_FLUSH_CNT2 - BRCMF_MSGBUF_TX_FLUSH_CNT1;
639 while (brcmf_flowring_qlen(flow, flowid)) {
640 skb = brcmf_flowring_dequeue(flow, flowid);
641 if (skb == NULL) {
642 brcmf_err("No SKB, but qlen %d\n",
643 brcmf_flowring_qlen(flow, flowid));
644 break;
645 }
646 skb_orphan(skb);
647 if (brcmf_msgbuf_alloc_pktid(msgbuf->drvr->bus_if->dev,
648 msgbuf->tx_pktids, skb, ETH_HLEN,
649 &physaddr, &pktid)) {
650 brcmf_flowring_reinsert(flow, flowid, skb);
651 brcmf_err("No PKTID available !!\n");
652 break;
653 }
654 ret_ptr = brcmf_commonring_reserve_for_write(commonring);
655 if (!ret_ptr) {
656 brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev,
657 msgbuf->tx_pktids, pktid);
658 brcmf_flowring_reinsert(flow, flowid, skb);
659 break;
660 }
661 count++;
662
663 tx_msghdr = (struct msgbuf_tx_msghdr *)ret_ptr;
664
665 tx_msghdr->msg.msgtype = MSGBUF_TYPE_TX_POST;
666 tx_msghdr->msg.request_id = cpu_to_le32(pktid);
667 tx_msghdr->msg.ifidx = brcmf_flowring_ifidx_get(flow, flowid);
668 tx_msghdr->flags = BRCMF_MSGBUF_PKT_FLAGS_FRAME_802_3;
669 tx_msghdr->flags |= (skb->priority & 0x07) <<
670 BRCMF_MSGBUF_PKT_FLAGS_PRIO_SHIFT;
671 tx_msghdr->seg_cnt = 1;
672 memcpy(tx_msghdr->txhdr, skb->data, ETH_HLEN);
673 tx_msghdr->data_len = cpu_to_le16(skb->len - ETH_HLEN);
674 address = (long long)(long)physaddr;
675 tx_msghdr->data_buf_addr.high_addr = cpu_to_le32(address >> 32);
676 tx_msghdr->data_buf_addr.low_addr =
677 cpu_to_le32(address & 0xffffffff);
678 tx_msghdr->metadata_buf_len = 0;
679 tx_msghdr->metadata_buf_addr.high_addr = 0;
680 tx_msghdr->metadata_buf_addr.low_addr = 0;
681 if (count >= BRCMF_MSGBUF_TX_FLUSH_CNT2) {
682 brcmf_commonring_write_complete(commonring);
683 count = 0;
684 }
685 }
686 if (count)
687 brcmf_commonring_write_complete(commonring);
688 brcmf_commonring_unlock(commonring);
689}
690
691
692static void brcmf_msgbuf_txflow_worker(struct work_struct *worker)
693{
694 struct brcmf_msgbuf *msgbuf;
695 u32 flowid;
696
697 msgbuf = container_of(worker, struct brcmf_msgbuf, txflow_work);
698 for_each_set_bit(flowid, msgbuf->flow_map, msgbuf->nrof_flowrings) {
699 clear_bit(flowid, msgbuf->flow_map);
700 brcmf_msgbuf_txflow(msgbuf, flowid);
701 }
702}
703
704
705static int brcmf_msgbuf_schedule_txdata(struct brcmf_msgbuf *msgbuf, u32 flowid)
706{
707 set_bit(flowid, msgbuf->flow_map);
708 queue_work(msgbuf->txflow_wq, &msgbuf->txflow_work);
709
710 return 0;
711}
712
713
714static int brcmf_msgbuf_txdata(struct brcmf_pub *drvr, int ifidx,
715 u8 offset, struct sk_buff *skb)
716{
717 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
718 struct brcmf_flowring *flow = msgbuf->flow;
719 struct ethhdr *eh = (struct ethhdr *)(skb->data);
720 u32 flowid;
721
722 flowid = brcmf_flowring_lookup(flow, eh->h_dest, skb->priority, ifidx);
723 if (flowid == BRCMF_FLOWRING_INVALID_ID) {
724 flowid = brcmf_msgbuf_flowring_create(msgbuf, ifidx, skb);
725 if (flowid == BRCMF_FLOWRING_INVALID_ID)
726 return -ENOMEM;
727 }
728 brcmf_flowring_enqueue(flow, flowid, skb);
729 brcmf_msgbuf_schedule_txdata(msgbuf, flowid);
730
731 return 0;
732}
733
734
735static void
736brcmf_msgbuf_configure_addr_mode(struct brcmf_pub *drvr, int ifidx,
737 enum proto_addr_mode addr_mode)
738{
739 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
740
741 brcmf_flowring_configure_addr_mode(msgbuf->flow, ifidx, addr_mode);
742}
743
744
745static void
746brcmf_msgbuf_delete_peer(struct brcmf_pub *drvr, int ifidx, u8 peer[ETH_ALEN])
747{
748 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
749
750 brcmf_flowring_delete_peer(msgbuf->flow, ifidx, peer);
751}
752
753
754static void
755brcmf_msgbuf_add_tdls_peer(struct brcmf_pub *drvr, int ifidx, u8 peer[ETH_ALEN])
756{
757 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
758
759 brcmf_flowring_add_tdls_peer(msgbuf->flow, ifidx, peer);
760}
761
762
763static void
764brcmf_msgbuf_process_ioctl_complete(struct brcmf_msgbuf *msgbuf, void *buf)
765{
766 struct msgbuf_ioctl_resp_hdr *ioctl_resp;
767
768 ioctl_resp = (struct msgbuf_ioctl_resp_hdr *)buf;
769
770 msgbuf->ioctl_resp_status = le16_to_cpu(ioctl_resp->compl_hdr.status);
771 msgbuf->ioctl_resp_ret_len = le16_to_cpu(ioctl_resp->resp_len);
772 msgbuf->ioctl_resp_pktid = le32_to_cpu(ioctl_resp->msg.request_id);
773
774 brcmf_msgbuf_ioctl_resp_wake(msgbuf);
775
776 if (msgbuf->cur_ioctlrespbuf)
777 msgbuf->cur_ioctlrespbuf--;
778 brcmf_msgbuf_rxbuf_ioctlresp_post(msgbuf);
779}
780
781
782static void
783brcmf_msgbuf_process_txstatus(struct brcmf_msgbuf *msgbuf, void *buf)
784{
785 struct msgbuf_tx_status *tx_status;
786 u32 idx;
787 struct sk_buff *skb;
788 u16 flowid;
789
790 tx_status = (struct msgbuf_tx_status *)buf;
791 idx = le32_to_cpu(tx_status->msg.request_id);
792 flowid = le16_to_cpu(tx_status->compl_hdr.flow_ring_id);
793 flowid -= BRCMF_NROF_H2D_COMMON_MSGRINGS;
794 skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev,
795 msgbuf->tx_pktids, idx);
796 if (!skb) {
797 brcmf_err("Invalid packet id idx recv'd %d\n", idx);
798 return;
799 }
800
801 set_bit(flowid, msgbuf->txstatus_done_map);
802
803 brcmf_txfinalize(msgbuf->drvr, skb, tx_status->msg.ifidx, true);
804}
805
806
807static u32 brcmf_msgbuf_rxbuf_data_post(struct brcmf_msgbuf *msgbuf, u32 count)
808{
809 struct brcmf_commonring *commonring;
810 void *ret_ptr;
811 struct sk_buff *skb;
812 u16 alloced;
813 u32 pktlen;
814 dma_addr_t physaddr;
815 struct msgbuf_rx_bufpost *rx_bufpost;
816 long long address;
817 u32 pktid;
818 u32 i;
819
820 commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_RXPOST_SUBMIT];
821 ret_ptr = brcmf_commonring_reserve_for_write_multiple(commonring,
822 count,
823 &alloced);
824 if (!ret_ptr) {
825 brcmf_err("Failed to reserve space in commonring\n");
826 return 0;
827 }
828
829 for (i = 0; i < alloced; i++) {
830 rx_bufpost = (struct msgbuf_rx_bufpost *)ret_ptr;
831 memset(rx_bufpost, 0, sizeof(*rx_bufpost));
832
833 skb = brcmu_pkt_buf_get_skb(BRCMF_MSGBUF_MAX_PKT_SIZE);
834
835 if (skb == NULL) {
836 brcmf_err("Failed to alloc SKB\n");
837 brcmf_commonring_write_cancel(commonring, alloced - i);
838 break;
839 }
840
841 pktlen = skb->len;
842 if (brcmf_msgbuf_alloc_pktid(msgbuf->drvr->bus_if->dev,
843 msgbuf->rx_pktids, skb, 0,
844 &physaddr, &pktid)) {
845 dev_kfree_skb_any(skb);
846 brcmf_err("No PKTID available !!\n");
847 brcmf_commonring_write_cancel(commonring, alloced - i);
848 break;
849 }
850
851 if (msgbuf->rx_metadata_offset) {
852 address = (long long)(long)physaddr;
853 rx_bufpost->metadata_buf_len =
854 cpu_to_le16(msgbuf->rx_metadata_offset);
855 rx_bufpost->metadata_buf_addr.high_addr =
856 cpu_to_le32(address >> 32);
857 rx_bufpost->metadata_buf_addr.low_addr =
858 cpu_to_le32(address & 0xffffffff);
859
860 skb_pull(skb, msgbuf->rx_metadata_offset);
861 pktlen = skb->len;
862 physaddr += msgbuf->rx_metadata_offset;
863 }
864 rx_bufpost->msg.msgtype = MSGBUF_TYPE_RXBUF_POST;
865 rx_bufpost->msg.request_id = cpu_to_le32(pktid);
866
867 address = (long long)(long)physaddr;
868 rx_bufpost->data_buf_len = cpu_to_le16((u16)pktlen);
869 rx_bufpost->data_buf_addr.high_addr =
870 cpu_to_le32(address >> 32);
871 rx_bufpost->data_buf_addr.low_addr =
872 cpu_to_le32(address & 0xffffffff);
873
874 ret_ptr += brcmf_commonring_len_item(commonring);
875 }
876
877 if (i)
878 brcmf_commonring_write_complete(commonring);
879
880 return i;
881}
882
883
884static void
885brcmf_msgbuf_rxbuf_data_fill(struct brcmf_msgbuf *msgbuf)
886{
887 u32 fillbufs;
888 u32 retcount;
889
890 fillbufs = msgbuf->max_rxbufpost - msgbuf->rxbufpost;
891
892 while (fillbufs) {
893 retcount = brcmf_msgbuf_rxbuf_data_post(msgbuf, fillbufs);
894 if (!retcount)
895 break;
896 msgbuf->rxbufpost += retcount;
897 fillbufs -= retcount;
898 }
899}
900
901
902static void
903brcmf_msgbuf_update_rxbufpost_count(struct brcmf_msgbuf *msgbuf, u16 rxcnt)
904{
905 msgbuf->rxbufpost -= rxcnt;
906 if (msgbuf->rxbufpost <= (msgbuf->max_rxbufpost -
907 BRCMF_MSGBUF_RXBUFPOST_THRESHOLD))
908 brcmf_msgbuf_rxbuf_data_fill(msgbuf);
909}
910
911
912static u32
913brcmf_msgbuf_rxbuf_ctrl_post(struct brcmf_msgbuf *msgbuf, bool event_buf,
914 u32 count)
915{
916 struct brcmf_commonring *commonring;
917 void *ret_ptr;
918 struct sk_buff *skb;
919 u16 alloced;
920 u32 pktlen;
921 dma_addr_t physaddr;
922 struct msgbuf_rx_ioctl_resp_or_event *rx_bufpost;
923 long long address;
924 u32 pktid;
925 u32 i;
926
927 commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_CONTROL_SUBMIT];
928 brcmf_commonring_lock(commonring);
929 ret_ptr = brcmf_commonring_reserve_for_write_multiple(commonring,
930 count,
931 &alloced);
932 if (!ret_ptr) {
933 brcmf_err("Failed to reserve space in commonring\n");
934 brcmf_commonring_unlock(commonring);
935 return 0;
936 }
937
938 for (i = 0; i < alloced; i++) {
939 rx_bufpost = (struct msgbuf_rx_ioctl_resp_or_event *)ret_ptr;
940 memset(rx_bufpost, 0, sizeof(*rx_bufpost));
941
942 skb = brcmu_pkt_buf_get_skb(BRCMF_MSGBUF_MAX_PKT_SIZE);
943
944 if (skb == NULL) {
945 brcmf_err("Failed to alloc SKB\n");
946 brcmf_commonring_write_cancel(commonring, alloced - i);
947 break;
948 }
949
950 pktlen = skb->len;
951 if (brcmf_msgbuf_alloc_pktid(msgbuf->drvr->bus_if->dev,
952 msgbuf->rx_pktids, skb, 0,
953 &physaddr, &pktid)) {
954 dev_kfree_skb_any(skb);
955 brcmf_err("No PKTID available !!\n");
956 brcmf_commonring_write_cancel(commonring, alloced - i);
957 break;
958 }
959 if (event_buf)
960 rx_bufpost->msg.msgtype = MSGBUF_TYPE_EVENT_BUF_POST;
961 else
962 rx_bufpost->msg.msgtype =
963 MSGBUF_TYPE_IOCTLRESP_BUF_POST;
964 rx_bufpost->msg.request_id = cpu_to_le32(pktid);
965
966 address = (long long)(long)physaddr;
967 rx_bufpost->host_buf_len = cpu_to_le16((u16)pktlen);
968 rx_bufpost->host_buf_addr.high_addr =
969 cpu_to_le32(address >> 32);
970 rx_bufpost->host_buf_addr.low_addr =
971 cpu_to_le32(address & 0xffffffff);
972
973 ret_ptr += brcmf_commonring_len_item(commonring);
974 }
975
976 if (i)
977 brcmf_commonring_write_complete(commonring);
978
979 brcmf_commonring_unlock(commonring);
980
981 return i;
982}
983
984
985static void brcmf_msgbuf_rxbuf_ioctlresp_post(struct brcmf_msgbuf *msgbuf)
986{
987 u32 count;
988
989 count = msgbuf->max_ioctlrespbuf - msgbuf->cur_ioctlrespbuf;
990 count = brcmf_msgbuf_rxbuf_ctrl_post(msgbuf, false, count);
991 msgbuf->cur_ioctlrespbuf += count;
992}
993
994
995static void brcmf_msgbuf_rxbuf_event_post(struct brcmf_msgbuf *msgbuf)
996{
997 u32 count;
998
999 count = msgbuf->max_eventbuf - msgbuf->cur_eventbuf;
1000 count = brcmf_msgbuf_rxbuf_ctrl_post(msgbuf, true, count);
1001 msgbuf->cur_eventbuf += count;
1002}
1003
1004
1005static void
1006brcmf_msgbuf_rx_skb(struct brcmf_msgbuf *msgbuf, struct sk_buff *skb,
1007 u8 ifidx)
1008{
1009 struct brcmf_if *ifp;
1010
1011 ifp = msgbuf->drvr->iflist[ifidx];
1012 if (!ifp || !ifp->ndev) {
1013 brcmu_pkt_buf_free_skb(skb);
1014 return;
1015 }
1016 brcmf_netif_rx(ifp, skb);
1017}
1018
1019
1020static void brcmf_msgbuf_process_event(struct brcmf_msgbuf *msgbuf, void *buf)
1021{
1022 struct msgbuf_rx_event *event;
1023 u32 idx;
1024 u16 buflen;
1025 struct sk_buff *skb;
1026
1027 event = (struct msgbuf_rx_event *)buf;
1028 idx = le32_to_cpu(event->msg.request_id);
1029 buflen = le16_to_cpu(event->event_data_len);
1030
1031 if (msgbuf->cur_eventbuf)
1032 msgbuf->cur_eventbuf--;
1033 brcmf_msgbuf_rxbuf_event_post(msgbuf);
1034
1035 skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev,
1036 msgbuf->rx_pktids, idx);
1037 if (!skb)
1038 return;
1039
1040 if (msgbuf->rx_dataoffset)
1041 skb_pull(skb, msgbuf->rx_dataoffset);
1042
1043 skb_trim(skb, buflen);
1044
1045 brcmf_msgbuf_rx_skb(msgbuf, skb, event->msg.ifidx);
1046}
1047
1048
1049static void
1050brcmf_msgbuf_process_rx_complete(struct brcmf_msgbuf *msgbuf, void *buf)
1051{
1052 struct msgbuf_rx_complete *rx_complete;
1053 struct sk_buff *skb;
1054 u16 data_offset;
1055 u16 buflen;
1056 u32 idx;
1057
1058 brcmf_msgbuf_update_rxbufpost_count(msgbuf, 1);
1059
1060 rx_complete = (struct msgbuf_rx_complete *)buf;
1061 data_offset = le16_to_cpu(rx_complete->data_offset);
1062 buflen = le16_to_cpu(rx_complete->data_len);
1063 idx = le32_to_cpu(rx_complete->msg.request_id);
1064
1065 skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev,
1066 msgbuf->rx_pktids, idx);
1067
1068 if (data_offset)
1069 skb_pull(skb, data_offset);
1070 else if (msgbuf->rx_dataoffset)
1071 skb_pull(skb, msgbuf->rx_dataoffset);
1072
1073 skb_trim(skb, buflen);
1074
1075 brcmf_msgbuf_rx_skb(msgbuf, skb, rx_complete->msg.ifidx);
1076}
1077
1078
1079static void
1080brcmf_msgbuf_process_flow_ring_create_response(struct brcmf_msgbuf *msgbuf,
1081 void *buf)
1082{
1083 struct msgbuf_flowring_create_resp *flowring_create_resp;
1084 u16 status;
1085 u16 flowid;
1086
1087 flowring_create_resp = (struct msgbuf_flowring_create_resp *)buf;
1088
1089 flowid = le16_to_cpu(flowring_create_resp->compl_hdr.flow_ring_id);
1090 flowid -= BRCMF_NROF_H2D_COMMON_MSGRINGS;
1091 status = le16_to_cpu(flowring_create_resp->compl_hdr.status);
1092
1093 if (status) {
1094 brcmf_err("Flowring creation failed, code %d\n", status);
1095 brcmf_msgbuf_remove_flowring(msgbuf, flowid);
1096 return;
1097 }
1098 brcmf_dbg(MSGBUF, "Flowring %d Create response status %d\n", flowid,
1099 status);
1100
1101 brcmf_flowring_open(msgbuf->flow, flowid);
1102
1103 brcmf_msgbuf_schedule_txdata(msgbuf, flowid);
1104}
1105
1106
1107static void
1108brcmf_msgbuf_process_flow_ring_delete_response(struct brcmf_msgbuf *msgbuf,
1109 void *buf)
1110{
1111 struct msgbuf_flowring_delete_resp *flowring_delete_resp;
1112 u16 status;
1113 u16 flowid;
1114
1115 flowring_delete_resp = (struct msgbuf_flowring_delete_resp *)buf;
1116
1117 flowid = le16_to_cpu(flowring_delete_resp->compl_hdr.flow_ring_id);
1118 flowid -= BRCMF_NROF_H2D_COMMON_MSGRINGS;
1119 status = le16_to_cpu(flowring_delete_resp->compl_hdr.status);
1120
1121 if (status) {
1122 brcmf_err("Flowring deletion failed, code %d\n", status);
1123 brcmf_flowring_delete(msgbuf->flow, flowid);
1124 return;
1125 }
1126 brcmf_dbg(MSGBUF, "Flowring %d Delete response status %d\n", flowid,
1127 status);
1128
1129 brcmf_msgbuf_remove_flowring(msgbuf, flowid);
1130}
1131
1132
1133static void brcmf_msgbuf_process_msgtype(struct brcmf_msgbuf *msgbuf, void *buf)
1134{
1135 struct msgbuf_common_hdr *msg;
1136
1137 msg = (struct msgbuf_common_hdr *)buf;
1138 switch (msg->msgtype) {
1139 case MSGBUF_TYPE_FLOW_RING_CREATE_CMPLT:
1140 brcmf_dbg(MSGBUF, "MSGBUF_TYPE_FLOW_RING_CREATE_CMPLT\n");
1141 brcmf_msgbuf_process_flow_ring_create_response(msgbuf, buf);
1142 break;
1143 case MSGBUF_TYPE_FLOW_RING_DELETE_CMPLT:
1144 brcmf_dbg(MSGBUF, "MSGBUF_TYPE_FLOW_RING_DELETE_CMPLT\n");
1145 brcmf_msgbuf_process_flow_ring_delete_response(msgbuf, buf);
1146 break;
1147 case MSGBUF_TYPE_IOCTLPTR_REQ_ACK:
1148 brcmf_dbg(MSGBUF, "MSGBUF_TYPE_IOCTLPTR_REQ_ACK\n");
1149 break;
1150 case MSGBUF_TYPE_IOCTL_CMPLT:
1151 brcmf_dbg(MSGBUF, "MSGBUF_TYPE_IOCTL_CMPLT\n");
1152 brcmf_msgbuf_process_ioctl_complete(msgbuf, buf);
1153 break;
1154 case MSGBUF_TYPE_WL_EVENT:
1155 brcmf_dbg(MSGBUF, "MSGBUF_TYPE_WL_EVENT\n");
1156 brcmf_msgbuf_process_event(msgbuf, buf);
1157 break;
1158 case MSGBUF_TYPE_TX_STATUS:
1159 brcmf_dbg(MSGBUF, "MSGBUF_TYPE_TX_STATUS\n");
1160 brcmf_msgbuf_process_txstatus(msgbuf, buf);
1161 break;
1162 case MSGBUF_TYPE_RX_CMPLT:
1163 brcmf_dbg(MSGBUF, "MSGBUF_TYPE_RX_CMPLT\n");
1164 brcmf_msgbuf_process_rx_complete(msgbuf, buf);
1165 break;
1166 default:
1167 brcmf_err("Unsupported msgtype %d\n", msg->msgtype);
1168 break;
1169 }
1170}
1171
1172
1173static void brcmf_msgbuf_process_rx(struct brcmf_msgbuf *msgbuf,
1174 struct brcmf_commonring *commonring)
1175{
1176 void *buf;
1177 u16 count;
1178
1179again:
1180 buf = brcmf_commonring_get_read_ptr(commonring, &count);
1181 if (buf == NULL)
1182 return;
1183
1184 while (count) {
1185 brcmf_msgbuf_process_msgtype(msgbuf,
1186 buf + msgbuf->rx_dataoffset);
1187 buf += brcmf_commonring_len_item(commonring);
1188 count--;
1189 }
1190 brcmf_commonring_read_complete(commonring);
1191
1192 if (commonring->r_ptr == 0)
1193 goto again;
1194}
1195
1196
1197int brcmf_proto_msgbuf_rx_trigger(struct device *dev)
1198{
1199 struct brcmf_bus *bus_if = dev_get_drvdata(dev);
1200 struct brcmf_pub *drvr = bus_if->drvr;
1201 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
1202 void *buf;
1203 u32 flowid;
1204
1205 buf = msgbuf->commonrings[BRCMF_D2H_MSGRING_RX_COMPLETE];
1206 brcmf_msgbuf_process_rx(msgbuf, buf);
1207 buf = msgbuf->commonrings[BRCMF_D2H_MSGRING_TX_COMPLETE];
1208 brcmf_msgbuf_process_rx(msgbuf, buf);
1209 buf = msgbuf->commonrings[BRCMF_D2H_MSGRING_CONTROL_COMPLETE];
1210 brcmf_msgbuf_process_rx(msgbuf, buf);
1211
1212 for_each_set_bit(flowid, msgbuf->txstatus_done_map,
1213 msgbuf->nrof_flowrings) {
1214 clear_bit(flowid, msgbuf->txstatus_done_map);
1215 if (brcmf_flowring_qlen(msgbuf->flow, flowid))
1216 brcmf_msgbuf_schedule_txdata(msgbuf, flowid);
1217 }
1218
1219 return 0;
1220}
1221
1222
1223void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u8 flowid)
1224{
1225 struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
1226 struct msgbuf_tx_flowring_delete_req *delete;
1227 struct brcmf_commonring *commonring;
1228 void *ret_ptr;
1229 u8 ifidx;
1230 int err;
1231
1232 commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_CONTROL_SUBMIT];
1233 brcmf_commonring_lock(commonring);
1234 ret_ptr = brcmf_commonring_reserve_for_write(commonring);
1235 if (!ret_ptr) {
1236 brcmf_err("FW unaware, flowring will be removed !!\n");
1237 brcmf_commonring_unlock(commonring);
1238 brcmf_msgbuf_remove_flowring(msgbuf, flowid);
1239 return;
1240 }
1241
1242 delete = (struct msgbuf_tx_flowring_delete_req *)ret_ptr;
1243
1244 ifidx = brcmf_flowring_ifidx_get(msgbuf->flow, flowid);
1245
1246 delete->msg.msgtype = MSGBUF_TYPE_FLOW_RING_DELETE;
1247 delete->msg.ifidx = ifidx;
1248 delete->msg.request_id = 0;
1249
1250 delete->flow_ring_id = cpu_to_le16(flowid +
1251 BRCMF_NROF_H2D_COMMON_MSGRINGS);
1252 delete->reason = 0;
1253
1254 brcmf_dbg(MSGBUF, "Send Flow Delete Req flow ID %d, ifindex %d\n",
1255 flowid, ifidx);
1256
1257 err = brcmf_commonring_write_complete(commonring);
1258 brcmf_commonring_unlock(commonring);
1259 if (err) {
1260 brcmf_err("Failed to submit RING_DELETE, flowring will be removed\n");
1261 brcmf_msgbuf_remove_flowring(msgbuf, flowid);
1262 }
1263}
1264
1265
1266int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr)
1267{
1268 struct brcmf_bus_msgbuf *if_msgbuf;
1269 struct brcmf_msgbuf *msgbuf;
1270 long long address;
1271 u32 count;
1272
1273 if_msgbuf = drvr->bus_if->msgbuf;
1274 msgbuf = kzalloc(sizeof(*msgbuf), GFP_ATOMIC);
1275 if (!msgbuf)
1276 goto fail;
1277
1278 msgbuf->txflow_wq = create_singlethread_workqueue("msgbuf_txflow");
1279 if (msgbuf->txflow_wq == NULL) {
1280 brcmf_err("workqueue creation failed\n");
1281 goto fail;
1282 }
1283 INIT_WORK(&msgbuf->txflow_work, brcmf_msgbuf_txflow_worker);
1284 count = BITS_TO_LONGS(if_msgbuf->nrof_flowrings);
1285 msgbuf->flow_map = kzalloc(count, GFP_ATOMIC);
1286 if (!msgbuf->flow_map)
1287 goto fail;
1288
1289 msgbuf->txstatus_done_map = kzalloc(count, GFP_ATOMIC);
1290 if (!msgbuf->txstatus_done_map)
1291 goto fail;
1292
1293 msgbuf->drvr = drvr;
1294 msgbuf->ioctbuf = dma_alloc_coherent(drvr->bus_if->dev,
1295 BRCMF_TX_IOCTL_MAX_MSG_SIZE,
1296 &msgbuf->ioctbuf_handle,
1297 GFP_ATOMIC);
1298 if (!msgbuf->ioctbuf)
1299 goto fail;
1300 address = (long long)(long)msgbuf->ioctbuf_handle;
1301 msgbuf->ioctbuf_phys_hi = address >> 32;
1302 msgbuf->ioctbuf_phys_lo = address & 0xffffffff;
1303
1304 drvr->proto->hdrpull = brcmf_msgbuf_hdrpull;
1305 drvr->proto->query_dcmd = brcmf_msgbuf_query_dcmd;
1306 drvr->proto->set_dcmd = brcmf_msgbuf_set_dcmd;
1307 drvr->proto->txdata = brcmf_msgbuf_txdata;
1308 drvr->proto->configure_addr_mode = brcmf_msgbuf_configure_addr_mode;
1309 drvr->proto->delete_peer = brcmf_msgbuf_delete_peer;
1310 drvr->proto->add_tdls_peer = brcmf_msgbuf_add_tdls_peer;
1311 drvr->proto->pd = msgbuf;
1312
1313 init_waitqueue_head(&msgbuf->ioctl_resp_wait);
1314
1315 msgbuf->commonrings =
1316 (struct brcmf_commonring **)if_msgbuf->commonrings;
1317 msgbuf->flowrings = (struct brcmf_commonring **)if_msgbuf->flowrings;
1318 msgbuf->nrof_flowrings = if_msgbuf->nrof_flowrings;
1319 msgbuf->flowring_dma_handle = kzalloc(msgbuf->nrof_flowrings *
1320 sizeof(*msgbuf->flowring_dma_handle), GFP_ATOMIC);
1321
1322 msgbuf->rx_dataoffset = if_msgbuf->rx_dataoffset;
1323 msgbuf->max_rxbufpost = if_msgbuf->max_rxbufpost;
1324
1325 msgbuf->max_ioctlrespbuf = BRCMF_MSGBUF_MAX_IOCTLRESPBUF_POST;
1326 msgbuf->max_eventbuf = BRCMF_MSGBUF_MAX_EVENTBUF_POST;
1327
1328 msgbuf->tx_pktids = brcmf_msgbuf_init_pktids(NR_TX_PKTIDS,
1329 DMA_TO_DEVICE);
1330 if (!msgbuf->tx_pktids)
1331 goto fail;
1332 msgbuf->rx_pktids = brcmf_msgbuf_init_pktids(NR_RX_PKTIDS,
1333 DMA_FROM_DEVICE);
1334 if (!msgbuf->rx_pktids)
1335 goto fail;
1336
1337 msgbuf->flow = brcmf_flowring_attach(drvr->bus_if->dev,
1338 if_msgbuf->nrof_flowrings);
1339 if (!msgbuf->flow)
1340 goto fail;
1341
1342
1343 brcmf_dbg(MSGBUF, "Feeding buffers, rx data %d, rx event %d, rx ioctl resp %d\n",
1344 msgbuf->max_rxbufpost, msgbuf->max_eventbuf,
1345 msgbuf->max_ioctlrespbuf);
1346 count = 0;
1347 do {
1348 brcmf_msgbuf_rxbuf_data_fill(msgbuf);
1349 if (msgbuf->max_rxbufpost != msgbuf->rxbufpost)
1350 msleep(10);
1351 else
1352 break;
1353 count++;
1354 } while (count < 10);
1355 brcmf_msgbuf_rxbuf_event_post(msgbuf);
1356 brcmf_msgbuf_rxbuf_ioctlresp_post(msgbuf);
1357
1358 return 0;
1359
1360fail:
1361 if (msgbuf) {
1362 kfree(msgbuf->flow_map);
1363 kfree(msgbuf->txstatus_done_map);
1364 brcmf_msgbuf_release_pktids(msgbuf);
1365 if (msgbuf->ioctbuf)
1366 dma_free_coherent(drvr->bus_if->dev,
1367 BRCMF_TX_IOCTL_MAX_MSG_SIZE,
1368 msgbuf->ioctbuf,
1369 msgbuf->ioctbuf_handle);
1370 kfree(msgbuf);
1371 }
1372 return -ENOMEM;
1373}
1374
1375
1376void brcmf_proto_msgbuf_detach(struct brcmf_pub *drvr)
1377{
1378 struct brcmf_msgbuf *msgbuf;
1379
1380 brcmf_dbg(TRACE, "Enter\n");
1381 if (drvr->proto->pd) {
1382 msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
1383
1384 kfree(msgbuf->flow_map);
1385 kfree(msgbuf->txstatus_done_map);
1386 if (msgbuf->txflow_wq)
1387 destroy_workqueue(msgbuf->txflow_wq);
1388
1389 brcmf_flowring_detach(msgbuf->flow);
1390 dma_free_coherent(drvr->bus_if->dev,
1391 BRCMF_TX_IOCTL_MAX_MSG_SIZE,
1392 msgbuf->ioctbuf, msgbuf->ioctbuf_handle);
1393 brcmf_msgbuf_release_pktids(msgbuf);
1394 kfree(msgbuf);
1395 drvr->proto->pd = NULL;
1396 }
1397}
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.h b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.h
new file mode 100644
index 000000000000..f901ae52bf2b
--- /dev/null
+++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.h
@@ -0,0 +1,40 @@
1/* Copyright (c) 2014 Broadcom Corporation
2 *
3 * Permission to use, copy, modify, and/or distribute this software for any
4 * purpose with or without fee is hereby granted, provided that the above
5 * copyright notice and this permission notice appear in all copies.
6 *
7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14 */
15#ifndef BRCMFMAC_MSGBUF_H
16#define BRCMFMAC_MSGBUF_H
17
18
19#define BRCMF_H2D_MSGRING_CONTROL_SUBMIT_MAX_ITEM 20
20#define BRCMF_H2D_MSGRING_RXPOST_SUBMIT_MAX_ITEM 256
21#define BRCMF_D2H_MSGRING_CONTROL_COMPLETE_MAX_ITEM 20
22#define BRCMF_D2H_MSGRING_TX_COMPLETE_MAX_ITEM 1024
23#define BRCMF_D2H_MSGRING_RX_COMPLETE_MAX_ITEM 256
24#define BRCMF_H2D_TXFLOWRING_MAX_ITEM 512
25
26#define BRCMF_H2D_MSGRING_CONTROL_SUBMIT_ITEMSIZE 40
27#define BRCMF_H2D_MSGRING_RXPOST_SUBMIT_ITEMSIZE 32
28#define BRCMF_D2H_MSGRING_CONTROL_COMPLETE_ITEMSIZE 24
29#define BRCMF_D2H_MSGRING_TX_COMPLETE_ITEMSIZE 16
30#define BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE 32
31#define BRCMF_H2D_TXFLOWRING_ITEMSIZE 48
32
33
34int brcmf_proto_msgbuf_rx_trigger(struct device *dev);
35int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr);
36void brcmf_proto_msgbuf_detach(struct brcmf_pub *drvr);
37void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u8 flowid);
38
39
40#endif /* BRCMFMAC_MSGBUF_H */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/of.c b/drivers/net/wireless/brcm80211/brcmfmac/of.c
new file mode 100644
index 000000000000..f05f5270fec1
--- /dev/null
+++ b/drivers/net/wireless/brcm80211/brcmfmac/of.c
@@ -0,0 +1,56 @@
1/*
2 * Copyright (c) 2014 Broadcom Corporation
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16#include <linux/init.h>
17#include <linux/of.h>
18#include <linux/of_irq.h>
19#include <linux/mmc/card.h>
20#include <linux/platform_data/brcmfmac-sdio.h>
21#include <linux/mmc/sdio_func.h>
22
23#include <defs.h>
24#include "dhd_dbg.h"
25#include "sdio_host.h"
26
27void brcmf_of_probe(struct brcmf_sdio_dev *sdiodev)
28{
29 struct device *dev = sdiodev->dev;
30 struct device_node *np = dev->of_node;
31 int irq;
32 u32 irqf;
33 u32 val;
34
35 if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac"))
36 return;
37
38 sdiodev->pdata = devm_kzalloc(dev, sizeof(*sdiodev->pdata), GFP_KERNEL);
39 if (!sdiodev->pdata)
40 return;
41
42 irq = irq_of_parse_and_map(np, 0);
43 if (irq < 0) {
44 brcmf_err("interrupt could not be mapped: err=%d\n", irq);
45 devm_kfree(dev, sdiodev->pdata);
46 return;
47 }
48 irqf = irqd_get_trigger_type(irq_get_irq_data(irq));
49
50 sdiodev->pdata->oob_irq_supported = true;
51 sdiodev->pdata->oob_irq_nr = irq;
52 sdiodev->pdata->oob_irq_flags = irqf;
53
54 if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0)
55 sdiodev->pdata->drive_strength = val;
56}
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/of.h b/drivers/net/wireless/brcm80211/brcmfmac/of.h
new file mode 100644
index 000000000000..5f7c3550deda
--- /dev/null
+++ b/drivers/net/wireless/brcm80211/brcmfmac/of.h
@@ -0,0 +1,22 @@
1/*
2 * Copyright (c) 2014 Broadcom Corporation
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16#ifdef CONFIG_OF
17void brcmf_of_probe(struct brcmf_sdio_dev *sdiodev);
18#else
19static void brcmf_of_probe(struct brcmf_sdio_dev *sdiodev)
20{
21}
22#endif /* CONFIG_OF */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
new file mode 100644
index 000000000000..bc972c0ba5f8
--- /dev/null
+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
@@ -0,0 +1,1846 @@
1/* Copyright (c) 2014 Broadcom Corporation
2 *
3 * Permission to use, copy, modify, and/or distribute this software for any
4 * purpose with or without fee is hereby granted, provided that the above
5 * copyright notice and this permission notice appear in all copies.
6 *
7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14 */
15
16#include <linux/kernel.h>
17#include <linux/module.h>
18#include <linux/firmware.h>
19#include <linux/pci.h>
20#include <linux/vmalloc.h>
21#include <linux/delay.h>
22#include <linux/unaligned/access_ok.h>
23#include <linux/interrupt.h>
24#include <linux/bcma/bcma.h>
25#include <linux/sched.h>
26
27#include <soc.h>
28#include <chipcommon.h>
29#include <brcmu_utils.h>
30#include <brcmu_wifi.h>
31#include <brcm_hw_ids.h>
32
33#include "dhd_dbg.h"
34#include "dhd_bus.h"
35#include "commonring.h"
36#include "msgbuf.h"
37#include "pcie.h"
38#include "firmware.h"
39#include "chip.h"
40
41
42enum brcmf_pcie_state {
43 BRCMFMAC_PCIE_STATE_DOWN,
44 BRCMFMAC_PCIE_STATE_UP
45};
46
47
48#define BRCMF_PCIE_43602_FW_NAME "brcm/brcmfmac43602-pcie.bin"
49#define BRCMF_PCIE_43602_NVRAM_NAME "brcm/brcmfmac43602-pcie.txt"
50#define BRCMF_PCIE_4354_FW_NAME "brcm/brcmfmac4354-pcie.bin"
51#define BRCMF_PCIE_4354_NVRAM_NAME "brcm/brcmfmac4354-pcie.txt"
52#define BRCMF_PCIE_4356_FW_NAME "brcm/brcmfmac4356-pcie.bin"
53#define BRCMF_PCIE_4356_NVRAM_NAME "brcm/brcmfmac4356-pcie.txt"
54#define BRCMF_PCIE_43570_FW_NAME "brcm/brcmfmac43570-pcie.bin"
55#define BRCMF_PCIE_43570_NVRAM_NAME "brcm/brcmfmac43570-pcie.txt"
56
57#define BRCMF_PCIE_FW_UP_TIMEOUT 2000 /* msec */
58
59#define BRCMF_PCIE_TCM_MAP_SIZE (4096 * 1024)
60#define BRCMF_PCIE_REG_MAP_SIZE (32 * 1024)
61
62/* backplane addres space accessed by BAR0 */
63#define BRCMF_PCIE_BAR0_WINDOW 0x80
64#define BRCMF_PCIE_BAR0_REG_SIZE 0x1000
65#define BRCMF_PCIE_BAR0_WRAPPERBASE 0x70
66
67#define BRCMF_PCIE_BAR0_WRAPBASE_DMP_OFFSET 0x1000
68#define BRCMF_PCIE_BARO_PCIE_ENUM_OFFSET 0x2000
69
70#define BRCMF_PCIE_ARMCR4REG_BANKIDX 0x40
71#define BRCMF_PCIE_ARMCR4REG_BANKPDA 0x4C
72
73#define BRCMF_PCIE_REG_INTSTATUS 0x90
74#define BRCMF_PCIE_REG_INTMASK 0x94
75#define BRCMF_PCIE_REG_SBMBX 0x98
76
77#define BRCMF_PCIE_PCIE2REG_INTMASK 0x24
78#define BRCMF_PCIE_PCIE2REG_MAILBOXINT 0x48
79#define BRCMF_PCIE_PCIE2REG_MAILBOXMASK 0x4C
80#define BRCMF_PCIE_PCIE2REG_CONFIGADDR 0x120
81#define BRCMF_PCIE_PCIE2REG_CONFIGDATA 0x124
82#define BRCMF_PCIE_PCIE2REG_H2D_MAILBOX 0x140
83
84#define BRCMF_PCIE_GENREV1 1
85#define BRCMF_PCIE_GENREV2 2
86
87#define BRCMF_PCIE2_INTA 0x01
88#define BRCMF_PCIE2_INTB 0x02
89
90#define BRCMF_PCIE_INT_0 0x01
91#define BRCMF_PCIE_INT_1 0x02
92#define BRCMF_PCIE_INT_DEF (BRCMF_PCIE_INT_0 | \
93 BRCMF_PCIE_INT_1)
94
95#define BRCMF_PCIE_MB_INT_FN0_0 0x0100
96#define BRCMF_PCIE_MB_INT_FN0_1 0x0200
97#define BRCMF_PCIE_MB_INT_D2H0_DB0 0x10000
98#define BRCMF_PCIE_MB_INT_D2H0_DB1 0x20000
99#define BRCMF_PCIE_MB_INT_D2H1_DB0 0x40000
100#define BRCMF_PCIE_MB_INT_D2H1_DB1 0x80000
101#define BRCMF_PCIE_MB_INT_D2H2_DB0 0x100000
102#define BRCMF_PCIE_MB_INT_D2H2_DB1 0x200000
103#define BRCMF_PCIE_MB_INT_D2H3_DB0 0x400000
104#define BRCMF_PCIE_MB_INT_D2H3_DB1 0x800000
105
106#define BRCMF_PCIE_MB_INT_D2H_DB (BRCMF_PCIE_MB_INT_D2H0_DB0 | \
107 BRCMF_PCIE_MB_INT_D2H0_DB1 | \
108 BRCMF_PCIE_MB_INT_D2H1_DB0 | \
109 BRCMF_PCIE_MB_INT_D2H1_DB1 | \
110 BRCMF_PCIE_MB_INT_D2H2_DB0 | \
111 BRCMF_PCIE_MB_INT_D2H2_DB1 | \
112 BRCMF_PCIE_MB_INT_D2H3_DB0 | \
113 BRCMF_PCIE_MB_INT_D2H3_DB1)
114
115#define BRCMF_PCIE_MIN_SHARED_VERSION 4
116#define BRCMF_PCIE_MAX_SHARED_VERSION 5
117#define BRCMF_PCIE_SHARED_VERSION_MASK 0x00FF
118#define BRCMF_PCIE_SHARED_TXPUSH_SUPPORT 0x4000
119
120#define BRCMF_PCIE_FLAGS_HTOD_SPLIT 0x4000
121#define BRCMF_PCIE_FLAGS_DTOH_SPLIT 0x8000
122
123#define BRCMF_SHARED_MAX_RXBUFPOST_OFFSET 34
124#define BRCMF_SHARED_RING_BASE_OFFSET 52
125#define BRCMF_SHARED_RX_DATAOFFSET_OFFSET 36
126#define BRCMF_SHARED_CONSOLE_ADDR_OFFSET 20
127#define BRCMF_SHARED_HTOD_MB_DATA_ADDR_OFFSET 40
128#define BRCMF_SHARED_DTOH_MB_DATA_ADDR_OFFSET 44
129#define BRCMF_SHARED_RING_INFO_ADDR_OFFSET 48
130#define BRCMF_SHARED_DMA_SCRATCH_LEN_OFFSET 52
131#define BRCMF_SHARED_DMA_SCRATCH_ADDR_OFFSET 56
132#define BRCMF_SHARED_DMA_RINGUPD_LEN_OFFSET 64
133#define BRCMF_SHARED_DMA_RINGUPD_ADDR_OFFSET 68
134
135#define BRCMF_RING_H2D_RING_COUNT_OFFSET 0
136#define BRCMF_RING_D2H_RING_COUNT_OFFSET 1
137#define BRCMF_RING_H2D_RING_MEM_OFFSET 4
138#define BRCMF_RING_H2D_RING_STATE_OFFSET 8
139
140#define BRCMF_RING_MEM_BASE_ADDR_OFFSET 8
141#define BRCMF_RING_MAX_ITEM_OFFSET 4
142#define BRCMF_RING_LEN_ITEMS_OFFSET 6
143#define BRCMF_RING_MEM_SZ 16
144#define BRCMF_RING_STATE_SZ 8
145
146#define BRCMF_SHARED_RING_H2D_W_IDX_PTR_OFFSET 4
147#define BRCMF_SHARED_RING_H2D_R_IDX_PTR_OFFSET 8
148#define BRCMF_SHARED_RING_D2H_W_IDX_PTR_OFFSET 12
149#define BRCMF_SHARED_RING_D2H_R_IDX_PTR_OFFSET 16
150#define BRCMF_SHARED_RING_TCM_MEMLOC_OFFSET 0
151#define BRCMF_SHARED_RING_MAX_SUB_QUEUES 52
152
153#define BRCMF_DEF_MAX_RXBUFPOST 255
154
155#define BRCMF_CONSOLE_BUFADDR_OFFSET 8
156#define BRCMF_CONSOLE_BUFSIZE_OFFSET 12
157#define BRCMF_CONSOLE_WRITEIDX_OFFSET 16
158
159#define BRCMF_DMA_D2H_SCRATCH_BUF_LEN 8
160#define BRCMF_DMA_D2H_RINGUPD_BUF_LEN 1024
161
162#define BRCMF_D2H_DEV_D3_ACK 0x00000001
163#define BRCMF_D2H_DEV_DS_ENTER_REQ 0x00000002
164#define BRCMF_D2H_DEV_DS_EXIT_NOTE 0x00000004
165
166#define BRCMF_H2D_HOST_D3_INFORM 0x00000001
167#define BRCMF_H2D_HOST_DS_ACK 0x00000002
168
169#define BRCMF_PCIE_MBDATA_TIMEOUT 2000
170
171#define BRCMF_PCIE_CFGREG_STATUS_CMD 0x4
172#define BRCMF_PCIE_CFGREG_PM_CSR 0x4C
173#define BRCMF_PCIE_CFGREG_MSI_CAP 0x58
174#define BRCMF_PCIE_CFGREG_MSI_ADDR_L 0x5C
175#define BRCMF_PCIE_CFGREG_MSI_ADDR_H 0x60
176#define BRCMF_PCIE_CFGREG_MSI_DATA 0x64
177#define BRCMF_PCIE_CFGREG_LINK_STATUS_CTRL 0xBC
178#define BRCMF_PCIE_CFGREG_LINK_STATUS_CTRL2 0xDC
179#define BRCMF_PCIE_CFGREG_RBAR_CTRL 0x228
180#define BRCMF_PCIE_CFGREG_PML1_SUB_CTRL1 0x248
181#define BRCMF_PCIE_CFGREG_REG_BAR2_CONFIG 0x4E0
182#define BRCMF_PCIE_CFGREG_REG_BAR3_CONFIG 0x4F4
183#define BRCMF_PCIE_LINK_STATUS_CTRL_ASPM_ENAB 3
184
185
186MODULE_FIRMWARE(BRCMF_PCIE_43602_FW_NAME);
187MODULE_FIRMWARE(BRCMF_PCIE_43602_NVRAM_NAME);
188MODULE_FIRMWARE(BRCMF_PCIE_4354_FW_NAME);
189MODULE_FIRMWARE(BRCMF_PCIE_4354_NVRAM_NAME);
190MODULE_FIRMWARE(BRCMF_PCIE_43570_FW_NAME);
191MODULE_FIRMWARE(BRCMF_PCIE_43570_NVRAM_NAME);
192
193
194struct brcmf_pcie_console {
195 u32 base_addr;
196 u32 buf_addr;
197 u32 bufsize;
198 u32 read_idx;
199 u8 log_str[256];
200 u8 log_idx;
201};
202
203struct brcmf_pcie_shared_info {
204 u32 tcm_base_address;
205 u32 flags;
206 struct brcmf_pcie_ringbuf *commonrings[BRCMF_NROF_COMMON_MSGRINGS];
207 struct brcmf_pcie_ringbuf *flowrings;
208 u16 max_rxbufpost;
209 u32 nrof_flowrings;
210 u32 rx_dataoffset;
211 u32 htod_mb_data_addr;
212 u32 dtoh_mb_data_addr;
213 u32 ring_info_addr;
214 struct brcmf_pcie_console console;
215 void *scratch;
216 dma_addr_t scratch_dmahandle;
217 void *ringupd;
218 dma_addr_t ringupd_dmahandle;
219};
220
221struct brcmf_pcie_core_info {
222 u32 base;
223 u32 wrapbase;
224};
225
226struct brcmf_pciedev_info {
227 enum brcmf_pcie_state state;
228 bool in_irq;
229 bool irq_requested;
230 struct pci_dev *pdev;
231 char fw_name[BRCMF_FW_PATH_LEN + BRCMF_FW_NAME_LEN];
232 char nvram_name[BRCMF_FW_PATH_LEN + BRCMF_FW_NAME_LEN];
233 void __iomem *regs;
234 void __iomem *tcm;
235 u32 tcm_size;
236 u32 ram_base;
237 u32 ram_size;
238 struct brcmf_chip *ci;
239 u32 coreid;
240 u32 generic_corerev;
241 struct brcmf_pcie_shared_info shared;
242 void (*ringbell)(struct brcmf_pciedev_info *devinfo);
243 wait_queue_head_t mbdata_resp_wait;
244 bool mbdata_completed;
245 bool irq_allocated;
246};
247
248struct brcmf_pcie_ringbuf {
249 struct brcmf_commonring commonring;
250 dma_addr_t dma_handle;
251 u32 w_idx_addr;
252 u32 r_idx_addr;
253 struct brcmf_pciedev_info *devinfo;
254 u8 id;
255};
256
257
258static const u32 brcmf_ring_max_item[BRCMF_NROF_COMMON_MSGRINGS] = {
259 BRCMF_H2D_MSGRING_CONTROL_SUBMIT_MAX_ITEM,
260 BRCMF_H2D_MSGRING_RXPOST_SUBMIT_MAX_ITEM,
261 BRCMF_D2H_MSGRING_CONTROL_COMPLETE_MAX_ITEM,
262 BRCMF_D2H_MSGRING_TX_COMPLETE_MAX_ITEM,
263 BRCMF_D2H_MSGRING_RX_COMPLETE_MAX_ITEM
264};
265
266static const u32 brcmf_ring_itemsize[BRCMF_NROF_COMMON_MSGRINGS] = {
267 BRCMF_H2D_MSGRING_CONTROL_SUBMIT_ITEMSIZE,
268 BRCMF_H2D_MSGRING_RXPOST_SUBMIT_ITEMSIZE,
269 BRCMF_D2H_MSGRING_CONTROL_COMPLETE_ITEMSIZE,
270 BRCMF_D2H_MSGRING_TX_COMPLETE_ITEMSIZE,
271 BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE
272};
273
274
275/* dma flushing needs implementation for mips and arm platforms. Should
276 * be put in util. Note, this is not real flushing. It is virtual non
277 * cached memory. Only write buffers should have to be drained. Though
278 * this may be different depending on platform......
279 */
280#define brcmf_dma_flush(addr, len)
281#define brcmf_dma_invalidate_cache(addr, len)
282
283
284static u32
285brcmf_pcie_read_reg32(struct brcmf_pciedev_info *devinfo, u32 reg_offset)
286{
287 void __iomem *address = devinfo->regs + reg_offset;
288
289 return (ioread32(address));
290}
291
292
293static void
294brcmf_pcie_write_reg32(struct brcmf_pciedev_info *devinfo, u32 reg_offset,
295 u32 value)
296{
297 void __iomem *address = devinfo->regs + reg_offset;
298
299 iowrite32(value, address);
300}
301
302
303static u8
304brcmf_pcie_read_tcm8(struct brcmf_pciedev_info *devinfo, u32 mem_offset)
305{
306 void __iomem *address = devinfo->tcm + mem_offset;
307
308 return (ioread8(address));
309}
310
311
312static u16
313brcmf_pcie_read_tcm16(struct brcmf_pciedev_info *devinfo, u32 mem_offset)
314{
315 void __iomem *address = devinfo->tcm + mem_offset;
316
317 return (ioread16(address));
318}
319
320
321static void
322brcmf_pcie_write_tcm16(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
323 u16 value)
324{
325 void __iomem *address = devinfo->tcm + mem_offset;
326
327 iowrite16(value, address);
328}
329
330
331static u32
332brcmf_pcie_read_tcm32(struct brcmf_pciedev_info *devinfo, u32 mem_offset)
333{
334 void __iomem *address = devinfo->tcm + mem_offset;
335
336 return (ioread32(address));
337}
338
339
340static void
341brcmf_pcie_write_tcm32(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
342 u32 value)
343{
344 void __iomem *address = devinfo->tcm + mem_offset;
345
346 iowrite32(value, address);
347}
348
349
350static u32
351brcmf_pcie_read_ram32(struct brcmf_pciedev_info *devinfo, u32 mem_offset)
352{
353 void __iomem *addr = devinfo->tcm + devinfo->ci->rambase + mem_offset;
354
355 return (ioread32(addr));
356}
357
358
359static void
360brcmf_pcie_write_ram32(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
361 u32 value)
362{
363 void __iomem *addr = devinfo->tcm + devinfo->ci->rambase + mem_offset;
364
365 iowrite32(value, addr);
366}
367
368
369static void
370brcmf_pcie_copy_mem_todev(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
371 void *srcaddr, u32 len)
372{
373 void __iomem *address = devinfo->tcm + mem_offset;
374 __le32 *src32;
375 __le16 *src16;
376 u8 *src8;
377
378 if (((ulong)address & 4) || ((ulong)srcaddr & 4) || (len & 4)) {
379 if (((ulong)address & 2) || ((ulong)srcaddr & 2) || (len & 2)) {
380 src8 = (u8 *)srcaddr;
381 while (len) {
382 iowrite8(*src8, address);
383 address++;
384 src8++;
385 len--;
386 }
387 } else {
388 len = len / 2;
389 src16 = (__le16 *)srcaddr;
390 while (len) {
391 iowrite16(le16_to_cpu(*src16), address);
392 address += 2;
393 src16++;
394 len--;
395 }
396 }
397 } else {
398 len = len / 4;
399 src32 = (__le32 *)srcaddr;
400 while (len) {
401 iowrite32(le32_to_cpu(*src32), address);
402 address += 4;
403 src32++;
404 len--;
405 }
406 }
407}
408
409
410#define WRITECC32(devinfo, reg, value) brcmf_pcie_write_reg32(devinfo, \
411 CHIPCREGOFFS(reg), value)
412
413
414static void
415brcmf_pcie_select_core(struct brcmf_pciedev_info *devinfo, u16 coreid)
416{
417 const struct pci_dev *pdev = devinfo->pdev;
418 struct brcmf_core *core;
419 u32 bar0_win;
420
421 core = brcmf_chip_get_core(devinfo->ci, coreid);
422 if (core) {
423 bar0_win = core->base;
424 pci_write_config_dword(pdev, BRCMF_PCIE_BAR0_WINDOW, bar0_win);
425 if (pci_read_config_dword(pdev, BRCMF_PCIE_BAR0_WINDOW,
426 &bar0_win) == 0) {
427 if (bar0_win != core->base) {
428 bar0_win = core->base;
429 pci_write_config_dword(pdev,
430 BRCMF_PCIE_BAR0_WINDOW,
431 bar0_win);
432 }
433 }
434 } else {
435 brcmf_err("Unsupported core selected %x\n", coreid);
436 }
437}
438
439
440static void brcmf_pcie_reset_device(struct brcmf_pciedev_info *devinfo)
441{
442 u16 cfg_offset[] = { BRCMF_PCIE_CFGREG_STATUS_CMD,
443 BRCMF_PCIE_CFGREG_PM_CSR,
444 BRCMF_PCIE_CFGREG_MSI_CAP,
445 BRCMF_PCIE_CFGREG_MSI_ADDR_L,
446 BRCMF_PCIE_CFGREG_MSI_ADDR_H,
447 BRCMF_PCIE_CFGREG_MSI_DATA,
448 BRCMF_PCIE_CFGREG_LINK_STATUS_CTRL2,
449 BRCMF_PCIE_CFGREG_RBAR_CTRL,
450 BRCMF_PCIE_CFGREG_PML1_SUB_CTRL1,
451 BRCMF_PCIE_CFGREG_REG_BAR2_CONFIG,
452 BRCMF_PCIE_CFGREG_REG_BAR3_CONFIG };
453 u32 i;
454 u32 val;
455 u32 lsc;
456
457 if (!devinfo->ci)
458 return;
459
460 brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
461 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGADDR,
462 BRCMF_PCIE_CFGREG_LINK_STATUS_CTRL);
463 lsc = brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGDATA);
464 val = lsc & (~BRCMF_PCIE_LINK_STATUS_CTRL_ASPM_ENAB);
465 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGDATA, val);
466
467 brcmf_pcie_select_core(devinfo, BCMA_CORE_CHIPCOMMON);
468 WRITECC32(devinfo, watchdog, 4);
469 msleep(100);
470
471 brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
472 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGADDR,
473 BRCMF_PCIE_CFGREG_LINK_STATUS_CTRL);
474 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGDATA, lsc);
475
476 brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
477 for (i = 0; i < ARRAY_SIZE(cfg_offset); i++) {
478 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGADDR,
479 cfg_offset[i]);
480 val = brcmf_pcie_read_reg32(devinfo,
481 BRCMF_PCIE_PCIE2REG_CONFIGDATA);
482 brcmf_dbg(PCIE, "config offset 0x%04x, value 0x%04x\n",
483 cfg_offset[i], val);
484 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGDATA,
485 val);
486 }
487}
488
489
490static void brcmf_pcie_attach(struct brcmf_pciedev_info *devinfo)
491{
492 u32 config;
493
494 brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
495 if (brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_INTMASK) != 0)
496 brcmf_pcie_reset_device(devinfo);
497 /* BAR1 window may not be sized properly */
498 brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
499 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGADDR, 0x4e0);
500 config = brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGDATA);
501 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_CONFIGDATA, config);
502
503 device_wakeup_enable(&devinfo->pdev->dev);
504}
505
506
507static int brcmf_pcie_enter_download_state(struct brcmf_pciedev_info *devinfo)
508{
509 brcmf_chip_enter_download(devinfo->ci);
510
511 if (devinfo->ci->chip == BRCM_CC_43602_CHIP_ID) {
512 brcmf_pcie_select_core(devinfo, BCMA_CORE_ARM_CR4);
513 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_ARMCR4REG_BANKIDX,
514 5);
515 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_ARMCR4REG_BANKPDA,
516 0);
517 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_ARMCR4REG_BANKIDX,
518 7);
519 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_ARMCR4REG_BANKPDA,
520 0);
521 }
522 return 0;
523}
524
525
526static int brcmf_pcie_exit_download_state(struct brcmf_pciedev_info *devinfo,
527 u32 resetintr)
528{
529 struct brcmf_core *core;
530
531 if (devinfo->ci->chip == BRCM_CC_43602_CHIP_ID) {
532 core = brcmf_chip_get_core(devinfo->ci, BCMA_CORE_INTERNAL_MEM);
533 brcmf_chip_resetcore(core, 0, 0, 0);
534 }
535
536 return !brcmf_chip_exit_download(devinfo->ci, resetintr);
537}
538
539
540static void
541brcmf_pcie_send_mb_data(struct brcmf_pciedev_info *devinfo, u32 htod_mb_data)
542{
543 struct brcmf_pcie_shared_info *shared;
544 u32 addr;
545 u32 cur_htod_mb_data;
546 u32 i;
547
548 shared = &devinfo->shared;
549 addr = shared->htod_mb_data_addr;
550 cur_htod_mb_data = brcmf_pcie_read_tcm32(devinfo, addr);
551
552 if (cur_htod_mb_data != 0)
553 brcmf_dbg(PCIE, "MB transaction is already pending 0x%04x\n",
554 cur_htod_mb_data);
555
556 i = 0;
557 while (cur_htod_mb_data != 0) {
558 msleep(10);
559 i++;
560 if (i > 100)
561 break;
562 cur_htod_mb_data = brcmf_pcie_read_tcm32(devinfo, addr);
563 }
564
565 brcmf_pcie_write_tcm32(devinfo, addr, htod_mb_data);
566 pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_SBMBX, 1);
567 pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_SBMBX, 1);
568}
569
570
571static void brcmf_pcie_handle_mb_data(struct brcmf_pciedev_info *devinfo)
572{
573 struct brcmf_pcie_shared_info *shared;
574 u32 addr;
575 u32 dtoh_mb_data;
576
577 shared = &devinfo->shared;
578 addr = shared->dtoh_mb_data_addr;
579 dtoh_mb_data = brcmf_pcie_read_tcm32(devinfo, addr);
580
581 if (!dtoh_mb_data)
582 return;
583
584 brcmf_pcie_write_tcm32(devinfo, addr, 0);
585
586 brcmf_dbg(PCIE, "D2H_MB_DATA: 0x%04x\n", dtoh_mb_data);
587 if (dtoh_mb_data & BRCMF_D2H_DEV_DS_ENTER_REQ) {
588 brcmf_dbg(PCIE, "D2H_MB_DATA: DEEP SLEEP REQ\n");
589 brcmf_pcie_send_mb_data(devinfo, BRCMF_H2D_HOST_DS_ACK);
590 brcmf_dbg(PCIE, "D2H_MB_DATA: sent DEEP SLEEP ACK\n");
591 }
592 if (dtoh_mb_data & BRCMF_D2H_DEV_DS_EXIT_NOTE)
593 brcmf_dbg(PCIE, "D2H_MB_DATA: DEEP SLEEP EXIT\n");
594 if (dtoh_mb_data & BRCMF_D2H_DEV_D3_ACK)
595 brcmf_dbg(PCIE, "D2H_MB_DATA: D3 ACK\n");
596 if (waitqueue_active(&devinfo->mbdata_resp_wait)) {
597 devinfo->mbdata_completed = true;
598 wake_up(&devinfo->mbdata_resp_wait);
599 }
600}
601
602
603static void brcmf_pcie_bus_console_init(struct brcmf_pciedev_info *devinfo)
604{
605 struct brcmf_pcie_shared_info *shared;
606 struct brcmf_pcie_console *console;
607 u32 addr;
608
609 shared = &devinfo->shared;
610 console = &shared->console;
611 addr = shared->tcm_base_address + BRCMF_SHARED_CONSOLE_ADDR_OFFSET;
612 console->base_addr = brcmf_pcie_read_tcm32(devinfo, addr);
613
614 addr = console->base_addr + BRCMF_CONSOLE_BUFADDR_OFFSET;
615 console->buf_addr = brcmf_pcie_read_tcm32(devinfo, addr);
616 addr = console->base_addr + BRCMF_CONSOLE_BUFSIZE_OFFSET;
617 console->bufsize = brcmf_pcie_read_tcm32(devinfo, addr);
618
619 brcmf_dbg(PCIE, "Console: base %x, buf %x, size %d\n",
620 console->base_addr, console->buf_addr, console->bufsize);
621}
622
623
624static void brcmf_pcie_bus_console_read(struct brcmf_pciedev_info *devinfo)
625{
626 struct brcmf_pcie_console *console;
627 u32 addr;
628 u8 ch;
629 u32 newidx;
630
631 console = &devinfo->shared.console;
632 addr = console->base_addr + BRCMF_CONSOLE_WRITEIDX_OFFSET;
633 newidx = brcmf_pcie_read_tcm32(devinfo, addr);
634 while (newidx != console->read_idx) {
635 addr = console->buf_addr + console->read_idx;
636 ch = brcmf_pcie_read_tcm8(devinfo, addr);
637 console->read_idx++;
638 if (console->read_idx == console->bufsize)
639 console->read_idx = 0;
640 if (ch == '\r')
641 continue;
642 console->log_str[console->log_idx] = ch;
643 console->log_idx++;
644 if ((ch != '\n') &&
645 (console->log_idx == (sizeof(console->log_str) - 2))) {
646 ch = '\n';
647 console->log_str[console->log_idx] = ch;
648 console->log_idx++;
649 }
650
651 if (ch == '\n') {
652 console->log_str[console->log_idx] = 0;
653 brcmf_dbg(PCIE, "CONSOLE: %s\n", console->log_str);
654 console->log_idx = 0;
655 }
656 }
657}
658
659
660static __used void brcmf_pcie_ringbell_v1(struct brcmf_pciedev_info *devinfo)
661{
662 u32 reg_value;
663
664 brcmf_dbg(PCIE, "RING !\n");
665 reg_value = brcmf_pcie_read_reg32(devinfo,
666 BRCMF_PCIE_PCIE2REG_MAILBOXINT);
667 reg_value |= BRCMF_PCIE2_INTB;
668 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT,
669 reg_value);
670}
671
672
673static void brcmf_pcie_ringbell_v2(struct brcmf_pciedev_info *devinfo)
674{
675 brcmf_dbg(PCIE, "RING !\n");
676 /* Any arbitrary value will do, lets use 1 */
677 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_H2D_MAILBOX, 1);
678}
679
680
681static void brcmf_pcie_intr_disable(struct brcmf_pciedev_info *devinfo)
682{
683 if (devinfo->generic_corerev == BRCMF_PCIE_GENREV1)
684 pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_INTMASK,
685 0);
686 else
687 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXMASK,
688 0);
689}
690
691
692static void brcmf_pcie_intr_enable(struct brcmf_pciedev_info *devinfo)
693{
694 if (devinfo->generic_corerev == BRCMF_PCIE_GENREV1)
695 pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_INTMASK,
696 BRCMF_PCIE_INT_DEF);
697 else
698 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXMASK,
699 BRCMF_PCIE_MB_INT_D2H_DB |
700 BRCMF_PCIE_MB_INT_FN0_0 |
701 BRCMF_PCIE_MB_INT_FN0_1);
702}
703
704
705static irqreturn_t brcmf_pcie_quick_check_isr_v1(int irq, void *arg)
706{
707 struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)arg;
708 u32 status;
709
710 status = 0;
711 pci_read_config_dword(devinfo->pdev, BRCMF_PCIE_REG_INTSTATUS, &status);
712 if (status) {
713 brcmf_pcie_intr_disable(devinfo);
714 brcmf_dbg(PCIE, "Enter\n");
715 return IRQ_WAKE_THREAD;
716 }
717 return IRQ_NONE;
718}
719
720
721static irqreturn_t brcmf_pcie_quick_check_isr_v2(int irq, void *arg)
722{
723 struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)arg;
724
725 if (brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT)) {
726 brcmf_pcie_intr_disable(devinfo);
727 brcmf_dbg(PCIE, "Enter\n");
728 return IRQ_WAKE_THREAD;
729 }
730 return IRQ_NONE;
731}
732
733
734static irqreturn_t brcmf_pcie_isr_thread_v1(int irq, void *arg)
735{
736 struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)arg;
737 const struct pci_dev *pdev = devinfo->pdev;
738 u32 status;
739
740 devinfo->in_irq = true;
741 status = 0;
742 pci_read_config_dword(pdev, BRCMF_PCIE_REG_INTSTATUS, &status);
743 brcmf_dbg(PCIE, "Enter %x\n", status);
744 if (status) {
745 pci_write_config_dword(pdev, BRCMF_PCIE_REG_INTSTATUS, status);
746 if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
747 brcmf_proto_msgbuf_rx_trigger(&devinfo->pdev->dev);
748 }
749 if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
750 brcmf_pcie_intr_enable(devinfo);
751 devinfo->in_irq = false;
752 return IRQ_HANDLED;
753}
754
755
756static irqreturn_t brcmf_pcie_isr_thread_v2(int irq, void *arg)
757{
758 struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)arg;
759 u32 status;
760
761 devinfo->in_irq = true;
762 status = brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT);
763 brcmf_dbg(PCIE, "Enter %x\n", status);
764 if (status) {
765 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT,
766 status);
767 if (status & (BRCMF_PCIE_MB_INT_FN0_0 |
768 BRCMF_PCIE_MB_INT_FN0_1))
769 brcmf_pcie_handle_mb_data(devinfo);
770 if (status & BRCMF_PCIE_MB_INT_D2H_DB) {
771 if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
772 brcmf_proto_msgbuf_rx_trigger(
773 &devinfo->pdev->dev);
774 }
775 }
776 brcmf_pcie_bus_console_read(devinfo);
777 if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
778 brcmf_pcie_intr_enable(devinfo);
779 devinfo->in_irq = false;
780 return IRQ_HANDLED;
781}
782
783
784static int brcmf_pcie_request_irq(struct brcmf_pciedev_info *devinfo)
785{
786 struct pci_dev *pdev;
787
788 pdev = devinfo->pdev;
789
790 brcmf_pcie_intr_disable(devinfo);
791
792 brcmf_dbg(PCIE, "Enter\n");
793 /* is it a v1 or v2 implementation */
794 devinfo->irq_requested = false;
795 if (devinfo->generic_corerev == BRCMF_PCIE_GENREV1) {
796 if (request_threaded_irq(pdev->irq,
797 brcmf_pcie_quick_check_isr_v1,
798 brcmf_pcie_isr_thread_v1,
799 IRQF_SHARED, "brcmf_pcie_intr",
800 devinfo)) {
801 brcmf_err("Failed to request IRQ %d\n", pdev->irq);
802 return -EIO;
803 }
804 } else {
805 if (request_threaded_irq(pdev->irq,
806 brcmf_pcie_quick_check_isr_v2,
807 brcmf_pcie_isr_thread_v2,
808 IRQF_SHARED, "brcmf_pcie_intr",
809 devinfo)) {
810 brcmf_err("Failed to request IRQ %d\n", pdev->irq);
811 return -EIO;
812 }
813 }
814 devinfo->irq_requested = true;
815 devinfo->irq_allocated = true;
816 return 0;
817}
818
819
820static void brcmf_pcie_release_irq(struct brcmf_pciedev_info *devinfo)
821{
822 struct pci_dev *pdev;
823 u32 status;
824 u32 count;
825
826 if (!devinfo->irq_allocated)
827 return;
828
829 pdev = devinfo->pdev;
830
831 brcmf_pcie_intr_disable(devinfo);
832 if (!devinfo->irq_requested)
833 return;
834 devinfo->irq_requested = false;
835 free_irq(pdev->irq, devinfo);
836
837 msleep(50);
838 count = 0;
839 while ((devinfo->in_irq) && (count < 20)) {
840 msleep(50);
841 count++;
842 }
843 if (devinfo->in_irq)
844 brcmf_err("Still in IRQ (processing) !!!\n");
845
846 if (devinfo->generic_corerev == BRCMF_PCIE_GENREV1) {
847 status = 0;
848 pci_read_config_dword(pdev, BRCMF_PCIE_REG_INTSTATUS, &status);
849 pci_write_config_dword(pdev, BRCMF_PCIE_REG_INTSTATUS, status);
850 } else {
851 status = brcmf_pcie_read_reg32(devinfo,
852 BRCMF_PCIE_PCIE2REG_MAILBOXINT);
853 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT,
854 status);
855 }
856 devinfo->irq_allocated = false;
857}
858
859
860static int brcmf_pcie_ring_mb_write_rptr(void *ctx)
861{
862 struct brcmf_pcie_ringbuf *ring = (struct brcmf_pcie_ringbuf *)ctx;
863 struct brcmf_pciedev_info *devinfo = ring->devinfo;
864 struct brcmf_commonring *commonring = &ring->commonring;
865
866 if (devinfo->state != BRCMFMAC_PCIE_STATE_UP)
867 return -EIO;
868
869 brcmf_dbg(PCIE, "W r_ptr %d (%d), ring %d\n", commonring->r_ptr,
870 commonring->w_ptr, ring->id);
871
872 brcmf_pcie_write_tcm16(devinfo, ring->r_idx_addr, commonring->r_ptr);
873
874 return 0;
875}
876
877
878static int brcmf_pcie_ring_mb_write_wptr(void *ctx)
879{
880 struct brcmf_pcie_ringbuf *ring = (struct brcmf_pcie_ringbuf *)ctx;
881 struct brcmf_pciedev_info *devinfo = ring->devinfo;
882 struct brcmf_commonring *commonring = &ring->commonring;
883
884 if (devinfo->state != BRCMFMAC_PCIE_STATE_UP)
885 return -EIO;
886
887 brcmf_dbg(PCIE, "W w_ptr %d (%d), ring %d\n", commonring->w_ptr,
888 commonring->r_ptr, ring->id);
889
890 brcmf_pcie_write_tcm16(devinfo, ring->w_idx_addr, commonring->w_ptr);
891
892 return 0;
893}
894
895
896static int brcmf_pcie_ring_mb_ring_bell(void *ctx)
897{
898 struct brcmf_pcie_ringbuf *ring = (struct brcmf_pcie_ringbuf *)ctx;
899 struct brcmf_pciedev_info *devinfo = ring->devinfo;
900
901 if (devinfo->state != BRCMFMAC_PCIE_STATE_UP)
902 return -EIO;
903
904 devinfo->ringbell(devinfo);
905
906 return 0;
907}
908
909
910static int brcmf_pcie_ring_mb_update_rptr(void *ctx)
911{
912 struct brcmf_pcie_ringbuf *ring = (struct brcmf_pcie_ringbuf *)ctx;
913 struct brcmf_pciedev_info *devinfo = ring->devinfo;
914 struct brcmf_commonring *commonring = &ring->commonring;
915
916 if (devinfo->state != BRCMFMAC_PCIE_STATE_UP)
917 return -EIO;
918
919 commonring->r_ptr = brcmf_pcie_read_tcm16(devinfo, ring->r_idx_addr);
920
921 brcmf_dbg(PCIE, "R r_ptr %d (%d), ring %d\n", commonring->r_ptr,
922 commonring->w_ptr, ring->id);
923
924 return 0;
925}
926
927
928static int brcmf_pcie_ring_mb_update_wptr(void *ctx)
929{
930 struct brcmf_pcie_ringbuf *ring = (struct brcmf_pcie_ringbuf *)ctx;
931 struct brcmf_pciedev_info *devinfo = ring->devinfo;
932 struct brcmf_commonring *commonring = &ring->commonring;
933
934 if (devinfo->state != BRCMFMAC_PCIE_STATE_UP)
935 return -EIO;
936
937 commonring->w_ptr = brcmf_pcie_read_tcm16(devinfo, ring->w_idx_addr);
938
939 brcmf_dbg(PCIE, "R w_ptr %d (%d), ring %d\n", commonring->w_ptr,
940 commonring->r_ptr, ring->id);
941
942 return 0;
943}
944
945
946static void *
947brcmf_pcie_init_dmabuffer_for_device(struct brcmf_pciedev_info *devinfo,
948 u32 size, u32 tcm_dma_phys_addr,
949 dma_addr_t *dma_handle)
950{
951 void *ring;
952 long long address;
953
954 ring = dma_alloc_coherent(&devinfo->pdev->dev, size, dma_handle,
955 GFP_KERNEL);
956 if (!ring)
957 return NULL;
958
959 address = (long long)(long)*dma_handle;
960 brcmf_pcie_write_tcm32(devinfo, tcm_dma_phys_addr,
961 address & 0xffffffff);
962 brcmf_pcie_write_tcm32(devinfo, tcm_dma_phys_addr + 4, address >> 32);
963
964 memset(ring, 0, size);
965
966 return (ring);
967}
968
969
970static struct brcmf_pcie_ringbuf *
971brcmf_pcie_alloc_dma_and_ring(struct brcmf_pciedev_info *devinfo, u32 ring_id,
972 u32 tcm_ring_phys_addr)
973{
974 void *dma_buf;
975 dma_addr_t dma_handle;
976 struct brcmf_pcie_ringbuf *ring;
977 u32 size;
978 u32 addr;
979
980 size = brcmf_ring_max_item[ring_id] * brcmf_ring_itemsize[ring_id];
981 dma_buf = brcmf_pcie_init_dmabuffer_for_device(devinfo, size,
982 tcm_ring_phys_addr + BRCMF_RING_MEM_BASE_ADDR_OFFSET,
983 &dma_handle);
984 if (!dma_buf)
985 return NULL;
986
987 addr = tcm_ring_phys_addr + BRCMF_RING_MAX_ITEM_OFFSET;
988 brcmf_pcie_write_tcm16(devinfo, addr, brcmf_ring_max_item[ring_id]);
989 addr = tcm_ring_phys_addr + BRCMF_RING_LEN_ITEMS_OFFSET;
990 brcmf_pcie_write_tcm16(devinfo, addr, brcmf_ring_itemsize[ring_id]);
991
992 ring = kzalloc(sizeof(*ring), GFP_KERNEL);
993 if (!ring) {
994 dma_free_coherent(&devinfo->pdev->dev, size, dma_buf,
995 dma_handle);
996 return NULL;
997 }
998 brcmf_commonring_config(&ring->commonring, brcmf_ring_max_item[ring_id],
999 brcmf_ring_itemsize[ring_id], dma_buf);
1000 ring->dma_handle = dma_handle;
1001 ring->devinfo = devinfo;
1002 brcmf_commonring_register_cb(&ring->commonring,
1003 brcmf_pcie_ring_mb_ring_bell,
1004 brcmf_pcie_ring_mb_update_rptr,
1005 brcmf_pcie_ring_mb_update_wptr,
1006 brcmf_pcie_ring_mb_write_rptr,
1007 brcmf_pcie_ring_mb_write_wptr, ring);
1008
1009 return (ring);
1010}
1011
1012
1013static void brcmf_pcie_release_ringbuffer(struct device *dev,
1014 struct brcmf_pcie_ringbuf *ring)
1015{
1016 void *dma_buf;
1017 u32 size;
1018
1019 if (!ring)
1020 return;
1021
1022 dma_buf = ring->commonring.buf_addr;
1023 if (dma_buf) {
1024 size = ring->commonring.depth * ring->commonring.item_len;
1025 dma_free_coherent(dev, size, dma_buf, ring->dma_handle);
1026 }
1027 kfree(ring);
1028}
1029
1030
1031static void brcmf_pcie_release_ringbuffers(struct brcmf_pciedev_info *devinfo)
1032{
1033 u32 i;
1034
1035 for (i = 0; i < BRCMF_NROF_COMMON_MSGRINGS; i++) {
1036 brcmf_pcie_release_ringbuffer(&devinfo->pdev->dev,
1037 devinfo->shared.commonrings[i]);
1038 devinfo->shared.commonrings[i] = NULL;
1039 }
1040 kfree(devinfo->shared.flowrings);
1041 devinfo->shared.flowrings = NULL;
1042}
1043
1044
1045static int brcmf_pcie_init_ringbuffers(struct brcmf_pciedev_info *devinfo)
1046{
1047 struct brcmf_pcie_ringbuf *ring;
1048 struct brcmf_pcie_ringbuf *rings;
1049 u32 ring_addr;
1050 u32 d2h_w_idx_ptr;
1051 u32 d2h_r_idx_ptr;
1052 u32 h2d_w_idx_ptr;
1053 u32 h2d_r_idx_ptr;
1054 u32 addr;
1055 u32 ring_mem_ptr;
1056 u32 i;
1057 u16 max_sub_queues;
1058
1059 ring_addr = devinfo->shared.ring_info_addr;
1060 brcmf_dbg(PCIE, "Base ring addr = 0x%08x\n", ring_addr);
1061
1062 addr = ring_addr + BRCMF_SHARED_RING_D2H_W_IDX_PTR_OFFSET;
1063 d2h_w_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
1064 addr = ring_addr + BRCMF_SHARED_RING_D2H_R_IDX_PTR_OFFSET;
1065 d2h_r_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
1066 addr = ring_addr + BRCMF_SHARED_RING_H2D_W_IDX_PTR_OFFSET;
1067 h2d_w_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
1068 addr = ring_addr + BRCMF_SHARED_RING_H2D_R_IDX_PTR_OFFSET;
1069 h2d_r_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
1070
1071 addr = ring_addr + BRCMF_SHARED_RING_TCM_MEMLOC_OFFSET;
1072 ring_mem_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
1073
1074 for (i = 0; i < BRCMF_NROF_H2D_COMMON_MSGRINGS; i++) {
1075 ring = brcmf_pcie_alloc_dma_and_ring(devinfo, i, ring_mem_ptr);
1076 if (!ring)
1077 goto fail;
1078 ring->w_idx_addr = h2d_w_idx_ptr;
1079 ring->r_idx_addr = h2d_r_idx_ptr;
1080 ring->id = i;
1081 devinfo->shared.commonrings[i] = ring;
1082
1083 h2d_w_idx_ptr += sizeof(u32);
1084 h2d_r_idx_ptr += sizeof(u32);
1085 ring_mem_ptr += BRCMF_RING_MEM_SZ;
1086 }
1087
1088 for (i = BRCMF_NROF_H2D_COMMON_MSGRINGS;
1089 i < BRCMF_NROF_COMMON_MSGRINGS; i++) {
1090 ring = brcmf_pcie_alloc_dma_and_ring(devinfo, i, ring_mem_ptr);
1091 if (!ring)
1092 goto fail;
1093 ring->w_idx_addr = d2h_w_idx_ptr;
1094 ring->r_idx_addr = d2h_r_idx_ptr;
1095 ring->id = i;
1096 devinfo->shared.commonrings[i] = ring;
1097
1098 d2h_w_idx_ptr += sizeof(u32);
1099 d2h_r_idx_ptr += sizeof(u32);
1100 ring_mem_ptr += BRCMF_RING_MEM_SZ;
1101 }
1102
1103 addr = ring_addr + BRCMF_SHARED_RING_MAX_SUB_QUEUES;
1104 max_sub_queues = brcmf_pcie_read_tcm16(devinfo, addr);
1105 devinfo->shared.nrof_flowrings =
1106 max_sub_queues - BRCMF_NROF_H2D_COMMON_MSGRINGS;
1107 rings = kcalloc(devinfo->shared.nrof_flowrings, sizeof(*ring),
1108 GFP_KERNEL);
1109 if (!rings)
1110 goto fail;
1111
1112 brcmf_dbg(PCIE, "Nr of flowrings is %d\n",
1113 devinfo->shared.nrof_flowrings);
1114
1115 for (i = 0; i < devinfo->shared.nrof_flowrings; i++) {
1116 ring = &rings[i];
1117 ring->devinfo = devinfo;
1118 ring->id = i + BRCMF_NROF_COMMON_MSGRINGS;
1119 brcmf_commonring_register_cb(&ring->commonring,
1120 brcmf_pcie_ring_mb_ring_bell,
1121 brcmf_pcie_ring_mb_update_rptr,
1122 brcmf_pcie_ring_mb_update_wptr,
1123 brcmf_pcie_ring_mb_write_rptr,
1124 brcmf_pcie_ring_mb_write_wptr,
1125 ring);
1126 ring->w_idx_addr = h2d_w_idx_ptr;
1127 ring->r_idx_addr = h2d_r_idx_ptr;
1128 h2d_w_idx_ptr += sizeof(u32);
1129 h2d_r_idx_ptr += sizeof(u32);
1130 }
1131 devinfo->shared.flowrings = rings;
1132
1133 return 0;
1134
1135fail:
1136 brcmf_err("Allocating commonring buffers failed\n");
1137 brcmf_pcie_release_ringbuffers(devinfo);
1138 return -ENOMEM;
1139}
1140
1141
1142static void
1143brcmf_pcie_release_scratchbuffers(struct brcmf_pciedev_info *devinfo)
1144{
1145 if (devinfo->shared.scratch)
1146 dma_free_coherent(&devinfo->pdev->dev,
1147 BRCMF_DMA_D2H_SCRATCH_BUF_LEN,
1148 devinfo->shared.scratch,
1149 devinfo->shared.scratch_dmahandle);
1150 if (devinfo->shared.ringupd)
1151 dma_free_coherent(&devinfo->pdev->dev,
1152 BRCMF_DMA_D2H_RINGUPD_BUF_LEN,
1153 devinfo->shared.ringupd,
1154 devinfo->shared.ringupd_dmahandle);
1155}
1156
1157static int brcmf_pcie_init_scratchbuffers(struct brcmf_pciedev_info *devinfo)
1158{
1159 long long address;
1160 u32 addr;
1161
1162 devinfo->shared.scratch = dma_alloc_coherent(&devinfo->pdev->dev,
1163 BRCMF_DMA_D2H_SCRATCH_BUF_LEN,
1164 &devinfo->shared.scratch_dmahandle, GFP_KERNEL);
1165 if (!devinfo->shared.scratch)
1166 goto fail;
1167
1168 memset(devinfo->shared.scratch, 0, BRCMF_DMA_D2H_SCRATCH_BUF_LEN);
1169 brcmf_dma_flush(devinfo->shared.scratch, BRCMF_DMA_D2H_SCRATCH_BUF_LEN);
1170
1171 addr = devinfo->shared.tcm_base_address +
1172 BRCMF_SHARED_DMA_SCRATCH_ADDR_OFFSET;
1173 address = (long long)(long)devinfo->shared.scratch_dmahandle;
1174 brcmf_pcie_write_tcm32(devinfo, addr, address & 0xffffffff);
1175 brcmf_pcie_write_tcm32(devinfo, addr + 4, address >> 32);
1176 addr = devinfo->shared.tcm_base_address +
1177 BRCMF_SHARED_DMA_SCRATCH_LEN_OFFSET;
1178 brcmf_pcie_write_tcm32(devinfo, addr, BRCMF_DMA_D2H_SCRATCH_BUF_LEN);
1179
1180 devinfo->shared.ringupd = dma_alloc_coherent(&devinfo->pdev->dev,
1181 BRCMF_DMA_D2H_RINGUPD_BUF_LEN,
1182 &devinfo->shared.ringupd_dmahandle, GFP_KERNEL);
1183 if (!devinfo->shared.ringupd)
1184 goto fail;
1185
1186 memset(devinfo->shared.ringupd, 0, BRCMF_DMA_D2H_RINGUPD_BUF_LEN);
1187 brcmf_dma_flush(devinfo->shared.ringupd, BRCMF_DMA_D2H_RINGUPD_BUF_LEN);
1188
1189 addr = devinfo->shared.tcm_base_address +
1190 BRCMF_SHARED_DMA_RINGUPD_ADDR_OFFSET;
1191 address = (long long)(long)devinfo->shared.ringupd_dmahandle;
1192 brcmf_pcie_write_tcm32(devinfo, addr, address & 0xffffffff);
1193 brcmf_pcie_write_tcm32(devinfo, addr + 4, address >> 32);
1194 addr = devinfo->shared.tcm_base_address +
1195 BRCMF_SHARED_DMA_RINGUPD_LEN_OFFSET;
1196 brcmf_pcie_write_tcm32(devinfo, addr, BRCMF_DMA_D2H_RINGUPD_BUF_LEN);
1197 return 0;
1198
1199fail:
1200 brcmf_err("Allocating scratch buffers failed\n");
1201 brcmf_pcie_release_scratchbuffers(devinfo);
1202 return -ENOMEM;
1203}
1204
1205
1206static void brcmf_pcie_down(struct device *dev)
1207{
1208}
1209
1210
1211static int brcmf_pcie_tx(struct device *dev, struct sk_buff *skb)
1212{
1213 return 0;
1214}
1215
1216
1217static int brcmf_pcie_tx_ctlpkt(struct device *dev, unsigned char *msg,
1218 uint len)
1219{
1220 return 0;
1221}
1222
1223
1224static int brcmf_pcie_rx_ctlpkt(struct device *dev, unsigned char *msg,
1225 uint len)
1226{
1227 return 0;
1228}
1229
1230
1231static struct brcmf_bus_ops brcmf_pcie_bus_ops = {
1232 .txdata = brcmf_pcie_tx,
1233 .stop = brcmf_pcie_down,
1234 .txctl = brcmf_pcie_tx_ctlpkt,
1235 .rxctl = brcmf_pcie_rx_ctlpkt,
1236};
1237
1238
1239static int
1240brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo,
1241 u32 sharedram_addr)
1242{
1243 struct brcmf_pcie_shared_info *shared;
1244 u32 addr;
1245 u32 version;
1246
1247 shared = &devinfo->shared;
1248 shared->tcm_base_address = sharedram_addr;
1249
1250 shared->flags = brcmf_pcie_read_tcm32(devinfo, sharedram_addr);
1251 version = shared->flags & BRCMF_PCIE_SHARED_VERSION_MASK;
1252 brcmf_dbg(PCIE, "PCIe protocol version %d\n", version);
1253 if ((version > BRCMF_PCIE_MAX_SHARED_VERSION) ||
1254 (version < BRCMF_PCIE_MIN_SHARED_VERSION)) {
1255 brcmf_err("Unsupported PCIE version %d\n", version);
1256 return -EINVAL;
1257 }
1258 if (shared->flags & BRCMF_PCIE_SHARED_TXPUSH_SUPPORT) {
1259 brcmf_err("Unsupported legacy TX mode 0x%x\n",
1260 shared->flags & BRCMF_PCIE_SHARED_TXPUSH_SUPPORT);
1261 return -EINVAL;
1262 }
1263
1264 addr = sharedram_addr + BRCMF_SHARED_MAX_RXBUFPOST_OFFSET;
1265 shared->max_rxbufpost = brcmf_pcie_read_tcm16(devinfo, addr);
1266 if (shared->max_rxbufpost == 0)
1267 shared->max_rxbufpost = BRCMF_DEF_MAX_RXBUFPOST;
1268
1269 addr = sharedram_addr + BRCMF_SHARED_RX_DATAOFFSET_OFFSET;
1270 shared->rx_dataoffset = brcmf_pcie_read_tcm32(devinfo, addr);
1271
1272 addr = sharedram_addr + BRCMF_SHARED_HTOD_MB_DATA_ADDR_OFFSET;
1273 shared->htod_mb_data_addr = brcmf_pcie_read_tcm32(devinfo, addr);
1274
1275 addr = sharedram_addr + BRCMF_SHARED_DTOH_MB_DATA_ADDR_OFFSET;
1276 shared->dtoh_mb_data_addr = brcmf_pcie_read_tcm32(devinfo, addr);
1277
1278 addr = sharedram_addr + BRCMF_SHARED_RING_INFO_ADDR_OFFSET;
1279 shared->ring_info_addr = brcmf_pcie_read_tcm32(devinfo, addr);
1280
1281 brcmf_dbg(PCIE, "max rx buf post %d, rx dataoffset %d\n",
1282 shared->max_rxbufpost, shared->rx_dataoffset);
1283
1284 brcmf_pcie_bus_console_init(devinfo);
1285
1286 return 0;
1287}
1288
1289
1290static int brcmf_pcie_get_fwnames(struct brcmf_pciedev_info *devinfo)
1291{
1292 char *fw_name;
1293 char *nvram_name;
1294 uint fw_len, nv_len;
1295 char end;
1296
1297 brcmf_dbg(PCIE, "Enter, chip 0x%04x chiprev %d\n", devinfo->ci->chip,
1298 devinfo->ci->chiprev);
1299
1300 switch (devinfo->ci->chip) {
1301 case BRCM_CC_43602_CHIP_ID:
1302 fw_name = BRCMF_PCIE_43602_FW_NAME;
1303 nvram_name = BRCMF_PCIE_43602_NVRAM_NAME;
1304 break;
1305 case BRCM_CC_4354_CHIP_ID:
1306 fw_name = BRCMF_PCIE_4354_FW_NAME;
1307 nvram_name = BRCMF_PCIE_4354_NVRAM_NAME;
1308 break;
1309 case BRCM_CC_4356_CHIP_ID:
1310 fw_name = BRCMF_PCIE_4356_FW_NAME;
1311 nvram_name = BRCMF_PCIE_4356_NVRAM_NAME;
1312 break;
1313 case BRCM_CC_43567_CHIP_ID:
1314 case BRCM_CC_43569_CHIP_ID:
1315 case BRCM_CC_43570_CHIP_ID:
1316 fw_name = BRCMF_PCIE_43570_FW_NAME;
1317 nvram_name = BRCMF_PCIE_43570_NVRAM_NAME;
1318 break;
1319 default:
1320 brcmf_err("Unsupported chip 0x%04x\n", devinfo->ci->chip);
1321 return -ENODEV;
1322 }
1323
1324 fw_len = sizeof(devinfo->fw_name) - 1;
1325 nv_len = sizeof(devinfo->nvram_name) - 1;
1326 /* check if firmware path is provided by module parameter */
1327 if (brcmf_firmware_path[0] != '\0') {
1328 strncpy(devinfo->fw_name, brcmf_firmware_path, fw_len);
1329 strncpy(devinfo->nvram_name, brcmf_firmware_path, nv_len);
1330 fw_len -= strlen(devinfo->fw_name);
1331 nv_len -= strlen(devinfo->nvram_name);
1332
1333 end = brcmf_firmware_path[strlen(brcmf_firmware_path) - 1];
1334 if (end != '/') {
1335 strncat(devinfo->fw_name, "/", fw_len);
1336 strncat(devinfo->nvram_name, "/", nv_len);
1337 fw_len--;
1338 nv_len--;
1339 }
1340 }
1341 strncat(devinfo->fw_name, fw_name, fw_len);
1342 strncat(devinfo->nvram_name, nvram_name, nv_len);
1343
1344 return 0;
1345}
1346
1347
1348static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo,
1349 const struct firmware *fw, void *nvram,
1350 u32 nvram_len)
1351{
1352 u32 sharedram_addr;
1353 u32 sharedram_addr_written;
1354 u32 loop_counter;
1355 int err;
1356 u32 address;
1357 u32 resetintr;
1358
1359 devinfo->ringbell = brcmf_pcie_ringbell_v2;
1360 devinfo->generic_corerev = BRCMF_PCIE_GENREV2;
1361
1362 brcmf_dbg(PCIE, "Halt ARM.\n");
1363 err = brcmf_pcie_enter_download_state(devinfo);
1364 if (err)
1365 return err;
1366
1367 brcmf_dbg(PCIE, "Download FW %s\n", devinfo->fw_name);
1368 brcmf_pcie_copy_mem_todev(devinfo, devinfo->ci->rambase,
1369 (void *)fw->data, fw->size);
1370
1371 resetintr = get_unaligned_le32(fw->data);
1372 release_firmware(fw);
1373
1374 /* reset last 4 bytes of RAM address. to be used for shared
1375 * area. This identifies when FW is running
1376 */
1377 brcmf_pcie_write_ram32(devinfo, devinfo->ci->ramsize - 4, 0);
1378
1379 if (nvram) {
1380 brcmf_dbg(PCIE, "Download NVRAM %s\n", devinfo->nvram_name);
1381 address = devinfo->ci->rambase + devinfo->ci->ramsize -
1382 nvram_len;
1383 brcmf_pcie_copy_mem_todev(devinfo, address, nvram, nvram_len);
1384 brcmf_fw_nvram_free(nvram);
1385 } else {
1386 brcmf_dbg(PCIE, "No matching NVRAM file found %s\n",
1387 devinfo->nvram_name);
1388 }
1389
1390 sharedram_addr_written = brcmf_pcie_read_ram32(devinfo,
1391 devinfo->ci->ramsize -
1392 4);
1393 brcmf_dbg(PCIE, "Bring ARM in running state\n");
1394 err = brcmf_pcie_exit_download_state(devinfo, resetintr);
1395 if (err)
1396 return err;
1397
1398 brcmf_dbg(PCIE, "Wait for FW init\n");
1399 sharedram_addr = sharedram_addr_written;
1400 loop_counter = BRCMF_PCIE_FW_UP_TIMEOUT / 50;
1401 while ((sharedram_addr == sharedram_addr_written) && (loop_counter)) {
1402 msleep(50);
1403 sharedram_addr = brcmf_pcie_read_ram32(devinfo,
1404 devinfo->ci->ramsize -
1405 4);
1406 loop_counter--;
1407 }
1408 if (sharedram_addr == sharedram_addr_written) {
1409 brcmf_err("FW failed to initialize\n");
1410 return -ENODEV;
1411 }
1412 brcmf_dbg(PCIE, "Shared RAM addr: 0x%08x\n", sharedram_addr);
1413
1414 return (brcmf_pcie_init_share_ram_info(devinfo, sharedram_addr));
1415}
1416
1417
1418static int brcmf_pcie_get_resource(struct brcmf_pciedev_info *devinfo)
1419{
1420 struct pci_dev *pdev;
1421 int err;
1422 phys_addr_t bar0_addr, bar1_addr;
1423 ulong bar1_size;
1424
1425 pdev = devinfo->pdev;
1426
1427 err = pci_enable_device(pdev);
1428 if (err) {
1429 brcmf_err("pci_enable_device failed err=%d\n", err);
1430 return err;
1431 }
1432
1433 pci_set_master(pdev);
1434
1435 /* Bar-0 mapped address */
1436 bar0_addr = pci_resource_start(pdev, 0);
1437 /* Bar-1 mapped address */
1438 bar1_addr = pci_resource_start(pdev, 2);
1439 /* read Bar-1 mapped memory range */
1440 bar1_size = pci_resource_len(pdev, 2);
1441 if ((bar1_size == 0) || (bar1_addr == 0)) {
1442 brcmf_err("BAR1 Not enabled, device size=%ld, addr=%#016llx\n",
1443 bar1_size, (unsigned long long)bar1_addr);
1444 return -EINVAL;
1445 }
1446
1447 devinfo->regs = ioremap_nocache(bar0_addr, BRCMF_PCIE_REG_MAP_SIZE);
1448 devinfo->tcm = ioremap_nocache(bar1_addr, BRCMF_PCIE_TCM_MAP_SIZE);
1449 devinfo->tcm_size = BRCMF_PCIE_TCM_MAP_SIZE;
1450
1451 if (!devinfo->regs || !devinfo->tcm) {
1452 brcmf_err("ioremap() failed (%p,%p)\n", devinfo->regs,
1453 devinfo->tcm);
1454 return -EINVAL;
1455 }
1456 brcmf_dbg(PCIE, "Phys addr : reg space = %p base addr %#016llx\n",
1457 devinfo->regs, (unsigned long long)bar0_addr);
1458 brcmf_dbg(PCIE, "Phys addr : mem space = %p base addr %#016llx\n",
1459 devinfo->tcm, (unsigned long long)bar1_addr);
1460
1461 return 0;
1462}
1463
1464
1465static void brcmf_pcie_release_resource(struct brcmf_pciedev_info *devinfo)
1466{
1467 if (devinfo->tcm)
1468 iounmap(devinfo->tcm);
1469 if (devinfo->regs)
1470 iounmap(devinfo->regs);
1471
1472 pci_disable_device(devinfo->pdev);
1473}
1474
1475
1476static int brcmf_pcie_attach_bus(struct device *dev)
1477{
1478 int ret;
1479
1480 /* Attach to the common driver interface */
1481 ret = brcmf_attach(dev);
1482 if (ret) {
1483 brcmf_err("brcmf_attach failed\n");
1484 } else {
1485 ret = brcmf_bus_start(dev);
1486 if (ret)
1487 brcmf_err("dongle is not responding\n");
1488 }
1489
1490 return ret;
1491}
1492
1493
1494static u32 brcmf_pcie_buscore_prep_addr(const struct pci_dev *pdev, u32 addr)
1495{
1496 u32 ret_addr;
1497
1498 ret_addr = addr & (BRCMF_PCIE_BAR0_REG_SIZE - 1);
1499 addr &= ~(BRCMF_PCIE_BAR0_REG_SIZE - 1);
1500 pci_write_config_dword(pdev, BRCMF_PCIE_BAR0_WINDOW, addr);
1501
1502 return ret_addr;
1503}
1504
1505
1506static u32 brcmf_pcie_buscore_read32(void *ctx, u32 addr)
1507{
1508 struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)ctx;
1509
1510 addr = brcmf_pcie_buscore_prep_addr(devinfo->pdev, addr);
1511 return brcmf_pcie_read_reg32(devinfo, addr);
1512}
1513
1514
1515static void brcmf_pcie_buscore_write32(void *ctx, u32 addr, u32 value)
1516{
1517 struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)ctx;
1518
1519 addr = brcmf_pcie_buscore_prep_addr(devinfo->pdev, addr);
1520 brcmf_pcie_write_reg32(devinfo, addr, value);
1521}
1522
1523
1524static int brcmf_pcie_buscoreprep(void *ctx)
1525{
1526 struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)ctx;
1527 int err;
1528
1529 err = brcmf_pcie_get_resource(devinfo);
1530 if (err == 0) {
1531 /* Set CC watchdog to reset all the cores on the chip to bring
1532 * back dongle to a sane state.
1533 */
1534 brcmf_pcie_buscore_write32(ctx, CORE_CC_REG(SI_ENUM_BASE,
1535 watchdog), 4);
1536 msleep(100);
1537 }
1538
1539 return err;
1540}
1541
1542
1543static void brcmf_pcie_buscore_exitdl(void *ctx, struct brcmf_chip *chip,
1544 u32 rstvec)
1545{
1546 struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)ctx;
1547
1548 brcmf_pcie_write_tcm32(devinfo, 0, rstvec);
1549}
1550
1551
1552static const struct brcmf_buscore_ops brcmf_pcie_buscore_ops = {
1553 .prepare = brcmf_pcie_buscoreprep,
1554 .exit_dl = brcmf_pcie_buscore_exitdl,
1555 .read32 = brcmf_pcie_buscore_read32,
1556 .write32 = brcmf_pcie_buscore_write32,
1557};
1558
1559static void brcmf_pcie_setup(struct device *dev, const struct firmware *fw,
1560 void *nvram, u32 nvram_len)
1561{
1562 struct brcmf_bus *bus = dev_get_drvdata(dev);
1563 struct brcmf_pciedev *pcie_bus_dev = bus->bus_priv.pcie;
1564 struct brcmf_pciedev_info *devinfo = pcie_bus_dev->devinfo;
1565 struct brcmf_commonring **flowrings;
1566 int ret;
1567 u32 i;
1568
1569 brcmf_pcie_attach(devinfo);
1570
1571 ret = brcmf_pcie_download_fw_nvram(devinfo, fw, nvram, nvram_len);
1572 if (ret)
1573 goto fail;
1574
1575 devinfo->state = BRCMFMAC_PCIE_STATE_UP;
1576
1577 ret = brcmf_pcie_init_ringbuffers(devinfo);
1578 if (ret)
1579 goto fail;
1580
1581 ret = brcmf_pcie_init_scratchbuffers(devinfo);
1582 if (ret)
1583 goto fail;
1584
1585 brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
1586 ret = brcmf_pcie_request_irq(devinfo);
1587 if (ret)
1588 goto fail;
1589
1590 /* hook the commonrings in the bus structure. */
1591 for (i = 0; i < BRCMF_NROF_COMMON_MSGRINGS; i++)
1592 bus->msgbuf->commonrings[i] =
1593 &devinfo->shared.commonrings[i]->commonring;
1594
1595 flowrings = kcalloc(devinfo->shared.nrof_flowrings, sizeof(flowrings),
1596 GFP_KERNEL);
1597 if (!flowrings)
1598 goto fail;
1599
1600 for (i = 0; i < devinfo->shared.nrof_flowrings; i++)
1601 flowrings[i] = &devinfo->shared.flowrings[i].commonring;
1602 bus->msgbuf->flowrings = flowrings;
1603
1604 bus->msgbuf->rx_dataoffset = devinfo->shared.rx_dataoffset;
1605 bus->msgbuf->max_rxbufpost = devinfo->shared.max_rxbufpost;
1606 bus->msgbuf->nrof_flowrings = devinfo->shared.nrof_flowrings;
1607
1608 init_waitqueue_head(&devinfo->mbdata_resp_wait);
1609
1610 brcmf_pcie_intr_enable(devinfo);
1611 if (brcmf_pcie_attach_bus(bus->dev) == 0)
1612 return;
1613
1614 brcmf_pcie_bus_console_read(devinfo);
1615
1616fail:
1617 device_release_driver(dev);
1618}
1619
1620static int
1621brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1622{
1623 int ret;
1624 struct brcmf_pciedev_info *devinfo;
1625 struct brcmf_pciedev *pcie_bus_dev;
1626 struct brcmf_bus *bus;
1627
1628 brcmf_dbg(PCIE, "Enter %x:%x\n", pdev->vendor, pdev->device);
1629
1630 ret = -ENOMEM;
1631 devinfo = kzalloc(sizeof(*devinfo), GFP_KERNEL);
1632 if (devinfo == NULL)
1633 return ret;
1634
1635 devinfo->pdev = pdev;
1636 pcie_bus_dev = NULL;
1637 devinfo->ci = brcmf_chip_attach(devinfo, &brcmf_pcie_buscore_ops);
1638 if (IS_ERR(devinfo->ci)) {
1639 ret = PTR_ERR(devinfo->ci);
1640 devinfo->ci = NULL;
1641 goto fail;
1642 }
1643
1644 pcie_bus_dev = kzalloc(sizeof(*pcie_bus_dev), GFP_KERNEL);
1645 if (pcie_bus_dev == NULL) {
1646 ret = -ENOMEM;
1647 goto fail;
1648 }
1649
1650 bus = kzalloc(sizeof(*bus), GFP_KERNEL);
1651 if (!bus) {
1652 ret = -ENOMEM;
1653 goto fail;
1654 }
1655 bus->msgbuf = kzalloc(sizeof(*bus->msgbuf), GFP_KERNEL);
1656 if (!bus->msgbuf) {
1657 ret = -ENOMEM;
1658 kfree(bus);
1659 goto fail;
1660 }
1661
1662 /* hook it all together. */
1663 pcie_bus_dev->devinfo = devinfo;
1664 pcie_bus_dev->bus = bus;
1665 bus->dev = &pdev->dev;
1666 bus->bus_priv.pcie = pcie_bus_dev;
1667 bus->ops = &brcmf_pcie_bus_ops;
1668 bus->proto_type = BRCMF_PROTO_MSGBUF;
1669 bus->chip = devinfo->coreid;
1670 dev_set_drvdata(&pdev->dev, bus);
1671
1672 ret = brcmf_pcie_get_fwnames(devinfo);
1673 if (ret)
1674 goto fail_bus;
1675
1676 ret = brcmf_fw_get_firmwares(bus->dev, BRCMF_FW_REQUEST_NVRAM |
1677 BRCMF_FW_REQ_NV_OPTIONAL,
1678 devinfo->fw_name, devinfo->nvram_name,
1679 brcmf_pcie_setup);
1680 if (ret == 0)
1681 return 0;
1682fail_bus:
1683 kfree(bus->msgbuf);
1684 kfree(bus);
1685fail:
1686 brcmf_err("failed %x:%x\n", pdev->vendor, pdev->device);
1687 brcmf_pcie_release_resource(devinfo);
1688 if (devinfo->ci)
1689 brcmf_chip_detach(devinfo->ci);
1690 kfree(pcie_bus_dev);
1691 kfree(devinfo);
1692 return ret;
1693}
1694
1695
1696static void
1697brcmf_pcie_remove(struct pci_dev *pdev)
1698{
1699 struct brcmf_pciedev_info *devinfo;
1700 struct brcmf_bus *bus;
1701
1702 brcmf_dbg(PCIE, "Enter\n");
1703
1704 bus = dev_get_drvdata(&pdev->dev);
1705 if (bus == NULL)
1706 return;
1707
1708 devinfo = bus->bus_priv.pcie->devinfo;
1709
1710 devinfo->state = BRCMFMAC_PCIE_STATE_DOWN;
1711 if (devinfo->ci)
1712 brcmf_pcie_intr_disable(devinfo);
1713
1714 brcmf_detach(&pdev->dev);
1715
1716 kfree(bus->bus_priv.pcie);
1717 kfree(bus->msgbuf->flowrings);
1718 kfree(bus->msgbuf);
1719 kfree(bus);
1720
1721 brcmf_pcie_release_irq(devinfo);
1722 brcmf_pcie_release_scratchbuffers(devinfo);
1723 brcmf_pcie_release_ringbuffers(devinfo);
1724 brcmf_pcie_reset_device(devinfo);
1725 brcmf_pcie_release_resource(devinfo);
1726
1727 if (devinfo->ci)
1728 brcmf_chip_detach(devinfo->ci);
1729
1730 kfree(devinfo);
1731 dev_set_drvdata(&pdev->dev, NULL);
1732}
1733
1734
1735#ifdef CONFIG_PM
1736
1737
1738static int brcmf_pcie_suspend(struct pci_dev *pdev, pm_message_t state)
1739{
1740 struct brcmf_pciedev_info *devinfo;
1741 struct brcmf_bus *bus;
1742 int err;
1743
1744 brcmf_dbg(PCIE, "Enter, state=%d, pdev=%p\n", state.event, pdev);
1745
1746 bus = dev_get_drvdata(&pdev->dev);
1747 devinfo = bus->bus_priv.pcie->devinfo;
1748
1749 brcmf_bus_change_state(bus, BRCMF_BUS_DOWN);
1750
1751 devinfo->mbdata_completed = false;
1752 brcmf_pcie_send_mb_data(devinfo, BRCMF_H2D_HOST_D3_INFORM);
1753
1754 wait_event_timeout(devinfo->mbdata_resp_wait,
1755 devinfo->mbdata_completed,
1756 msecs_to_jiffies(BRCMF_PCIE_MBDATA_TIMEOUT));
1757 if (!devinfo->mbdata_completed) {
1758 brcmf_err("Timeout on response for entering D3 substate\n");
1759 return -EIO;
1760 }
1761 brcmf_pcie_release_irq(devinfo);
1762
1763 err = pci_save_state(pdev);
1764 if (err) {
1765 brcmf_err("pci_save_state failed, err=%d\n", err);
1766 return err;
1767 }
1768
1769 brcmf_chip_detach(devinfo->ci);
1770 devinfo->ci = NULL;
1771
1772 brcmf_pcie_remove(pdev);
1773
1774 return pci_prepare_to_sleep(pdev);
1775}
1776
1777
1778static int brcmf_pcie_resume(struct pci_dev *pdev)
1779{
1780 int err;
1781
1782 brcmf_dbg(PCIE, "Enter, pdev=%p\n", pdev);
1783
1784 err = pci_set_power_state(pdev, PCI_D0);
1785 if (err) {
1786 brcmf_err("pci_set_power_state failed, err=%d\n", err);
1787 return err;
1788 }
1789 pci_restore_state(pdev);
1790
1791 err = brcmf_pcie_probe(pdev, NULL);
1792 if (err)
1793 brcmf_err("probe after resume failed, err=%d\n", err);
1794
1795 return err;
1796}
1797
1798
1799#endif /* CONFIG_PM */
1800
1801
1802#define BRCMF_PCIE_DEVICE(dev_id) { BRCM_PCIE_VENDOR_ID_BROADCOM, dev_id,\
1803 PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, 0 }
1804
1805static struct pci_device_id brcmf_pcie_devid_table[] = {
1806 BRCMF_PCIE_DEVICE(BRCM_PCIE_4354_DEVICE_ID),
1807 BRCMF_PCIE_DEVICE(BRCM_PCIE_4356_DEVICE_ID),
1808 BRCMF_PCIE_DEVICE(BRCM_PCIE_43567_DEVICE_ID),
1809 BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_DEVICE_ID),
1810 BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_DEVICE_ID),
1811 { /* end: all zeroes */ }
1812};
1813
1814
1815MODULE_DEVICE_TABLE(pci, brcmf_pcie_devid_table);
1816
1817
1818static struct pci_driver brcmf_pciedrvr = {
1819 .node = {},
1820 .name = KBUILD_MODNAME,
1821 .id_table = brcmf_pcie_devid_table,
1822 .probe = brcmf_pcie_probe,
1823 .remove = brcmf_pcie_remove,
1824#ifdef CONFIG_PM
1825 .suspend = brcmf_pcie_suspend,
1826 .resume = brcmf_pcie_resume
1827#endif /* CONFIG_PM */
1828};
1829
1830
1831void brcmf_pcie_register(void)
1832{
1833 int err;
1834
1835 brcmf_dbg(PCIE, "Enter\n");
1836 err = pci_register_driver(&brcmf_pciedrvr);
1837 if (err)
1838 brcmf_err("PCIE driver registration failed, err=%d\n", err);
1839}
1840
1841
1842void brcmf_pcie_exit(void)
1843{
1844 brcmf_dbg(PCIE, "Enter\n");
1845 pci_unregister_driver(&brcmf_pciedrvr);
1846}
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/pcie.h b/drivers/net/wireless/brcm80211/brcmfmac/pcie.h
new file mode 100644
index 000000000000..6edaaf8ef5ce
--- /dev/null
+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.h
@@ -0,0 +1,29 @@
1/* Copyright (c) 2014 Broadcom Corporation
2 *
3 * Permission to use, copy, modify, and/or distribute this software for any
4 * purpose with or without fee is hereby granted, provided that the above
5 * copyright notice and this permission notice appear in all copies.
6 *
7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14 */
15#ifndef BRCMFMAC_PCIE_H
16#define BRCMFMAC_PCIE_H
17
18
19struct brcmf_pciedev {
20 struct brcmf_bus *bus;
21 struct brcmf_pciedev_info *devinfo;
22};
23
24
25void brcmf_pcie_exit(void);
26void brcmf_pcie_register(void);
27
28
29#endif /* BRCMFMAC_PCIE_H */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/proto.c b/drivers/net/wireless/brcm80211/brcmfmac/proto.c
index b6b464184946..62b940723339 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/proto.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/proto.c
@@ -21,26 +21,40 @@
21 21
22#include <brcmu_wifi.h> 22#include <brcmu_wifi.h>
23#include "dhd.h" 23#include "dhd.h"
24#include "dhd_bus.h"
24#include "dhd_dbg.h" 25#include "dhd_dbg.h"
25#include "proto.h" 26#include "proto.h"
26#include "bcdc.h" 27#include "bcdc.h"
28#include "msgbuf.h"
27 29
28 30
29int brcmf_proto_attach(struct brcmf_pub *drvr) 31int brcmf_proto_attach(struct brcmf_pub *drvr)
30{ 32{
31 struct brcmf_proto *proto; 33 struct brcmf_proto *proto;
32 34
35 brcmf_dbg(TRACE, "Enter\n");
36
33 proto = kzalloc(sizeof(*proto), GFP_ATOMIC); 37 proto = kzalloc(sizeof(*proto), GFP_ATOMIC);
34 if (!proto) 38 if (!proto)
35 goto fail; 39 goto fail;
36 40
37 drvr->proto = proto; 41 drvr->proto = proto;
38 /* BCDC protocol is only protocol supported for the moment */
39 if (brcmf_proto_bcdc_attach(drvr))
40 goto fail;
41 42
43 if (drvr->bus_if->proto_type == BRCMF_PROTO_BCDC) {
44 if (brcmf_proto_bcdc_attach(drvr))
45 goto fail;
46 } else if (drvr->bus_if->proto_type == BRCMF_PROTO_MSGBUF) {
47 if (brcmf_proto_msgbuf_attach(drvr))
48 goto fail;
49 } else {
50 brcmf_err("Unsupported proto type %d\n",
51 drvr->bus_if->proto_type);
52 goto fail;
53 }
42 if ((proto->txdata == NULL) || (proto->hdrpull == NULL) || 54 if ((proto->txdata == NULL) || (proto->hdrpull == NULL) ||
43 (proto->query_dcmd == NULL) || (proto->set_dcmd == NULL)) { 55 (proto->query_dcmd == NULL) || (proto->set_dcmd == NULL) ||
56 (proto->configure_addr_mode == NULL) ||
57 (proto->delete_peer == NULL) || (proto->add_tdls_peer == NULL)) {
44 brcmf_err("Not all proto handlers have been installed\n"); 58 brcmf_err("Not all proto handlers have been installed\n");
45 goto fail; 59 goto fail;
46 } 60 }
@@ -54,8 +68,13 @@ fail:
54 68
55void brcmf_proto_detach(struct brcmf_pub *drvr) 69void brcmf_proto_detach(struct brcmf_pub *drvr)
56{ 70{
71 brcmf_dbg(TRACE, "Enter\n");
72
57 if (drvr->proto) { 73 if (drvr->proto) {
58 brcmf_proto_bcdc_detach(drvr); 74 if (drvr->bus_if->proto_type == BRCMF_PROTO_BCDC)
75 brcmf_proto_bcdc_detach(drvr);
76 else if (drvr->bus_if->proto_type == BRCMF_PROTO_MSGBUF)
77 brcmf_proto_msgbuf_detach(drvr);
59 kfree(drvr->proto); 78 kfree(drvr->proto);
60 drvr->proto = NULL; 79 drvr->proto = NULL;
61 } 80 }
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/proto.h b/drivers/net/wireless/brcm80211/brcmfmac/proto.h
index 482fb0ba4a30..971172ff686c 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/proto.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/proto.h
@@ -16,6 +16,13 @@
16#ifndef BRCMFMAC_PROTO_H 16#ifndef BRCMFMAC_PROTO_H
17#define BRCMFMAC_PROTO_H 17#define BRCMFMAC_PROTO_H
18 18
19
20enum proto_addr_mode {
21 ADDR_INDIRECT = 0,
22 ADDR_DIRECT
23};
24
25
19struct brcmf_proto { 26struct brcmf_proto {
20 int (*hdrpull)(struct brcmf_pub *drvr, bool do_fws, u8 *ifidx, 27 int (*hdrpull)(struct brcmf_pub *drvr, bool do_fws, u8 *ifidx,
21 struct sk_buff *skb); 28 struct sk_buff *skb);
@@ -25,6 +32,12 @@ struct brcmf_proto {
25 uint len); 32 uint len);
26 int (*txdata)(struct brcmf_pub *drvr, int ifidx, u8 offset, 33 int (*txdata)(struct brcmf_pub *drvr, int ifidx, u8 offset,
27 struct sk_buff *skb); 34 struct sk_buff *skb);
35 void (*configure_addr_mode)(struct brcmf_pub *drvr, int ifidx,
36 enum proto_addr_mode addr_mode);
37 void (*delete_peer)(struct brcmf_pub *drvr, int ifidx,
38 u8 peer[ETH_ALEN]);
39 void (*add_tdls_peer)(struct brcmf_pub *drvr, int ifidx,
40 u8 peer[ETH_ALEN]);
28 void *pd; 41 void *pd;
29}; 42};
30 43
@@ -48,10 +61,26 @@ static inline int brcmf_proto_set_dcmd(struct brcmf_pub *drvr, int ifidx,
48 return drvr->proto->set_dcmd(drvr, ifidx, cmd, buf, len); 61 return drvr->proto->set_dcmd(drvr, ifidx, cmd, buf, len);
49} 62}
50static inline int brcmf_proto_txdata(struct brcmf_pub *drvr, int ifidx, 63static inline int brcmf_proto_txdata(struct brcmf_pub *drvr, int ifidx,
51 u8 offset, struct sk_buff *skb) 64 u8 offset, struct sk_buff *skb)
52{ 65{
53 return drvr->proto->txdata(drvr, ifidx, offset, skb); 66 return drvr->proto->txdata(drvr, ifidx, offset, skb);
54} 67}
68static inline void
69brcmf_proto_configure_addr_mode(struct brcmf_pub *drvr, int ifidx,
70 enum proto_addr_mode addr_mode)
71{
72 drvr->proto->configure_addr_mode(drvr, ifidx, addr_mode);
73}
74static inline void
75brcmf_proto_delete_peer(struct brcmf_pub *drvr, int ifidx, u8 peer[ETH_ALEN])
76{
77 drvr->proto->delete_peer(drvr, ifidx, peer);
78}
79static inline void
80brcmf_proto_add_tdls_peer(struct brcmf_pub *drvr, int ifidx, u8 peer[ETH_ALEN])
81{
82 drvr->proto->add_tdls_peer(drvr, ifidx, peer);
83}
55 84
56 85
57#endif /* BRCMFMAC_PROTO_H */ 86#endif /* BRCMFMAC_PROTO_H */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h b/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h
index 6c5e585ccda9..f2d06cae366a 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h
@@ -74,12 +74,12 @@
74#define SBSDIO_SPROM_DATA_HIGH 0x10003 74#define SBSDIO_SPROM_DATA_HIGH 0x10003
75/* sprom indirect access addr byte 0 */ 75/* sprom indirect access addr byte 0 */
76#define SBSDIO_SPROM_ADDR_LOW 0x10004 76#define SBSDIO_SPROM_ADDR_LOW 0x10004
77/* sprom indirect access addr byte 0 */ 77/* gpio select */
78#define SBSDIO_SPROM_ADDR_HIGH 0x10005 78#define SBSDIO_GPIO_SELECT 0x10005
79/* xtal_pu (gpio) output */ 79/* gpio output */
80#define SBSDIO_CHIP_CTRL_DATA 0x10006 80#define SBSDIO_GPIO_OUT 0x10006
81/* xtal_pu (gpio) enable */ 81/* gpio enable */
82#define SBSDIO_CHIP_CTRL_EN 0x10007 82#define SBSDIO_GPIO_EN 0x10007
83/* rev < 7, watermark for sdio device */ 83/* rev < 7, watermark for sdio device */
84#define SBSDIO_WATERMARK 0x10008 84#define SBSDIO_WATERMARK 0x10008
85/* control busy signal generation */ 85/* control busy signal generation */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
index 48078a321716..02fe706fc9ec 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
@@ -35,6 +35,7 @@
35#include "wl_cfg80211.h" 35#include "wl_cfg80211.h"
36#include "feature.h" 36#include "feature.h"
37#include "fwil.h" 37#include "fwil.h"
38#include "proto.h"
38#include "vendor.h" 39#include "vendor.h"
39 40
40#define BRCMF_SCAN_IE_LEN_MAX 2048 41#define BRCMF_SCAN_IE_LEN_MAX 2048
@@ -493,6 +494,22 @@ brcmf_configure_arp_offload(struct brcmf_if *ifp, bool enable)
493 return err; 494 return err;
494} 495}
495 496
497static void
498brcmf_cfg80211_update_proto_addr_mode(struct wireless_dev *wdev)
499{
500 struct net_device *ndev = wdev->netdev;
501 struct brcmf_if *ifp = netdev_priv(ndev);
502
503 if ((wdev->iftype == NL80211_IFTYPE_ADHOC) ||
504 (wdev->iftype == NL80211_IFTYPE_AP) ||
505 (wdev->iftype == NL80211_IFTYPE_P2P_GO))
506 brcmf_proto_configure_addr_mode(ifp->drvr, ifp->ifidx,
507 ADDR_DIRECT);
508 else
509 brcmf_proto_configure_addr_mode(ifp->drvr, ifp->ifidx,
510 ADDR_INDIRECT);
511}
512
496static bool brcmf_is_apmode(struct brcmf_cfg80211_vif *vif) 513static bool brcmf_is_apmode(struct brcmf_cfg80211_vif *vif)
497{ 514{
498 enum nl80211_iftype iftype; 515 enum nl80211_iftype iftype;
@@ -512,6 +529,8 @@ static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy,
512 u32 *flags, 529 u32 *flags,
513 struct vif_params *params) 530 struct vif_params *params)
514{ 531{
532 struct wireless_dev *wdev;
533
515 brcmf_dbg(TRACE, "enter: %s type %d\n", name, type); 534 brcmf_dbg(TRACE, "enter: %s type %d\n", name, type);
516 switch (type) { 535 switch (type) {
517 case NL80211_IFTYPE_ADHOC: 536 case NL80211_IFTYPE_ADHOC:
@@ -525,7 +544,10 @@ static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy,
525 case NL80211_IFTYPE_P2P_CLIENT: 544 case NL80211_IFTYPE_P2P_CLIENT:
526 case NL80211_IFTYPE_P2P_GO: 545 case NL80211_IFTYPE_P2P_GO:
527 case NL80211_IFTYPE_P2P_DEVICE: 546 case NL80211_IFTYPE_P2P_DEVICE:
528 return brcmf_p2p_add_vif(wiphy, name, type, flags, params); 547 wdev = brcmf_p2p_add_vif(wiphy, name, type, flags, params);
548 if (!IS_ERR(wdev))
549 brcmf_cfg80211_update_proto_addr_mode(wdev);
550 return wdev;
529 case NL80211_IFTYPE_UNSPECIFIED: 551 case NL80211_IFTYPE_UNSPECIFIED:
530 default: 552 default:
531 return ERR_PTR(-EINVAL); 553 return ERR_PTR(-EINVAL);
@@ -720,6 +742,8 @@ brcmf_cfg80211_change_iface(struct wiphy *wiphy, struct net_device *ndev,
720 } 742 }
721 ndev->ieee80211_ptr->iftype = type; 743 ndev->ieee80211_ptr->iftype = type;
722 744
745 brcmf_cfg80211_update_proto_addr_mode(&vif->wdev);
746
723done: 747done:
724 brcmf_dbg(TRACE, "Exit\n"); 748 brcmf_dbg(TRACE, "Exit\n");
725 749
@@ -4131,6 +4155,27 @@ static void brcmf_cfg80211_crit_proto_stop(struct wiphy *wiphy,
4131 clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status); 4155 clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status);
4132} 4156}
4133 4157
4158static s32
4159brcmf_notify_tdls_peer_event(struct brcmf_if *ifp,
4160 const struct brcmf_event_msg *e, void *data)
4161{
4162 switch (e->reason) {
4163 case BRCMF_E_REASON_TDLS_PEER_DISCOVERED:
4164 brcmf_dbg(TRACE, "TDLS Peer Discovered\n");
4165 break;
4166 case BRCMF_E_REASON_TDLS_PEER_CONNECTED:
4167 brcmf_dbg(TRACE, "TDLS Peer Connected\n");
4168 brcmf_proto_add_tdls_peer(ifp->drvr, ifp->ifidx, (u8 *)e->addr);
4169 break;
4170 case BRCMF_E_REASON_TDLS_PEER_DISCONNECTED:
4171 brcmf_dbg(TRACE, "TDLS Peer Disconnected\n");
4172 brcmf_proto_delete_peer(ifp->drvr, ifp->ifidx, (u8 *)e->addr);
4173 break;
4174 }
4175
4176 return 0;
4177}
4178
4134static int brcmf_convert_nl80211_tdls_oper(enum nl80211_tdls_operation oper) 4179static int brcmf_convert_nl80211_tdls_oper(enum nl80211_tdls_operation oper)
4135{ 4180{
4136 int ret; 4181 int ret;
@@ -4525,6 +4570,13 @@ brcmf_notify_connect_status(struct brcmf_if *ifp,
4525 struct ieee80211_channel *chan; 4570 struct ieee80211_channel *chan;
4526 s32 err = 0; 4571 s32 err = 0;
4527 4572
4573 if ((e->event_code == BRCMF_E_DEAUTH) ||
4574 (e->event_code == BRCMF_E_DEAUTH_IND) ||
4575 (e->event_code == BRCMF_E_DISASSOC_IND) ||
4576 ((e->event_code == BRCMF_E_LINK) && (!e->flags))) {
4577 brcmf_proto_delete_peer(ifp->drvr, ifp->ifidx, (u8 *)e->addr);
4578 }
4579
4528 if (brcmf_is_apmode(ifp->vif)) { 4580 if (brcmf_is_apmode(ifp->vif)) {
4529 err = brcmf_notify_connect_status_ap(cfg, ndev, e, data); 4581 err = brcmf_notify_connect_status_ap(cfg, ndev, e, data);
4530 } else if (brcmf_is_linkup(e)) { 4582 } else if (brcmf_is_linkup(e)) {
@@ -5660,6 +5712,9 @@ struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
5660 if (err) { 5712 if (err) {
5661 brcmf_dbg(INFO, "TDLS not enabled (%d)\n", err); 5713 brcmf_dbg(INFO, "TDLS not enabled (%d)\n", err);
5662 wiphy->flags &= ~WIPHY_FLAG_SUPPORTS_TDLS; 5714 wiphy->flags &= ~WIPHY_FLAG_SUPPORTS_TDLS;
5715 } else {
5716 brcmf_fweh_register(cfg->pub, BRCMF_E_TDLS_PEER_EVENT,
5717 brcmf_notify_tdls_peer_event);
5663 } 5718 }
5664 5719
5665 return cfg; 5720 return cfg;
diff --git a/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h b/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
index 64d1a7ba040c..af26e0de1e5c 100644
--- a/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
+++ b/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
@@ -38,8 +38,12 @@
38#define BRCM_CC_4335_CHIP_ID 0x4335 38#define BRCM_CC_4335_CHIP_ID 0x4335
39#define BRCM_CC_4339_CHIP_ID 0x4339 39#define BRCM_CC_4339_CHIP_ID 0x4339
40#define BRCM_CC_4354_CHIP_ID 0x4354 40#define BRCM_CC_4354_CHIP_ID 0x4354
41#define BRCM_CC_4356_CHIP_ID 0x4356
41#define BRCM_CC_43566_CHIP_ID 43566 42#define BRCM_CC_43566_CHIP_ID 43566
43#define BRCM_CC_43567_CHIP_ID 43567
42#define BRCM_CC_43569_CHIP_ID 43569 44#define BRCM_CC_43569_CHIP_ID 43569
45#define BRCM_CC_43570_CHIP_ID 43570
46#define BRCM_CC_43602_CHIP_ID 43602
43 47
44/* SDIO Device IDs */ 48/* SDIO Device IDs */
45#define BRCM_SDIO_43143_DEVICE_ID BRCM_CC_43143_CHIP_ID 49#define BRCM_SDIO_43143_DEVICE_ID BRCM_CC_43143_CHIP_ID
@@ -58,6 +62,13 @@
58#define BRCM_USB_43569_DEVICE_ID 0xbd27 62#define BRCM_USB_43569_DEVICE_ID 0xbd27
59#define BRCM_USB_BCMFW_DEVICE_ID 0x0bdc 63#define BRCM_USB_BCMFW_DEVICE_ID 0x0bdc
60 64
65/* PCIE Device IDs */
66#define BRCM_PCIE_4354_DEVICE_ID 0x43df
67#define BRCM_PCIE_4356_DEVICE_ID 0x43ec
68#define BRCM_PCIE_43567_DEVICE_ID 0x43d3
69#define BRCM_PCIE_43570_DEVICE_ID 0x43d9
70#define BRCM_PCIE_43602_DEVICE_ID 0x43ba
71
61/* brcmsmac IDs */ 72/* brcmsmac IDs */
62#define BCM4313_D11N2G_ID 0x4727 /* 4313 802.11n 2.4G device */ 73#define BCM4313_D11N2G_ID 0x4727 /* 4313 802.11n 2.4G device */
63#define BCM43224_D11N_ID 0x4353 /* 43224 802.11n dualband device */ 74#define BCM43224_D11N_ID 0x4353 /* 43224 802.11n dualband device */
diff --git a/drivers/net/wireless/iwlegacy/common.c b/drivers/net/wireless/iwlegacy/common.c
index 03de7467aecf..2c4fa49686ef 100644
--- a/drivers/net/wireless/iwlegacy/common.c
+++ b/drivers/net/wireless/iwlegacy/common.c
@@ -2980,7 +2980,8 @@ il_tx_queue_alloc(struct il_priv *il, struct il_tx_queue *txq, u32 id)
2980 /* Driver ilate data, only for Tx (not command) queues, 2980 /* Driver ilate data, only for Tx (not command) queues,
2981 * not shared with device. */ 2981 * not shared with device. */
2982 if (id != il->cmd_queue) { 2982 if (id != il->cmd_queue) {
2983 txq->skbs = kcalloc(TFD_QUEUE_SIZE_MAX, sizeof(struct skb *), 2983 txq->skbs = kcalloc(TFD_QUEUE_SIZE_MAX,
2984 sizeof(struct sk_buff *),
2984 GFP_KERNEL); 2985 GFP_KERNEL);
2985 if (!txq->skbs) { 2986 if (!txq->skbs) {
2986 IL_ERR("Fail to alloc skbs\n"); 2987 IL_ERR("Fail to alloc skbs\n");
diff --git a/drivers/nfc/Kconfig b/drivers/nfc/Kconfig
index 26c66a126551..7929fac13e1c 100644
--- a/drivers/nfc/Kconfig
+++ b/drivers/nfc/Kconfig
@@ -72,5 +72,5 @@ source "drivers/nfc/pn544/Kconfig"
72source "drivers/nfc/microread/Kconfig" 72source "drivers/nfc/microread/Kconfig"
73source "drivers/nfc/nfcmrvl/Kconfig" 73source "drivers/nfc/nfcmrvl/Kconfig"
74source "drivers/nfc/st21nfca/Kconfig" 74source "drivers/nfc/st21nfca/Kconfig"
75 75source "drivers/nfc/st21nfcb/Kconfig"
76endmenu 76endmenu
diff --git a/drivers/nfc/Makefile b/drivers/nfc/Makefile
index 23225b0287fd..6b23a2c6e34a 100644
--- a/drivers/nfc/Makefile
+++ b/drivers/nfc/Makefile
@@ -11,6 +11,7 @@ obj-$(CONFIG_NFC_SIM) += nfcsim.o
11obj-$(CONFIG_NFC_PORT100) += port100.o 11obj-$(CONFIG_NFC_PORT100) += port100.o
12obj-$(CONFIG_NFC_MRVL) += nfcmrvl/ 12obj-$(CONFIG_NFC_MRVL) += nfcmrvl/
13obj-$(CONFIG_NFC_TRF7970A) += trf7970a.o 13obj-$(CONFIG_NFC_TRF7970A) += trf7970a.o
14obj-$(CONFIG_NFC_ST21NFCA) += st21nfca/ 14obj-$(CONFIG_NFC_ST21NFCA) += st21nfca/
15obj-$(CONFIG_NFC_ST21NFCB) += st21nfcb/
15 16
16ccflags-$(CONFIG_NFC_DEBUG) := -DDEBUG 17ccflags-$(CONFIG_NFC_DEBUG) := -DDEBUG
diff --git a/drivers/nfc/st21nfca/Makefile b/drivers/nfc/st21nfca/Makefile
index 038ed093a119..db7a38ae05f7 100644
--- a/drivers/nfc/st21nfca/Makefile
+++ b/drivers/nfc/st21nfca/Makefile
@@ -4,5 +4,5 @@
4 4
5st21nfca_i2c-objs = i2c.o 5st21nfca_i2c-objs = i2c.o
6 6
7obj-$(CONFIG_NFC_ST21NFCA) += st21nfca.o 7obj-$(CONFIG_NFC_ST21NFCA) += st21nfca.o st21nfca_dep.o
8obj-$(CONFIG_NFC_ST21NFCA_I2C) += st21nfca_i2c.o 8obj-$(CONFIG_NFC_ST21NFCA_I2C) += st21nfca_i2c.o
diff --git a/drivers/nfc/st21nfca/i2c.c b/drivers/nfc/st21nfca/i2c.c
index 3f954ed86d98..ff31939978ae 100644
--- a/drivers/nfc/st21nfca/i2c.c
+++ b/drivers/nfc/st21nfca/i2c.c
@@ -93,7 +93,7 @@ struct st21nfca_i2c_phy {
93 int hard_fault; 93 int hard_fault;
94 struct mutex phy_lock; 94 struct mutex phy_lock;
95}; 95};
96static u8 len_seq[] = { 13, 24, 15, 29 }; 96static u8 len_seq[] = { 16, 24, 12, 29 };
97static u16 wait_tab[] = { 2, 3, 5, 15, 20, 40}; 97static u16 wait_tab[] = { 2, 3, 5, 15, 20, 40};
98 98
99#define I2C_DUMP_SKB(info, skb) \ 99#define I2C_DUMP_SKB(info, skb) \
@@ -397,12 +397,11 @@ static int st21nfca_hci_i2c_read(struct st21nfca_i2c_phy *phy,
397 * The first read sequence does not start with SOF. 397 * The first read sequence does not start with SOF.
398 * Data is corrupeted so we drop it. 398 * Data is corrupeted so we drop it.
399 */ 399 */
400 if (!phy->current_read_len && buf[0] != ST21NFCA_SOF_EOF) { 400 if (!phy->current_read_len && !IS_START_OF_FRAME(buf)) {
401 skb_trim(skb, 0); 401 skb_trim(skb, 0);
402 phy->current_read_len = 0; 402 phy->current_read_len = 0;
403 return -EIO; 403 return -EIO;
404 } else if (phy->current_read_len && 404 } else if (phy->current_read_len && IS_START_OF_FRAME(buf)) {
405 IS_START_OF_FRAME(buf)) {
406 /* 405 /*
407 * Previous frame transmission was interrupted and 406 * Previous frame transmission was interrupted and
408 * the frame got repeated. 407 * the frame got repeated.
@@ -487,6 +486,8 @@ static irqreturn_t st21nfca_hci_irq_thread_fn(int irq, void *phy_id)
487 */ 486 */
488 nfc_hci_recv_frame(phy->hdev, phy->pending_skb); 487 nfc_hci_recv_frame(phy->hdev, phy->pending_skb);
489 phy->crc_trials = 0; 488 phy->crc_trials = 0;
489 } else {
490 kfree_skb(phy->pending_skb);
490 } 491 }
491 492
492 phy->pending_skb = alloc_skb(ST21NFCA_HCI_LLC_MAX_SIZE * 2, GFP_KERNEL); 493 phy->pending_skb = alloc_skb(ST21NFCA_HCI_LLC_MAX_SIZE * 2, GFP_KERNEL);
diff --git a/drivers/nfc/st21nfca/st21nfca.c b/drivers/nfc/st21nfca/st21nfca.c
index 51e0f00b3a4f..a902b0551c86 100644
--- a/drivers/nfc/st21nfca/st21nfca.c
+++ b/drivers/nfc/st21nfca/st21nfca.c
@@ -22,6 +22,7 @@
22#include <net/nfc/llc.h> 22#include <net/nfc/llc.h>
23 23
24#include "st21nfca.h" 24#include "st21nfca.h"
25#include "st21nfca_dep.h"
25 26
26#define DRIVER_DESC "HCI NFC driver for ST21NFCA" 27#define DRIVER_DESC "HCI NFC driver for ST21NFCA"
27 28
@@ -53,6 +54,7 @@
53#define ST21NFCA_DM_PIPE_CREATED 0x02 54#define ST21NFCA_DM_PIPE_CREATED 0x02
54#define ST21NFCA_DM_PIPE_OPEN 0x04 55#define ST21NFCA_DM_PIPE_OPEN 0x04
55#define ST21NFCA_DM_RF_ACTIVE 0x80 56#define ST21NFCA_DM_RF_ACTIVE 0x80
57#define ST21NFCA_DM_DISCONNECT 0x30
56 58
57#define ST21NFCA_DM_IS_PIPE_OPEN(p) \ 59#define ST21NFCA_DM_IS_PIPE_OPEN(p) \
58 ((p & 0x0f) == (ST21NFCA_DM_PIPE_CREATED | ST21NFCA_DM_PIPE_OPEN)) 60 ((p & 0x0f) == (ST21NFCA_DM_PIPE_CREATED | ST21NFCA_DM_PIPE_OPEN))
@@ -72,6 +74,7 @@ static struct nfc_hci_gate st21nfca_gates[] = {
72 {ST21NFCA_RF_READER_F_GATE, NFC_HCI_INVALID_PIPE}, 74 {ST21NFCA_RF_READER_F_GATE, NFC_HCI_INVALID_PIPE},
73 {ST21NFCA_RF_READER_14443_3_A_GATE, NFC_HCI_INVALID_PIPE}, 75 {ST21NFCA_RF_READER_14443_3_A_GATE, NFC_HCI_INVALID_PIPE},
74 {ST21NFCA_RF_READER_ISO15693_GATE, NFC_HCI_INVALID_PIPE}, 76 {ST21NFCA_RF_READER_ISO15693_GATE, NFC_HCI_INVALID_PIPE},
77 {ST21NFCA_RF_CARD_F_GATE, NFC_HCI_INVALID_PIPE},
75}; 78};
76 79
77struct st21nfca_pipe_info { 80struct st21nfca_pipe_info {
@@ -299,6 +302,9 @@ static int st21nfca_hci_start_poll(struct nfc_hci_dev *hdev,
299 u32 im_protocols, u32 tm_protocols) 302 u32 im_protocols, u32 tm_protocols)
300{ 303{
301 int r; 304 int r;
305 u32 pol_req;
306 u8 param[19];
307 struct sk_buff *datarate_skb;
302 308
303 pr_info(DRIVER_DESC ": %s protocols 0x%x 0x%x\n", 309 pr_info(DRIVER_DESC ": %s protocols 0x%x 0x%x\n",
304 __func__, im_protocols, tm_protocols); 310 __func__, im_protocols, tm_protocols);
@@ -331,6 +337,31 @@ static int st21nfca_hci_start_poll(struct nfc_hci_dev *hdev,
331 ST21NFCA_RF_READER_F_GATE); 337 ST21NFCA_RF_READER_F_GATE);
332 if (r < 0) 338 if (r < 0)
333 return r; 339 return r;
340 } else {
341 hdev->gb = nfc_get_local_general_bytes(hdev->ndev,
342 &hdev->gb_len);
343
344 if (hdev->gb == NULL || hdev->gb_len == 0) {
345 im_protocols &= ~NFC_PROTO_NFC_DEP_MASK;
346 tm_protocols &= ~NFC_PROTO_NFC_DEP_MASK;
347 }
348
349 param[0] = ST21NFCA_RF_READER_F_DATARATE_106 |
350 ST21NFCA_RF_READER_F_DATARATE_212 |
351 ST21NFCA_RF_READER_F_DATARATE_424;
352 r = nfc_hci_set_param(hdev, ST21NFCA_RF_READER_F_GATE,
353 ST21NFCA_RF_READER_F_DATARATE,
354 param, 1);
355 if (r < 0)
356 return r;
357
358 pol_req =
359 be32_to_cpu(ST21NFCA_RF_READER_F_POL_REQ_DEFAULT);
360 r = nfc_hci_set_param(hdev, ST21NFCA_RF_READER_F_GATE,
361 ST21NFCA_RF_READER_F_POL_REQ,
362 (u8 *) &pol_req, 4);
363 if (r < 0)
364 return r;
334 } 365 }
335 366
336 if ((ST21NFCA_RF_READER_14443_3_A_GATE & im_protocols) == 0) { 367 if ((ST21NFCA_RF_READER_14443_3_A_GATE & im_protocols) == 0) {
@@ -353,9 +384,104 @@ static int st21nfca_hci_start_poll(struct nfc_hci_dev *hdev,
353 nfc_hci_send_event(hdev, NFC_HCI_RF_READER_A_GATE, 384 nfc_hci_send_event(hdev, NFC_HCI_RF_READER_A_GATE,
354 NFC_HCI_EVT_END_OPERATION, NULL, 0); 385 NFC_HCI_EVT_END_OPERATION, NULL, 0);
355 } 386 }
387
388 if (tm_protocols & NFC_PROTO_NFC_DEP_MASK) {
389 r = nfc_hci_get_param(hdev, ST21NFCA_RF_CARD_F_GATE,
390 ST21NFCA_RF_CARD_F_DATARATE,
391 &datarate_skb);
392 if (r < 0)
393 return r;
394
395 /* Configure the maximum supported datarate to 424Kbps */
396 if (datarate_skb->len > 0 &&
397 datarate_skb->data[0] !=
398 ST21NFCA_RF_CARD_F_DATARATE_212_424) {
399 param[0] = ST21NFCA_RF_CARD_F_DATARATE_212_424;
400 r = nfc_hci_set_param(hdev, ST21NFCA_RF_CARD_F_GATE,
401 ST21NFCA_RF_CARD_F_DATARATE,
402 param, 1);
403 if (r < 0)
404 return r;
405 }
406
407 /*
408 * Configure sens_res
409 *
410 * NFC Forum Digital Spec Table 7:
411 * NFCID1 size: triple (10 bytes)
412 */
413 param[0] = 0x00;
414 param[1] = 0x08;
415 r = nfc_hci_set_param(hdev, ST21NFCA_RF_CARD_F_GATE,
416 ST21NFCA_RF_CARD_F_SENS_RES, param, 2);
417 if (r < 0)
418 return r;
419
420 /*
421 * Configure sel_res
422 *
423 * NFC Forum Digistal Spec Table 17:
424 * b3 set to 0b (value b7-b6):
425 * - 10b: Configured for NFC-DEP Protocol
426 */
427 param[0] = 0x40;
428 r = nfc_hci_set_param(hdev, ST21NFCA_RF_CARD_F_GATE,
429 ST21NFCA_RF_CARD_F_SEL_RES, param, 1);
430 if (r < 0)
431 return r;
432
433 /* Configure NFCID1 Random uid */
434 r = nfc_hci_set_param(hdev, ST21NFCA_RF_CARD_F_GATE,
435 ST21NFCA_RF_CARD_F_NFCID1, NULL, 0);
436 if (r < 0)
437 return r;
438
439 /* Configure NFCID2_LIST */
440 /* System Code */
441 param[0] = 0x00;
442 param[1] = 0x00;
443 /* NFCID2 */
444 param[2] = 0x01;
445 param[3] = 0xfe;
446 param[4] = 'S';
447 param[5] = 'T';
448 param[6] = 'M';
449 param[7] = 'i';
450 param[8] = 'c';
451 param[9] = 'r';
452 /* 8 byte Pad bytes used for polling respone frame */
453
454 /*
455 * Configuration byte:
456 * - bit 0: define the default NFCID2 entry used when the
457 * system code is equal to 'FFFF'
458 * - bit 1: use a random value for lowest 6 bytes of
459 * NFCID2 value
460 * - bit 2: ignore polling request frame if request code
461 * is equal to '01'
462 * - Other bits are RFU
463 */
464 param[18] = 0x01;
465 r = nfc_hci_set_param(hdev, ST21NFCA_RF_CARD_F_GATE,
466 ST21NFCA_RF_CARD_F_NFCID2_LIST, param,
467 19);
468 if (r < 0)
469 return r;
470
471 param[0] = 0x02;
472 r = nfc_hci_set_param(hdev, ST21NFCA_RF_CARD_F_GATE,
473 ST21NFCA_RF_CARD_F_MODE, param, 1);
474 }
475
356 return r; 476 return r;
357} 477}
358 478
479static void st21nfca_hci_stop_poll(struct nfc_hci_dev *hdev)
480{
481 nfc_hci_send_cmd(hdev, ST21NFCA_DEVICE_MGNT_GATE,
482 ST21NFCA_DM_DISCONNECT, NULL, 0, NULL);
483}
484
359static int st21nfca_get_iso14443_3_atqa(struct nfc_hci_dev *hdev, u16 *atqa) 485static int st21nfca_get_iso14443_3_atqa(struct nfc_hci_dev *hdev, u16 *atqa)
360{ 486{
361 int r; 487 int r;
@@ -451,6 +577,26 @@ exit:
451 return r; 577 return r;
452} 578}
453 579
580static int st21nfca_hci_dep_link_up(struct nfc_hci_dev *hdev,
581 struct nfc_target *target, u8 comm_mode,
582 u8 *gb, size_t gb_len)
583{
584 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
585
586 info->dep_info.idx = target->idx;
587 return st21nfca_im_send_atr_req(hdev, gb, gb_len);
588}
589
590static int st21nfca_hci_dep_link_down(struct nfc_hci_dev *hdev)
591{
592 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
593
594 info->state = ST21NFCA_ST_READY;
595
596 return nfc_hci_send_cmd(hdev, ST21NFCA_DEVICE_MGNT_GATE,
597 ST21NFCA_DM_DISCONNECT, NULL, 0, NULL);
598}
599
454static int st21nfca_hci_target_from_gate(struct nfc_hci_dev *hdev, u8 gate, 600static int st21nfca_hci_target_from_gate(struct nfc_hci_dev *hdev, u8 gate,
455 struct nfc_target *target) 601 struct nfc_target *target)
456{ 602{
@@ -505,6 +651,69 @@ static int st21nfca_hci_target_from_gate(struct nfc_hci_dev *hdev, u8 gate,
505 return 0; 651 return 0;
506} 652}
507 653
654static int st21nfca_hci_complete_target_discovered(struct nfc_hci_dev *hdev,
655 u8 gate,
656 struct nfc_target *target)
657{
658 int r;
659 struct sk_buff *nfcid2_skb = NULL, *nfcid1_skb;
660
661 if (gate == ST21NFCA_RF_READER_F_GATE) {
662 r = nfc_hci_get_param(hdev, ST21NFCA_RF_READER_F_GATE,
663 ST21NFCA_RF_READER_F_NFCID2, &nfcid2_skb);
664 if (r < 0)
665 goto exit;
666
667 if (nfcid2_skb->len > NFC_SENSF_RES_MAXSIZE) {
668 r = -EPROTO;
669 goto exit;
670 }
671
672 /*
673 * - After the recepton of polling response for type F frame
674 * at 212 or 424 Kbit/s, NFCID2 registry parameters will be
675 * updated.
676 * - After the reception of SEL_RES with NFCIP-1 compliant bit
677 * set for type A frame NFCID1 will be updated
678 */
679 if (nfcid2_skb->len > 0) {
680 /* P2P in type F */
681 memcpy(target->sensf_res, nfcid2_skb->data,
682 nfcid2_skb->len);
683 target->sensf_res_len = nfcid2_skb->len;
684 /* NFC Forum Digital Protocol Table 44 */
685 if (target->sensf_res[0] == 0x01 &&
686 target->sensf_res[1] == 0xfe)
687 target->supported_protocols =
688 NFC_PROTO_NFC_DEP_MASK;
689 else
690 target->supported_protocols =
691 NFC_PROTO_FELICA_MASK;
692 } else {
693 /* P2P in type A */
694 r = nfc_hci_get_param(hdev, ST21NFCA_RF_READER_F_GATE,
695 ST21NFCA_RF_READER_F_NFCID1,
696 &nfcid1_skb);
697 if (r < 0)
698 goto exit;
699
700 if (nfcid1_skb->len > NFC_NFCID1_MAXSIZE) {
701 r = -EPROTO;
702 goto exit;
703 }
704 memcpy(target->sensf_res, nfcid1_skb->data,
705 nfcid1_skb->len);
706 target->sensf_res_len = nfcid1_skb->len;
707 target->supported_protocols = NFC_PROTO_NFC_DEP_MASK;
708 }
709 target->hci_reader_gate = ST21NFCA_RF_READER_F_GATE;
710 }
711 r = 1;
712exit:
713 kfree_skb(nfcid2_skb);
714 return r;
715}
716
508#define ST21NFCA_CB_TYPE_READER_ISO15693 1 717#define ST21NFCA_CB_TYPE_READER_ISO15693 1
509static void st21nfca_hci_data_exchange_cb(void *context, struct sk_buff *skb, 718static void st21nfca_hci_data_exchange_cb(void *context, struct sk_buff *skb,
510 int err) 719 int err)
@@ -541,6 +750,9 @@ static int st21nfca_hci_im_transceive(struct nfc_hci_dev *hdev,
541 750
542 switch (target->hci_reader_gate) { 751 switch (target->hci_reader_gate) {
543 case ST21NFCA_RF_READER_F_GATE: 752 case ST21NFCA_RF_READER_F_GATE:
753 if (target->supported_protocols == NFC_PROTO_NFC_DEP_MASK)
754 return st21nfca_im_send_dep_req(hdev, skb);
755
544 *skb_push(skb, 1) = 0x1a; 756 *skb_push(skb, 1) = 0x1a;
545 return nfc_hci_send_cmd_async(hdev, target->hci_reader_gate, 757 return nfc_hci_send_cmd_async(hdev, target->hci_reader_gate,
546 ST21NFCA_WR_XCHG_DATA, skb->data, 758 ST21NFCA_WR_XCHG_DATA, skb->data,
@@ -569,6 +781,11 @@ static int st21nfca_hci_im_transceive(struct nfc_hci_dev *hdev,
569 } 781 }
570} 782}
571 783
784static int st21nfca_hci_tm_send(struct nfc_hci_dev *hdev, struct sk_buff *skb)
785{
786 return st21nfca_tm_send_dep_res(hdev, skb);
787}
788
572static int st21nfca_hci_check_presence(struct nfc_hci_dev *hdev, 789static int st21nfca_hci_check_presence(struct nfc_hci_dev *hdev,
573 struct nfc_target *target) 790 struct nfc_target *target)
574{ 791{
@@ -594,6 +811,50 @@ static int st21nfca_hci_check_presence(struct nfc_hci_dev *hdev,
594 } 811 }
595} 812}
596 813
814/*
815 * Returns:
816 * <= 0: driver handled the event, skb consumed
817 * 1: driver does not handle the event, please do standard processing
818 */
819static int st21nfca_hci_event_received(struct nfc_hci_dev *hdev, u8 gate,
820 u8 event, struct sk_buff *skb)
821{
822 int r;
823 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
824
825 pr_debug("hci event: %d\n", event);
826
827 switch (event) {
828 case ST21NFCA_EVT_CARD_ACTIVATED:
829 if (gate == ST21NFCA_RF_CARD_F_GATE)
830 info->dep_info.curr_nfc_dep_pni = 0;
831 break;
832 case ST21NFCA_EVT_CARD_DEACTIVATED:
833 break;
834 case ST21NFCA_EVT_FIELD_ON:
835 break;
836 case ST21NFCA_EVT_FIELD_OFF:
837 break;
838 case ST21NFCA_EVT_SEND_DATA:
839 if (gate == ST21NFCA_RF_CARD_F_GATE) {
840 r = st21nfca_tm_event_send_data(hdev, skb, gate);
841 if (r < 0)
842 goto exit;
843 return 0;
844 } else {
845 info->dep_info.curr_nfc_dep_pni = 0;
846 return 1;
847 }
848 break;
849 default:
850 return 1;
851 }
852 kfree_skb(skb);
853 return 0;
854exit:
855 return r;
856}
857
597static struct nfc_hci_ops st21nfca_hci_ops = { 858static struct nfc_hci_ops st21nfca_hci_ops = {
598 .open = st21nfca_hci_open, 859 .open = st21nfca_hci_open,
599 .close = st21nfca_hci_close, 860 .close = st21nfca_hci_close,
@@ -601,9 +862,15 @@ static struct nfc_hci_ops st21nfca_hci_ops = {
601 .hci_ready = st21nfca_hci_ready, 862 .hci_ready = st21nfca_hci_ready,
602 .xmit = st21nfca_hci_xmit, 863 .xmit = st21nfca_hci_xmit,
603 .start_poll = st21nfca_hci_start_poll, 864 .start_poll = st21nfca_hci_start_poll,
865 .stop_poll = st21nfca_hci_stop_poll,
866 .dep_link_up = st21nfca_hci_dep_link_up,
867 .dep_link_down = st21nfca_hci_dep_link_down,
604 .target_from_gate = st21nfca_hci_target_from_gate, 868 .target_from_gate = st21nfca_hci_target_from_gate,
869 .complete_target_discovered = st21nfca_hci_complete_target_discovered,
605 .im_transceive = st21nfca_hci_im_transceive, 870 .im_transceive = st21nfca_hci_im_transceive,
871 .tm_send = st21nfca_hci_tm_send,
606 .check_presence = st21nfca_hci_check_presence, 872 .check_presence = st21nfca_hci_check_presence,
873 .event_received = st21nfca_hci_event_received,
607}; 874};
608 875
609int st21nfca_hci_probe(void *phy_id, struct nfc_phy_ops *phy_ops, 876int st21nfca_hci_probe(void *phy_id, struct nfc_phy_ops *phy_ops,
@@ -648,7 +915,8 @@ int st21nfca_hci_probe(void *phy_id, struct nfc_phy_ops *phy_ops,
648 NFC_PROTO_FELICA_MASK | 915 NFC_PROTO_FELICA_MASK |
649 NFC_PROTO_ISO14443_MASK | 916 NFC_PROTO_ISO14443_MASK |
650 NFC_PROTO_ISO14443_B_MASK | 917 NFC_PROTO_ISO14443_B_MASK |
651 NFC_PROTO_ISO15693_MASK; 918 NFC_PROTO_ISO15693_MASK |
919 NFC_PROTO_NFC_DEP_MASK;
652 920
653 set_bit(NFC_HCI_QUIRK_SHORT_CLEAR, &quirks); 921 set_bit(NFC_HCI_QUIRK_SHORT_CLEAR, &quirks);
654 922
@@ -671,6 +939,7 @@ int st21nfca_hci_probe(void *phy_id, struct nfc_phy_ops *phy_ops,
671 goto err_regdev; 939 goto err_regdev;
672 940
673 *hdev = info->hdev; 941 *hdev = info->hdev;
942 st21nfca_dep_init(info->hdev);
674 943
675 return 0; 944 return 0;
676 945
@@ -688,6 +957,7 @@ void st21nfca_hci_remove(struct nfc_hci_dev *hdev)
688{ 957{
689 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev); 958 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
690 959
960 st21nfca_dep_deinit(hdev);
691 nfc_hci_unregister_device(hdev); 961 nfc_hci_unregister_device(hdev);
692 nfc_hci_free_device(hdev); 962 nfc_hci_free_device(hdev);
693 kfree(info); 963 kfree(info);
diff --git a/drivers/nfc/st21nfca/st21nfca.h b/drivers/nfc/st21nfca/st21nfca.h
index 334cd90bcc8c..96fe5a62dc0d 100644
--- a/drivers/nfc/st21nfca/st21nfca.h
+++ b/drivers/nfc/st21nfca/st21nfca.h
@@ -19,6 +19,8 @@
19 19
20#include <net/nfc/hci.h> 20#include <net/nfc/hci.h>
21 21
22#include "st21nfca_dep.h"
23
22#define HCI_MODE 0 24#define HCI_MODE 0
23 25
24/* framing in HCI mode */ 26/* framing in HCI mode */
@@ -73,7 +75,8 @@ struct st21nfca_hci_info {
73 data_exchange_cb_t async_cb; 75 data_exchange_cb_t async_cb;
74 void *async_cb_context; 76 void *async_cb_context;
75 77
76} __packed; 78 struct st21nfca_dep_info dep_info;
79};
77 80
78/* Reader RF commands */ 81/* Reader RF commands */
79#define ST21NFCA_WR_XCHG_DATA 0x10 82#define ST21NFCA_WR_XCHG_DATA 0x10
@@ -83,5 +86,26 @@ struct st21nfca_hci_info {
83#define ST21NFCA_RF_READER_F_DATARATE_106 0x01 86#define ST21NFCA_RF_READER_F_DATARATE_106 0x01
84#define ST21NFCA_RF_READER_F_DATARATE_212 0x02 87#define ST21NFCA_RF_READER_F_DATARATE_212 0x02
85#define ST21NFCA_RF_READER_F_DATARATE_424 0x04 88#define ST21NFCA_RF_READER_F_DATARATE_424 0x04
89#define ST21NFCA_RF_READER_F_POL_REQ 0x02
90#define ST21NFCA_RF_READER_F_POL_REQ_DEFAULT 0xffff0000
91#define ST21NFCA_RF_READER_F_NFCID2 0x03
92#define ST21NFCA_RF_READER_F_NFCID1 0x04
93#define ST21NFCA_RF_READER_F_SENS_RES 0x05
94
95#define ST21NFCA_RF_CARD_F_GATE 0x24
96#define ST21NFCA_RF_CARD_F_MODE 0x01
97#define ST21NFCA_RF_CARD_F_NFCID2_LIST 0x04
98#define ST21NFCA_RF_CARD_F_NFCID1 0x05
99#define ST21NFCA_RF_CARD_F_SENS_RES 0x06
100#define ST21NFCA_RF_CARD_F_SEL_RES 0x07
101#define ST21NFCA_RF_CARD_F_DATARATE 0x08
102#define ST21NFCA_RF_CARD_F_DATARATE_106 0x00
103#define ST21NFCA_RF_CARD_F_DATARATE_212_424 0x01
104
105#define ST21NFCA_EVT_SEND_DATA 0x10
106#define ST21NFCA_EVT_FIELD_ON 0x11
107#define ST21NFCA_EVT_CARD_DEACTIVATED 0x12
108#define ST21NFCA_EVT_CARD_ACTIVATED 0x13
109#define ST21NFCA_EVT_FIELD_OFF 0x14
86 110
87#endif /* __LOCAL_ST21NFCA_H_ */ 111#endif /* __LOCAL_ST21NFCA_H_ */
diff --git a/drivers/nfc/st21nfca/st21nfca_dep.c b/drivers/nfc/st21nfca/st21nfca_dep.c
new file mode 100644
index 000000000000..b2d9957b57f8
--- /dev/null
+++ b/drivers/nfc/st21nfca/st21nfca_dep.c
@@ -0,0 +1,661 @@
1/*
2 * Copyright (C) 2014 STMicroelectronics SAS. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include <net/nfc/hci.h>
18
19#include "st21nfca.h"
20#include "st21nfca_dep.h"
21
22#define ST21NFCA_NFCIP1_INITIATOR 0x00
23#define ST21NFCA_NFCIP1_REQ 0xd4
24#define ST21NFCA_NFCIP1_RES 0xd5
25#define ST21NFCA_NFCIP1_ATR_REQ 0x00
26#define ST21NFCA_NFCIP1_ATR_RES 0x01
27#define ST21NFCA_NFCIP1_PSL_REQ 0x04
28#define ST21NFCA_NFCIP1_PSL_RES 0x05
29#define ST21NFCA_NFCIP1_DEP_REQ 0x06
30#define ST21NFCA_NFCIP1_DEP_RES 0x07
31
32#define ST21NFCA_NFC_DEP_PFB_PNI(pfb) ((pfb) & 0x03)
33#define ST21NFCA_NFC_DEP_PFB_TYPE(pfb) ((pfb) & 0xE0)
34#define ST21NFCA_NFC_DEP_PFB_IS_TIMEOUT(pfb) \
35 ((pfb) & ST21NFCA_NFC_DEP_PFB_TIMEOUT_BIT)
36#define ST21NFCA_NFC_DEP_DID_BIT_SET(pfb) ((pfb) & 0x04)
37#define ST21NFCA_NFC_DEP_NAD_BIT_SET(pfb) ((pfb) & 0x08)
38#define ST21NFCA_NFC_DEP_PFB_TIMEOUT_BIT 0x10
39
40#define ST21NFCA_NFC_DEP_PFB_IS_TIMEOUT(pfb) \
41 ((pfb) & ST21NFCA_NFC_DEP_PFB_TIMEOUT_BIT)
42
43#define ST21NFCA_NFC_DEP_PFB_I_PDU 0x00
44#define ST21NFCA_NFC_DEP_PFB_ACK_NACK_PDU 0x40
45#define ST21NFCA_NFC_DEP_PFB_SUPERVISOR_PDU 0x80
46
47#define ST21NFCA_ATR_REQ_MIN_SIZE 17
48#define ST21NFCA_ATR_REQ_MAX_SIZE 65
49#define ST21NFCA_LR_BITS_PAYLOAD_SIZE_254B 0x30
50#define ST21NFCA_GB_BIT 0x02
51
52#define ST21NFCA_EVT_CARD_F_BITRATE 0x16
53#define ST21NFCA_EVT_READER_F_BITRATE 0x13
54#define ST21NFCA_PSL_REQ_SEND_SPEED(brs) (brs & 0x38)
55#define ST21NFCA_PSL_REQ_RECV_SPEED(brs) (brs & 0x07)
56#define ST21NFCA_PP2LRI(pp) ((pp & 0x30) >> 4)
57#define ST21NFCA_CARD_BITRATE_212 0x01
58#define ST21NFCA_CARD_BITRATE_424 0x02
59
60#define ST21NFCA_DEFAULT_TIMEOUT 0x0a
61
62
63#define PROTOCOL_ERR(req) pr_err("%d: ST21NFCA Protocol error: %s\n", \
64 __LINE__, req)
65
66struct st21nfca_atr_req {
67 u8 length;
68 u8 cmd0;
69 u8 cmd1;
70 u8 nfcid3[NFC_NFCID3_MAXSIZE];
71 u8 did;
72 u8 bsi;
73 u8 bri;
74 u8 ppi;
75 u8 gbi[0];
76} __packed;
77
78struct st21nfca_atr_res {
79 u8 length;
80 u8 cmd0;
81 u8 cmd1;
82 u8 nfcid3[NFC_NFCID3_MAXSIZE];
83 u8 did;
84 u8 bsi;
85 u8 bri;
86 u8 to;
87 u8 ppi;
88 u8 gbi[0];
89} __packed;
90
91struct st21nfca_psl_req {
92 u8 length;
93 u8 cmd0;
94 u8 cmd1;
95 u8 did;
96 u8 brs;
97 u8 fsl;
98} __packed;
99
100struct st21nfca_psl_res {
101 u8 length;
102 u8 cmd0;
103 u8 cmd1;
104 u8 did;
105} __packed;
106
107struct st21nfca_dep_req_res {
108 u8 length;
109 u8 cmd0;
110 u8 cmd1;
111 u8 pfb;
112 u8 did;
113 u8 nad;
114} __packed;
115
116static void st21nfca_tx_work(struct work_struct *work)
117{
118 struct st21nfca_hci_info *info = container_of(work,
119 struct st21nfca_hci_info,
120 dep_info.tx_work);
121
122 struct nfc_dev *dev;
123 struct sk_buff *skb;
124 if (info) {
125 dev = info->hdev->ndev;
126 skb = info->dep_info.tx_pending;
127
128 device_lock(&dev->dev);
129
130 nfc_hci_send_cmd_async(info->hdev, ST21NFCA_RF_READER_F_GATE,
131 ST21NFCA_WR_XCHG_DATA,
132 skb->data, skb->len,
133 info->async_cb, info);
134 device_unlock(&dev->dev);
135 kfree_skb(skb);
136 }
137}
138
139static void st21nfca_im_send_pdu(struct st21nfca_hci_info *info,
140 struct sk_buff *skb)
141{
142 info->dep_info.tx_pending = skb;
143 schedule_work(&info->dep_info.tx_work);
144}
145
146static int st21nfca_tm_send_atr_res(struct nfc_hci_dev *hdev,
147 struct st21nfca_atr_req *atr_req)
148{
149 struct st21nfca_atr_res *atr_res;
150 struct sk_buff *skb;
151 size_t gb_len;
152 int r;
153 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
154
155 gb_len = atr_req->length - sizeof(struct st21nfca_atr_req);
156 skb = alloc_skb(atr_req->length + 1, GFP_KERNEL);
157 if (!skb)
158 return -ENOMEM;
159
160 skb_put(skb, sizeof(struct st21nfca_atr_res));
161
162 atr_res = (struct st21nfca_atr_res *)skb->data;
163 memset(atr_res, 0, sizeof(struct st21nfca_atr_res));
164
165 atr_res->length = atr_req->length + 1;
166 atr_res->cmd0 = ST21NFCA_NFCIP1_RES;
167 atr_res->cmd1 = ST21NFCA_NFCIP1_ATR_RES;
168
169 memcpy(atr_res->nfcid3, atr_req->nfcid3, 6);
170 atr_res->bsi = 0x00;
171 atr_res->bri = 0x00;
172 atr_res->to = ST21NFCA_DEFAULT_TIMEOUT;
173 atr_res->ppi = ST21NFCA_LR_BITS_PAYLOAD_SIZE_254B;
174
175 if (gb_len) {
176 skb_put(skb, gb_len);
177
178 atr_res->ppi |= ST21NFCA_GB_BIT;
179 memcpy(atr_res->gbi, atr_req->gbi, gb_len);
180 r = nfc_set_remote_general_bytes(hdev->ndev, atr_res->gbi,
181 gb_len);
182 if (r < 0)
183 return r;
184 }
185
186 info->dep_info.curr_nfc_dep_pni = 0;
187
188 return nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
189 ST21NFCA_EVT_SEND_DATA, skb->data, skb->len);
190}
191
192static int st21nfca_tm_recv_atr_req(struct nfc_hci_dev *hdev,
193 struct sk_buff *skb)
194{
195 struct st21nfca_atr_req *atr_req;
196 size_t gb_len;
197 int r;
198
199 skb_trim(skb, skb->len - 1);
200 if (IS_ERR(skb)) {
201 r = PTR_ERR(skb);
202 goto exit;
203 }
204
205 if (!skb->len) {
206 r = -EIO;
207 goto exit;
208 }
209
210 if (skb->len < ST21NFCA_ATR_REQ_MIN_SIZE) {
211 r = -EPROTO;
212 goto exit;
213 }
214
215 atr_req = (struct st21nfca_atr_req *)skb->data;
216
217 r = st21nfca_tm_send_atr_res(hdev, atr_req);
218 if (r)
219 goto exit;
220
221 gb_len = skb->len - sizeof(struct st21nfca_atr_req);
222
223 r = nfc_tm_activated(hdev->ndev, NFC_PROTO_NFC_DEP_MASK,
224 NFC_COMM_PASSIVE, atr_req->gbi, gb_len);
225 if (r)
226 goto exit;
227
228 r = 0;
229
230exit:
231 return r;
232}
233
234static int st21nfca_tm_send_psl_res(struct nfc_hci_dev *hdev,
235 struct st21nfca_psl_req *psl_req)
236{
237 struct st21nfca_psl_res *psl_res;
238 struct sk_buff *skb;
239 u8 bitrate[2] = {0, 0};
240
241 int r;
242
243 skb = alloc_skb(sizeof(struct st21nfca_psl_res), GFP_KERNEL);
244 if (!skb)
245 return -ENOMEM;
246 skb_put(skb, sizeof(struct st21nfca_psl_res));
247
248 psl_res = (struct st21nfca_psl_res *)skb->data;
249
250 psl_res->length = sizeof(struct st21nfca_psl_res);
251 psl_res->cmd0 = ST21NFCA_NFCIP1_RES;
252 psl_res->cmd1 = ST21NFCA_NFCIP1_PSL_RES;
253 psl_res->did = psl_req->did;
254
255 r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
256 ST21NFCA_EVT_SEND_DATA, skb->data, skb->len);
257
258 /*
259 * ST21NFCA only support P2P passive.
260 * PSL_REQ BRS value != 0 has only a meaning to
261 * change technology to type F.
262 * We change to BITRATE 424Kbits.
263 * In other case switch to BITRATE 106Kbits.
264 */
265 if (ST21NFCA_PSL_REQ_SEND_SPEED(psl_req->brs) &&
266 ST21NFCA_PSL_REQ_RECV_SPEED(psl_req->brs)) {
267 bitrate[0] = ST21NFCA_CARD_BITRATE_424;
268 bitrate[1] = ST21NFCA_CARD_BITRATE_424;
269 }
270
271 /* Send an event to change bitrate change event to card f */
272 return nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
273 ST21NFCA_EVT_CARD_F_BITRATE, bitrate, 2);
274}
275
276static int st21nfca_tm_recv_psl_req(struct nfc_hci_dev *hdev,
277 struct sk_buff *skb)
278{
279 struct st21nfca_psl_req *psl_req;
280 int r;
281
282 skb_trim(skb, skb->len - 1);
283 if (IS_ERR(skb)) {
284 r = PTR_ERR(skb);
285 skb = NULL;
286 goto exit;
287 }
288
289 if (!skb->len) {
290 r = -EIO;
291 goto exit;
292 }
293
294 psl_req = (struct st21nfca_psl_req *)skb->data;
295
296 if (skb->len < sizeof(struct st21nfca_psl_req)) {
297 r = -EIO;
298 goto exit;
299 }
300
301 r = st21nfca_tm_send_psl_res(hdev, psl_req);
302exit:
303 return r;
304}
305
306int st21nfca_tm_send_dep_res(struct nfc_hci_dev *hdev, struct sk_buff *skb)
307{
308 int r;
309 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
310
311 *skb_push(skb, 1) = info->dep_info.curr_nfc_dep_pni;
312 *skb_push(skb, 1) = ST21NFCA_NFCIP1_DEP_RES;
313 *skb_push(skb, 1) = ST21NFCA_NFCIP1_RES;
314 *skb_push(skb, 1) = skb->len;
315
316 r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
317 ST21NFCA_EVT_SEND_DATA, skb->data, skb->len);
318 kfree_skb(skb);
319
320 return r;
321}
322EXPORT_SYMBOL(st21nfca_tm_send_dep_res);
323
324static int st21nfca_tm_recv_dep_req(struct nfc_hci_dev *hdev,
325 struct sk_buff *skb)
326{
327 struct st21nfca_dep_req_res *dep_req;
328 u8 size;
329 int r;
330 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
331
332 skb_trim(skb, skb->len - 1);
333 if (IS_ERR(skb)) {
334 r = PTR_ERR(skb);
335 skb = NULL;
336 goto exit;
337 }
338
339 size = 4;
340
341 dep_req = (struct st21nfca_dep_req_res *)skb->data;
342 if (skb->len < size) {
343 r = -EIO;
344 goto exit;
345 }
346
347 if (ST21NFCA_NFC_DEP_DID_BIT_SET(dep_req->pfb))
348 size++;
349 if (ST21NFCA_NFC_DEP_NAD_BIT_SET(dep_req->pfb))
350 size++;
351
352 if (skb->len < size) {
353 r = -EIO;
354 goto exit;
355 }
356
357 /* Receiving DEP_REQ - Decoding */
358 switch (ST21NFCA_NFC_DEP_PFB_TYPE(dep_req->pfb)) {
359 case ST21NFCA_NFC_DEP_PFB_I_PDU:
360 info->dep_info.curr_nfc_dep_pni =
361 ST21NFCA_NFC_DEP_PFB_PNI(dep_req->pfb);
362 break;
363 case ST21NFCA_NFC_DEP_PFB_ACK_NACK_PDU:
364 pr_err("Received a ACK/NACK PDU\n");
365 break;
366 case ST21NFCA_NFC_DEP_PFB_SUPERVISOR_PDU:
367 pr_err("Received a SUPERVISOR PDU\n");
368 break;
369 }
370
371 if (IS_ERR(skb)) {
372 r = PTR_ERR(skb);
373 skb = NULL;
374 goto exit;
375 }
376
377 skb_pull(skb, size);
378
379 return nfc_tm_data_received(hdev->ndev, skb);
380exit:
381 return r;
382}
383
384int st21nfca_tm_event_send_data(struct nfc_hci_dev *hdev, struct sk_buff *skb,
385 u8 gate)
386{
387 u8 cmd0, cmd1;
388 int r;
389
390 cmd0 = skb->data[1];
391 switch (cmd0) {
392 case ST21NFCA_NFCIP1_REQ:
393 cmd1 = skb->data[2];
394 switch (cmd1) {
395 case ST21NFCA_NFCIP1_ATR_REQ:
396 r = st21nfca_tm_recv_atr_req(hdev, skb);
397 break;
398 case ST21NFCA_NFCIP1_PSL_REQ:
399 r = st21nfca_tm_recv_psl_req(hdev, skb);
400 break;
401 case ST21NFCA_NFCIP1_DEP_REQ:
402 r = st21nfca_tm_recv_dep_req(hdev, skb);
403 break;
404 default:
405 return 1;
406 }
407 default:
408 return 1;
409 }
410 return r;
411}
412EXPORT_SYMBOL(st21nfca_tm_event_send_data);
413
414static void st21nfca_im_send_psl_req(struct nfc_hci_dev *hdev, u8 did, u8 bsi,
415 u8 bri, u8 lri)
416{
417 struct sk_buff *skb;
418 struct st21nfca_psl_req *psl_req;
419 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
420
421 skb =
422 alloc_skb(sizeof(struct st21nfca_psl_req) + 1, GFP_KERNEL);
423 if (!skb)
424 return;
425 skb_reserve(skb, 1);
426
427 skb_put(skb, sizeof(struct st21nfca_psl_req));
428 psl_req = (struct st21nfca_psl_req *) skb->data;
429
430 psl_req->length = sizeof(struct st21nfca_psl_req);
431 psl_req->cmd0 = ST21NFCA_NFCIP1_REQ;
432 psl_req->cmd1 = ST21NFCA_NFCIP1_PSL_REQ;
433 psl_req->did = did;
434 psl_req->brs = (0x30 & bsi << 4) | (bri & 0x03);
435 psl_req->fsl = lri;
436
437 *skb_push(skb, 1) = info->dep_info.to | 0x10;
438
439 st21nfca_im_send_pdu(info, skb);
440
441 kfree_skb(skb);
442}
443
444#define ST21NFCA_CB_TYPE_READER_F 1
445static void st21nfca_im_recv_atr_res_cb(void *context, struct sk_buff *skb,
446 int err)
447{
448 struct st21nfca_hci_info *info = context;
449 struct st21nfca_atr_res *atr_res;
450 int r;
451
452 if (err != 0)
453 return;
454
455 if (IS_ERR(skb))
456 return;
457
458 switch (info->async_cb_type) {
459 case ST21NFCA_CB_TYPE_READER_F:
460 skb_trim(skb, skb->len - 1);
461 atr_res = (struct st21nfca_atr_res *)skb->data;
462 r = nfc_set_remote_general_bytes(info->hdev->ndev,
463 atr_res->gbi,
464 skb->len - sizeof(struct st21nfca_atr_res));
465 if (r < 0)
466 return;
467
468 if (atr_res->to >= 0x0e)
469 info->dep_info.to = 0x0e;
470 else
471 info->dep_info.to = atr_res->to + 1;
472
473 info->dep_info.to |= 0x10;
474
475 r = nfc_dep_link_is_up(info->hdev->ndev, info->dep_info.idx,
476 NFC_COMM_PASSIVE, NFC_RF_INITIATOR);
477 if (r < 0)
478 return;
479
480 info->dep_info.curr_nfc_dep_pni = 0;
481 if (ST21NFCA_PP2LRI(atr_res->ppi) != info->dep_info.lri)
482 st21nfca_im_send_psl_req(info->hdev, atr_res->did,
483 atr_res->bsi, atr_res->bri,
484 ST21NFCA_PP2LRI(atr_res->ppi));
485 break;
486 default:
487 if (err == 0)
488 kfree_skb(skb);
489 break;
490 }
491}
492
493int st21nfca_im_send_atr_req(struct nfc_hci_dev *hdev, u8 *gb, size_t gb_len)
494{
495 struct sk_buff *skb;
496 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
497 struct st21nfca_atr_req *atr_req;
498 struct nfc_target *target;
499 uint size;
500
501 info->dep_info.to = ST21NFCA_DEFAULT_TIMEOUT;
502 size = ST21NFCA_ATR_REQ_MIN_SIZE + gb_len;
503 if (size > ST21NFCA_ATR_REQ_MAX_SIZE) {
504 PROTOCOL_ERR("14.6.1.1");
505 return -EINVAL;
506 }
507
508 skb =
509 alloc_skb(sizeof(struct st21nfca_atr_req) + gb_len + 1, GFP_KERNEL);
510 if (!skb)
511 return -ENOMEM;
512
513 skb_reserve(skb, 1);
514
515 skb_put(skb, sizeof(struct st21nfca_atr_req));
516
517 atr_req = (struct st21nfca_atr_req *)skb->data;
518 memset(atr_req, 0, sizeof(struct st21nfca_atr_req));
519
520 atr_req->cmd0 = ST21NFCA_NFCIP1_REQ;
521 atr_req->cmd1 = ST21NFCA_NFCIP1_ATR_REQ;
522 memset(atr_req->nfcid3, 0, NFC_NFCID3_MAXSIZE);
523 target = hdev->ndev->targets;
524
525 if (target->sensf_res)
526 memcpy(atr_req->nfcid3, target->sensf_res,
527 target->sensf_res_len);
528 else
529 get_random_bytes(atr_req->nfcid3, NFC_NFCID3_MAXSIZE);
530
531 atr_req->did = 0x0;
532
533 atr_req->bsi = 0x00;
534 atr_req->bri = 0x00;
535 atr_req->ppi = ST21NFCA_LR_BITS_PAYLOAD_SIZE_254B;
536 if (gb_len) {
537 atr_req->ppi |= ST21NFCA_GB_BIT;
538 memcpy(skb_put(skb, gb_len), gb, gb_len);
539 }
540 atr_req->length = sizeof(struct st21nfca_atr_req) + hdev->gb_len;
541
542 *skb_push(skb, 1) = info->dep_info.to | 0x10; /* timeout */
543
544 info->async_cb_type = ST21NFCA_CB_TYPE_READER_F;
545 info->async_cb_context = info;
546 info->async_cb = st21nfca_im_recv_atr_res_cb;
547 info->dep_info.bri = atr_req->bri;
548 info->dep_info.bsi = atr_req->bsi;
549 info->dep_info.lri = ST21NFCA_PP2LRI(atr_req->ppi);
550
551 return nfc_hci_send_cmd_async(hdev, ST21NFCA_RF_READER_F_GATE,
552 ST21NFCA_WR_XCHG_DATA, skb->data,
553 skb->len, info->async_cb, info);
554}
555EXPORT_SYMBOL(st21nfca_im_send_atr_req);
556
557static void st21nfca_im_recv_dep_res_cb(void *context, struct sk_buff *skb,
558 int err)
559{
560 struct st21nfca_hci_info *info = context;
561 struct st21nfca_dep_req_res *dep_res;
562
563 int size;
564
565 if (err != 0)
566 return;
567
568 if (IS_ERR(skb))
569 return;
570
571 switch (info->async_cb_type) {
572 case ST21NFCA_CB_TYPE_READER_F:
573 dep_res = (struct st21nfca_dep_req_res *)skb->data;
574
575 size = 3;
576 if (skb->len < size)
577 goto exit;
578
579 if (ST21NFCA_NFC_DEP_DID_BIT_SET(dep_res->pfb))
580 size++;
581 if (ST21NFCA_NFC_DEP_NAD_BIT_SET(dep_res->pfb))
582 size++;
583
584 if (skb->len < size)
585 goto exit;
586
587 skb_trim(skb, skb->len - 1);
588
589 /* Receiving DEP_REQ - Decoding */
590 switch (ST21NFCA_NFC_DEP_PFB_TYPE(dep_res->pfb)) {
591 case ST21NFCA_NFC_DEP_PFB_ACK_NACK_PDU:
592 pr_err("Received a ACK/NACK PDU\n");
593 case ST21NFCA_NFC_DEP_PFB_I_PDU:
594 info->dep_info.curr_nfc_dep_pni =
595 ST21NFCA_NFC_DEP_PFB_PNI(dep_res->pfb + 1);
596 size++;
597 skb_pull(skb, size);
598 nfc_tm_data_received(info->hdev->ndev, skb);
599 break;
600 case ST21NFCA_NFC_DEP_PFB_SUPERVISOR_PDU:
601 pr_err("Received a SUPERVISOR PDU\n");
602 skb_pull(skb, size);
603 *skb_push(skb, 1) = ST21NFCA_NFCIP1_DEP_REQ;
604 *skb_push(skb, 1) = ST21NFCA_NFCIP1_REQ;
605 *skb_push(skb, 1) = skb->len;
606 *skb_push(skb, 1) = info->dep_info.to | 0x10;
607
608 st21nfca_im_send_pdu(info, skb);
609 break;
610 }
611
612 return;
613 default:
614 break;
615 }
616
617exit:
618 if (err == 0)
619 kfree_skb(skb);
620}
621
622int st21nfca_im_send_dep_req(struct nfc_hci_dev *hdev, struct sk_buff *skb)
623{
624 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
625
626 info->async_cb_type = ST21NFCA_CB_TYPE_READER_F;
627 info->async_cb_context = info;
628 info->async_cb = st21nfca_im_recv_dep_res_cb;
629
630 *skb_push(skb, 1) = info->dep_info.curr_nfc_dep_pni;
631 *skb_push(skb, 1) = ST21NFCA_NFCIP1_DEP_REQ;
632 *skb_push(skb, 1) = ST21NFCA_NFCIP1_REQ;
633 *skb_push(skb, 1) = skb->len;
634
635 *skb_push(skb, 1) = info->dep_info.to | 0x10;
636
637 return nfc_hci_send_cmd_async(hdev, ST21NFCA_RF_READER_F_GATE,
638 ST21NFCA_WR_XCHG_DATA,
639 skb->data, skb->len,
640 info->async_cb, info);
641}
642EXPORT_SYMBOL(st21nfca_im_send_dep_req);
643
644void st21nfca_dep_init(struct nfc_hci_dev *hdev)
645{
646 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
647
648 INIT_WORK(&info->dep_info.tx_work, st21nfca_tx_work);
649 info->dep_info.curr_nfc_dep_pni = 0;
650 info->dep_info.idx = 0;
651 info->dep_info.to = ST21NFCA_DEFAULT_TIMEOUT;
652}
653EXPORT_SYMBOL(st21nfca_dep_init);
654
655void st21nfca_dep_deinit(struct nfc_hci_dev *hdev)
656{
657 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
658
659 cancel_work_sync(&info->dep_info.tx_work);
660}
661EXPORT_SYMBOL(st21nfca_dep_deinit);
diff --git a/drivers/nfc/st21nfca/st21nfca_dep.h b/drivers/nfc/st21nfca/st21nfca_dep.h
new file mode 100644
index 000000000000..ca213dee9c6e
--- /dev/null
+++ b/drivers/nfc/st21nfca/st21nfca_dep.h
@@ -0,0 +1,43 @@
1/*
2 * Copyright (C) 2014 STMicroelectronics SAS. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, see <http://www.gnu.org/licenses/>.
15 */
16
17#ifndef __ST21NFCA_DEP_H
18#define __ST21NFCA_DEP_H
19
20#include <linux/skbuff.h>
21#include <linux/workqueue.h>
22
23struct st21nfca_dep_info {
24 struct sk_buff *tx_pending;
25 struct work_struct tx_work;
26 u8 curr_nfc_dep_pni;
27 u32 idx;
28 u8 to;
29 u8 did;
30 u8 bsi;
31 u8 bri;
32 u8 lri;
33} __packed;
34
35int st21nfca_tm_event_send_data(struct nfc_hci_dev *hdev, struct sk_buff *skb,
36 u8 gate);
37int st21nfca_tm_send_dep_res(struct nfc_hci_dev *hdev, struct sk_buff *skb);
38
39int st21nfca_im_send_atr_req(struct nfc_hci_dev *hdev, u8 *gb, size_t gb_len);
40int st21nfca_im_send_dep_req(struct nfc_hci_dev *hdev, struct sk_buff *skb);
41void st21nfca_dep_init(struct nfc_hci_dev *hdev);
42void st21nfca_dep_deinit(struct nfc_hci_dev *hdev);
43#endif /* __ST21NFCA_DEP_H */
diff --git a/drivers/nfc/st21nfcb/Kconfig b/drivers/nfc/st21nfcb/Kconfig
new file mode 100644
index 000000000000..e0322dd03a70
--- /dev/null
+++ b/drivers/nfc/st21nfcb/Kconfig
@@ -0,0 +1,22 @@
1config NFC_ST21NFCB
2 tristate "STMicroelectronics ST21NFCB NFC driver"
3 depends on NFC_NCI
4 default n
5 ---help---
6 STMicroelectronics ST21NFCB core driver. It implements the chipset
7 NCI logic and hooks into the NFC kernel APIs. Physical layers will
8 register against it.
9
10 To compile this driver as a module, choose m here. The module will
11 be called st21nfcb.
12 Say N if unsure.
13
14config NFC_ST21NFCB_I2C
15 tristate "NFC ST21NFCB i2c support"
16 depends on NFC_ST21NFCB && I2C
17 ---help---
18 This module adds support for the STMicroelectronics st21nfcb i2c interface.
19 Select this if your platform is using the i2c bus.
20
21 If you choose to build a module, it'll be called st21nfcb_i2c.
22 Say N if unsure.
diff --git a/drivers/nfc/st21nfcb/Makefile b/drivers/nfc/st21nfcb/Makefile
new file mode 100644
index 000000000000..13d9f03b2fea
--- /dev/null
+++ b/drivers/nfc/st21nfcb/Makefile
@@ -0,0 +1,8 @@
1#
2# Makefile for ST21NFCB NCI based NFC driver
3#
4
5st21nfcb_i2c-objs = i2c.o
6
7obj-$(CONFIG_NFC_ST21NFCB) += st21nfcb.o ndlc.o
8obj-$(CONFIG_NFC_ST21NFCB_I2C) += st21nfcb_i2c.o
diff --git a/drivers/nfc/st21nfcb/i2c.c b/drivers/nfc/st21nfcb/i2c.c
new file mode 100644
index 000000000000..8af880ead5db
--- /dev/null
+++ b/drivers/nfc/st21nfcb/i2c.c
@@ -0,0 +1,462 @@
1/*
2 * I2C Link Layer for ST21NFCB NCI based Driver
3 * Copyright (C) 2014 STMicroelectronics SAS. All rights reserved.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, see <http://www.gnu.org/licenses/>.
16 */
17
18#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
19
20#include <linux/crc-ccitt.h>
21#include <linux/module.h>
22#include <linux/i2c.h>
23#include <linux/gpio.h>
24#include <linux/of_irq.h>
25#include <linux/of_gpio.h>
26#include <linux/miscdevice.h>
27#include <linux/interrupt.h>
28#include <linux/delay.h>
29#include <linux/nfc.h>
30#include <linux/firmware.h>
31#include <linux/unaligned/access_ok.h>
32#include <linux/platform_data/st21nfcb.h>
33
34#include <net/nfc/nci.h>
35#include <net/nfc/llc.h>
36#include <net/nfc/nfc.h>
37
38#include "ndlc.h"
39
40#define DRIVER_DESC "NCI NFC driver for ST21NFCB"
41
42/* ndlc header */
43#define ST21NFCB_FRAME_HEADROOM 1
44#define ST21NFCB_FRAME_TAILROOM 0
45
46#define ST21NFCB_NCI_I2C_MIN_SIZE 4 /* PCB(1) + NCI Packet header(3) */
47#define ST21NFCB_NCI_I2C_MAX_SIZE 250 /* req 4.2.1 */
48
49#define ST21NFCB_NCI_I2C_DRIVER_NAME "st21nfcb_nci_i2c"
50
51static struct i2c_device_id st21nfcb_nci_i2c_id_table[] = {
52 {ST21NFCB_NCI_DRIVER_NAME, 0},
53 {}
54};
55MODULE_DEVICE_TABLE(i2c, st21nfcb_nci_i2c_id_table);
56
57struct st21nfcb_i2c_phy {
58 struct i2c_client *i2c_dev;
59 struct llt_ndlc *ndlc;
60
61 unsigned int gpio_irq;
62 unsigned int gpio_reset;
63 unsigned int irq_polarity;
64
65 int powered;
66
67 /*
68 * < 0 if hardware error occured (e.g. i2c err)
69 * and prevents normal operation.
70 */
71 int hard_fault;
72};
73
74#define I2C_DUMP_SKB(info, skb) \
75do { \
76 pr_debug("%s:\n", info); \
77 print_hex_dump(KERN_DEBUG, "i2c: ", DUMP_PREFIX_OFFSET, \
78 16, 1, (skb)->data, (skb)->len, 0); \
79} while (0)
80
81static int st21nfcb_nci_i2c_enable(void *phy_id)
82{
83 struct st21nfcb_i2c_phy *phy = phy_id;
84
85 gpio_set_value(phy->gpio_reset, 0);
86 usleep_range(10000, 15000);
87 gpio_set_value(phy->gpio_reset, 1);
88 phy->powered = 1;
89 usleep_range(80000, 85000);
90
91 return 0;
92}
93
94static void st21nfcb_nci_i2c_disable(void *phy_id)
95{
96 struct st21nfcb_i2c_phy *phy = phy_id;
97
98 pr_info("\n");
99
100 phy->powered = 0;
101 /* reset chip in order to flush clf */
102 gpio_set_value(phy->gpio_reset, 0);
103 usleep_range(10000, 15000);
104 gpio_set_value(phy->gpio_reset, 1);
105}
106
107static void st21nfcb_nci_remove_header(struct sk_buff *skb)
108{
109 skb_pull(skb, ST21NFCB_FRAME_HEADROOM);
110}
111
112/*
113 * Writing a frame must not return the number of written bytes.
114 * It must return either zero for success, or <0 for error.
115 * In addition, it must not alter the skb
116 */
117static int st21nfcb_nci_i2c_write(void *phy_id, struct sk_buff *skb)
118{
119 int r = -1;
120 struct st21nfcb_i2c_phy *phy = phy_id;
121 struct i2c_client *client = phy->i2c_dev;
122
123 I2C_DUMP_SKB("st21nfcb_nci_i2c_write", skb);
124
125 if (phy->hard_fault != 0)
126 return phy->hard_fault;
127
128 r = i2c_master_send(client, skb->data, skb->len);
129 if (r == -EREMOTEIO) { /* Retry, chip was in standby */
130 usleep_range(1000, 4000);
131 r = i2c_master_send(client, skb->data, skb->len);
132 }
133
134 if (r >= 0) {
135 if (r != skb->len)
136 r = -EREMOTEIO;
137 else
138 r = 0;
139 }
140
141 st21nfcb_nci_remove_header(skb);
142
143 return r;
144}
145
146/*
147 * Reads an ndlc frame and returns it in a newly allocated sk_buff.
148 * returns:
149 * frame size : if received frame is complete (find ST21NFCB_SOF_EOF at
150 * end of read)
151 * -EAGAIN : if received frame is incomplete (not find ST21NFCB_SOF_EOF
152 * at end of read)
153 * -EREMOTEIO : i2c read error (fatal)
154 * -EBADMSG : frame was incorrect and discarded
155 * (value returned from st21nfcb_nci_i2c_repack)
156 * -EIO : if no ST21NFCB_SOF_EOF is found after reaching
157 * the read length end sequence
158 */
159static int st21nfcb_nci_i2c_read(struct st21nfcb_i2c_phy *phy,
160 struct sk_buff **skb)
161{
162 int r;
163 u8 len;
164 u8 buf[ST21NFCB_NCI_I2C_MAX_SIZE];
165 struct i2c_client *client = phy->i2c_dev;
166
167 r = i2c_master_recv(client, buf, ST21NFCB_NCI_I2C_MIN_SIZE);
168 if (r == -EREMOTEIO) { /* Retry, chip was in standby */
169 usleep_range(1000, 4000);
170 r = i2c_master_recv(client, buf, ST21NFCB_NCI_I2C_MIN_SIZE);
171 } else if (r != ST21NFCB_NCI_I2C_MIN_SIZE) {
172 nfc_err(&client->dev, "cannot read ndlc & nci header\n");
173 return -EREMOTEIO;
174 }
175
176 len = be16_to_cpu(*(__be16 *) (buf + 2));
177 if (len > ST21NFCB_NCI_I2C_MAX_SIZE) {
178 nfc_err(&client->dev, "invalid frame len\n");
179 return -EBADMSG;
180 }
181
182 *skb = alloc_skb(ST21NFCB_NCI_I2C_MIN_SIZE + len, GFP_KERNEL);
183 if (*skb == NULL)
184 return -ENOMEM;
185
186 skb_reserve(*skb, ST21NFCB_NCI_I2C_MIN_SIZE);
187 skb_put(*skb, ST21NFCB_NCI_I2C_MIN_SIZE);
188 memcpy((*skb)->data, buf, ST21NFCB_NCI_I2C_MIN_SIZE);
189
190 if (!len)
191 return 0;
192
193 r = i2c_master_recv(client, buf, len);
194 if (r != len) {
195 kfree_skb(*skb);
196 return -EREMOTEIO;
197 }
198
199 skb_put(*skb, len);
200 memcpy((*skb)->data + ST21NFCB_NCI_I2C_MIN_SIZE, buf, len);
201
202 I2C_DUMP_SKB("i2c frame read", *skb);
203
204 return 0;
205}
206
207/*
208 * Reads an ndlc frame from the chip.
209 *
210 * On ST21NFCB, IRQ goes in idle state when read starts.
211 */
212static irqreturn_t st21nfcb_nci_irq_thread_fn(int irq, void *phy_id)
213{
214 struct st21nfcb_i2c_phy *phy = phy_id;
215 struct i2c_client *client;
216 struct sk_buff *skb = NULL;
217 int r;
218
219 if (!phy || irq != phy->i2c_dev->irq) {
220 WARN_ON_ONCE(1);
221 return IRQ_NONE;
222 }
223
224 client = phy->i2c_dev;
225 dev_dbg(&client->dev, "IRQ\n");
226
227 if (phy->hard_fault)
228 return IRQ_HANDLED;
229
230 if (!phy->powered) {
231 st21nfcb_nci_i2c_disable(phy);
232 return IRQ_HANDLED;
233 }
234
235 r = st21nfcb_nci_i2c_read(phy, &skb);
236 if (r == -EREMOTEIO) {
237 phy->hard_fault = r;
238 ndlc_recv(phy->ndlc, NULL);
239 return IRQ_HANDLED;
240 } else if (r == -ENOMEM || r == -EBADMSG) {
241 return IRQ_HANDLED;
242 }
243
244 ndlc_recv(phy->ndlc, skb);
245
246 return IRQ_HANDLED;
247}
248
249static struct nfc_phy_ops i2c_phy_ops = {
250 .write = st21nfcb_nci_i2c_write,
251 .enable = st21nfcb_nci_i2c_enable,
252 .disable = st21nfcb_nci_i2c_disable,
253};
254
255#ifdef CONFIG_OF
256static int st21nfcb_nci_i2c_of_request_resources(struct i2c_client *client)
257{
258 struct st21nfcb_i2c_phy *phy = i2c_get_clientdata(client);
259 struct device_node *pp;
260 int gpio;
261 int r;
262
263 pp = client->dev.of_node;
264 if (!pp)
265 return -ENODEV;
266
267 /* Get GPIO from device tree */
268 gpio = of_get_named_gpio(pp, "reset-gpios", 0);
269 if (gpio < 0) {
270 nfc_err(&client->dev,
271 "Failed to retrieve reset-gpios from device tree\n");
272 return gpio;
273 }
274
275 /* GPIO request and configuration */
276 r = devm_gpio_request(&client->dev, gpio, "clf_reset");
277 if (r) {
278 nfc_err(&client->dev, "Failed to request reset pin\n");
279 return -ENODEV;
280 }
281
282 r = gpio_direction_output(gpio, 1);
283 if (r) {
284 nfc_err(&client->dev,
285 "Failed to set reset pin direction as output\n");
286 return -ENODEV;
287 }
288 phy->gpio_reset = gpio;
289
290 /* IRQ */
291 r = irq_of_parse_and_map(pp, 0);
292 if (r < 0) {
293 nfc_err(&client->dev,
294 "Unable to get irq, error: %d\n", r);
295 return r;
296 }
297
298 phy->irq_polarity = irq_get_trigger_type(r);
299 client->irq = r;
300
301 return 0;
302}
303#else
304static int st21nfcb_nci_i2c_of_request_resources(struct i2c_client *client)
305{
306 return -ENODEV;
307}
308#endif
309
310static int st21nfcb_nci_i2c_request_resources(struct i2c_client *client)
311{
312 struct st21nfcb_nfc_platform_data *pdata;
313 struct st21nfcb_i2c_phy *phy = i2c_get_clientdata(client);
314 int r;
315 int irq;
316
317 pdata = client->dev.platform_data;
318 if (pdata == NULL) {
319 nfc_err(&client->dev, "No platform data\n");
320 return -EINVAL;
321 }
322
323 /* store for later use */
324 phy->gpio_irq = pdata->gpio_irq;
325 phy->gpio_reset = pdata->gpio_reset;
326 phy->irq_polarity = pdata->irq_polarity;
327
328 r = devm_gpio_request(&client->dev, phy->gpio_irq, "wake_up");
329 if (r) {
330 pr_err("%s : gpio_request failed\n", __FILE__);
331 return -ENODEV;
332 }
333
334 r = gpio_direction_input(phy->gpio_irq);
335 if (r) {
336 pr_err("%s : gpio_direction_input failed\n", __FILE__);
337 return -ENODEV;
338 }
339
340 r = devm_gpio_request(&client->dev,
341 phy->gpio_reset, "clf_reset");
342 if (r) {
343 pr_err("%s : reset gpio_request failed\n", __FILE__);
344 return -ENODEV;
345 }
346
347 r = gpio_direction_output(phy->gpio_reset, 1);
348 if (r) {
349 pr_err("%s : reset gpio_direction_output failed\n",
350 __FILE__);
351 return -ENODEV;
352 }
353
354 /* IRQ */
355 irq = gpio_to_irq(phy->gpio_irq);
356 if (irq < 0) {
357 nfc_err(&client->dev,
358 "Unable to get irq number for GPIO %d error %d\n",
359 phy->gpio_irq, r);
360 return -ENODEV;
361 }
362 client->irq = irq;
363
364 return 0;
365}
366
367static int st21nfcb_nci_i2c_probe(struct i2c_client *client,
368 const struct i2c_device_id *id)
369{
370 struct st21nfcb_i2c_phy *phy;
371 struct st21nfcb_nfc_platform_data *pdata;
372 int r;
373
374 dev_dbg(&client->dev, "%s\n", __func__);
375 dev_dbg(&client->dev, "IRQ: %d\n", client->irq);
376
377 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
378 nfc_err(&client->dev, "Need I2C_FUNC_I2C\n");
379 return -ENODEV;
380 }
381
382 phy = devm_kzalloc(&client->dev, sizeof(struct st21nfcb_i2c_phy),
383 GFP_KERNEL);
384 if (!phy) {
385 nfc_err(&client->dev,
386 "Cannot allocate memory for st21nfcb i2c phy.\n");
387 return -ENOMEM;
388 }
389
390 phy->i2c_dev = client;
391
392 i2c_set_clientdata(client, phy);
393
394 pdata = client->dev.platform_data;
395 if (!pdata && client->dev.of_node) {
396 r = st21nfcb_nci_i2c_of_request_resources(client);
397 if (r) {
398 nfc_err(&client->dev, "No platform data\n");
399 return r;
400 }
401 } else if (pdata) {
402 r = st21nfcb_nci_i2c_request_resources(client);
403 if (r) {
404 nfc_err(&client->dev,
405 "Cannot get platform resources\n");
406 return r;
407 }
408 } else {
409 nfc_err(&client->dev,
410 "st21nfcb platform resources not available\n");
411 return -ENODEV;
412 }
413
414 r = devm_request_threaded_irq(&client->dev, client->irq, NULL,
415 st21nfcb_nci_irq_thread_fn,
416 phy->irq_polarity | IRQF_ONESHOT,
417 ST21NFCB_NCI_DRIVER_NAME, phy);
418 if (r < 0) {
419 nfc_err(&client->dev, "Unable to register IRQ handler\n");
420 return r;
421 }
422
423 return ndlc_probe(phy, &i2c_phy_ops, &client->dev,
424 ST21NFCB_FRAME_HEADROOM, ST21NFCB_FRAME_TAILROOM,
425 &phy->ndlc);
426}
427
428static int st21nfcb_nci_i2c_remove(struct i2c_client *client)
429{
430 struct st21nfcb_i2c_phy *phy = i2c_get_clientdata(client);
431
432 dev_dbg(&client->dev, "%s\n", __func__);
433
434 ndlc_remove(phy->ndlc);
435
436 if (phy->powered)
437 st21nfcb_nci_i2c_disable(phy);
438
439 return 0;
440}
441
442static const struct of_device_id of_st21nfcb_i2c_match[] = {
443 { .compatible = "st,st21nfcb_i2c", },
444 {}
445};
446
447static struct i2c_driver st21nfcb_nci_i2c_driver = {
448 .driver = {
449 .owner = THIS_MODULE,
450 .name = ST21NFCB_NCI_I2C_DRIVER_NAME,
451 .owner = THIS_MODULE,
452 .of_match_table = of_match_ptr(of_st21nfcb_i2c_match),
453 },
454 .probe = st21nfcb_nci_i2c_probe,
455 .id_table = st21nfcb_nci_i2c_id_table,
456 .remove = st21nfcb_nci_i2c_remove,
457};
458
459module_i2c_driver(st21nfcb_nci_i2c_driver);
460
461MODULE_LICENSE("GPL");
462MODULE_DESCRIPTION(DRIVER_DESC);
diff --git a/drivers/nfc/st21nfcb/ndlc.c b/drivers/nfc/st21nfcb/ndlc.c
new file mode 100644
index 000000000000..83c97c36112b
--- /dev/null
+++ b/drivers/nfc/st21nfcb/ndlc.c
@@ -0,0 +1,298 @@
1/*
2 * Low Level Transport (NDLC) Driver for STMicroelectronics NFC Chip
3 *
4 * Copyright (C) 2014 STMicroelectronics SAS. All rights reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License,
8 * version 2, as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, see <http://www.gnu.org/licenses/>.
17 */
18
19#include <linux/sched.h>
20#include <net/nfc/nci_core.h>
21
22#include "ndlc.h"
23#include "st21nfcb.h"
24
25#define NDLC_TIMER_T1 100
26#define NDLC_TIMER_T1_WAIT 400
27#define NDLC_TIMER_T2 1200
28
29#define PCB_TYPE_DATAFRAME 0x80
30#define PCB_TYPE_SUPERVISOR 0xc0
31#define PCB_TYPE_MASK PCB_TYPE_SUPERVISOR
32
33#define PCB_SYNC_ACK 0x20
34#define PCB_SYNC_NACK 0x10
35#define PCB_SYNC_WAIT 0x30
36#define PCB_SYNC_NOINFO 0x00
37#define PCB_SYNC_MASK PCB_SYNC_WAIT
38
39#define PCB_DATAFRAME_RETRANSMIT_YES 0x00
40#define PCB_DATAFRAME_RETRANSMIT_NO 0x04
41#define PCB_DATAFRAME_RETRANSMIT_MASK PCB_DATAFRAME_RETRANSMIT_NO
42
43#define PCB_SUPERVISOR_RETRANSMIT_YES 0x00
44#define PCB_SUPERVISOR_RETRANSMIT_NO 0x02
45#define PCB_SUPERVISOR_RETRANSMIT_MASK PCB_SUPERVISOR_RETRANSMIT_NO
46
47#define PCB_FRAME_CRC_INFO_PRESENT 0x08
48#define PCB_FRAME_CRC_INFO_NOTPRESENT 0x00
49#define PCB_FRAME_CRC_INFO_MASK PCB_FRAME_CRC_INFO_PRESENT
50
51#define NDLC_DUMP_SKB(info, skb) \
52do { \
53 pr_debug("%s:\n", info); \
54 print_hex_dump(KERN_DEBUG, "ndlc: ", DUMP_PREFIX_OFFSET, \
55 16, 1, skb->data, skb->len, 0); \
56} while (0)
57
58int ndlc_open(struct llt_ndlc *ndlc)
59{
60 /* toggle reset pin */
61 ndlc->ops->enable(ndlc->phy_id);
62 return 0;
63}
64EXPORT_SYMBOL(ndlc_open);
65
66void ndlc_close(struct llt_ndlc *ndlc)
67{
68 /* toggle reset pin */
69 ndlc->ops->disable(ndlc->phy_id);
70}
71EXPORT_SYMBOL(ndlc_close);
72
73int ndlc_send(struct llt_ndlc *ndlc, struct sk_buff *skb)
74{
75 /* add ndlc header */
76 u8 pcb = PCB_TYPE_DATAFRAME | PCB_DATAFRAME_RETRANSMIT_NO |
77 PCB_FRAME_CRC_INFO_NOTPRESENT;
78
79 *skb_push(skb, 1) = pcb;
80 skb_queue_tail(&ndlc->send_q, skb);
81
82 schedule_work(&ndlc->sm_work);
83
84 return 0;
85}
86EXPORT_SYMBOL(ndlc_send);
87
88static void llt_ndlc_send_queue(struct llt_ndlc *ndlc)
89{
90 struct sk_buff *skb;
91 int r;
92 unsigned long time_sent;
93
94 if (ndlc->send_q.qlen)
95 pr_debug("sendQlen=%d unackQlen=%d\n",
96 ndlc->send_q.qlen, ndlc->ack_pending_q.qlen);
97
98 while (ndlc->send_q.qlen) {
99 skb = skb_dequeue(&ndlc->send_q);
100 NDLC_DUMP_SKB("ndlc frame written", skb);
101 r = ndlc->ops->write(ndlc->phy_id, skb);
102 if (r < 0) {
103 ndlc->hard_fault = r;
104 break;
105 }
106 time_sent = jiffies;
107 *(unsigned long *)skb->cb = time_sent;
108
109 skb_queue_tail(&ndlc->ack_pending_q, skb);
110
111 /* start timer t1 for ndlc aknowledge */
112 ndlc->t1_active = true;
113 mod_timer(&ndlc->t1_timer, time_sent +
114 msecs_to_jiffies(NDLC_TIMER_T1));
115 }
116}
117
118static void llt_ndlc_requeue_data_pending(struct llt_ndlc *ndlc)
119{
120 struct sk_buff *skb;
121 u8 pcb;
122
123 while ((skb = skb_dequeue_tail(&ndlc->ack_pending_q))) {
124 pcb = skb->data[0];
125 switch (pcb & PCB_TYPE_MASK) {
126 case PCB_TYPE_SUPERVISOR:
127 skb->data[0] = (pcb & ~PCB_SUPERVISOR_RETRANSMIT_MASK) |
128 PCB_SUPERVISOR_RETRANSMIT_YES;
129 break;
130 case PCB_TYPE_DATAFRAME:
131 skb->data[0] = (pcb & ~PCB_DATAFRAME_RETRANSMIT_MASK) |
132 PCB_DATAFRAME_RETRANSMIT_YES;
133 break;
134 default:
135 pr_err("UNKNOWN Packet Control Byte=%d\n", pcb);
136 kfree_skb(skb);
137 break;
138 }
139 skb_queue_head(&ndlc->send_q, skb);
140 }
141}
142
143static void llt_ndlc_rcv_queue(struct llt_ndlc *ndlc)
144{
145 struct sk_buff *skb;
146 u8 pcb;
147 unsigned long time_sent;
148
149 if (ndlc->rcv_q.qlen)
150 pr_debug("rcvQlen=%d\n", ndlc->rcv_q.qlen);
151
152 while ((skb = skb_dequeue(&ndlc->rcv_q)) != NULL) {
153 pcb = skb->data[0];
154 skb_pull(skb, 1);
155 if ((pcb & PCB_TYPE_MASK) == PCB_TYPE_SUPERVISOR) {
156 switch (pcb & PCB_SYNC_MASK) {
157 case PCB_SYNC_ACK:
158 del_timer_sync(&ndlc->t1_timer);
159 del_timer_sync(&ndlc->t2_timer);
160 ndlc->t2_active = false;
161 ndlc->t1_active = false;
162 break;
163 case PCB_SYNC_NACK:
164 llt_ndlc_requeue_data_pending(ndlc);
165 llt_ndlc_send_queue(ndlc);
166 /* start timer t1 for ndlc aknowledge */
167 time_sent = jiffies;
168 ndlc->t1_active = true;
169 mod_timer(&ndlc->t1_timer, time_sent +
170 msecs_to_jiffies(NDLC_TIMER_T1));
171 break;
172 case PCB_SYNC_WAIT:
173 time_sent = jiffies;
174 ndlc->t1_active = true;
175 mod_timer(&ndlc->t1_timer, time_sent +
176 msecs_to_jiffies(NDLC_TIMER_T1_WAIT));
177 break;
178 default:
179 pr_err("UNKNOWN Packet Control Byte=%d\n", pcb);
180 kfree_skb(skb);
181 break;
182 }
183 } else {
184 nci_recv_frame(ndlc->ndev, skb);
185 }
186 }
187}
188
189static void llt_ndlc_sm_work(struct work_struct *work)
190{
191 struct llt_ndlc *ndlc = container_of(work, struct llt_ndlc, sm_work);
192
193 llt_ndlc_send_queue(ndlc);
194 llt_ndlc_rcv_queue(ndlc);
195
196 if (ndlc->t1_active && timer_pending(&ndlc->t1_timer) == 0) {
197 pr_debug
198 ("Handle T1(recv SUPERVISOR) elapsed (T1 now inactive)\n");
199 ndlc->t1_active = false;
200
201 llt_ndlc_requeue_data_pending(ndlc);
202 llt_ndlc_send_queue(ndlc);
203 }
204
205 if (ndlc->t2_active && timer_pending(&ndlc->t2_timer) == 0) {
206 pr_debug("Handle T2(recv DATA) elapsed (T2 now inactive)\n");
207 ndlc->t2_active = false;
208 ndlc->t1_active = false;
209 del_timer_sync(&ndlc->t1_timer);
210
211 ndlc_close(ndlc);
212 ndlc->hard_fault = -EREMOTEIO;
213 }
214}
215
216void ndlc_recv(struct llt_ndlc *ndlc, struct sk_buff *skb)
217{
218 if (skb == NULL) {
219 pr_err("NULL Frame -> link is dead\n");
220 ndlc->hard_fault = -EREMOTEIO;
221 ndlc_close(ndlc);
222 } else {
223 NDLC_DUMP_SKB("incoming frame", skb);
224 skb_queue_tail(&ndlc->rcv_q, skb);
225 }
226
227 schedule_work(&ndlc->sm_work);
228}
229EXPORT_SYMBOL(ndlc_recv);
230
231static void ndlc_t1_timeout(unsigned long data)
232{
233 struct llt_ndlc *ndlc = (struct llt_ndlc *)data;
234
235 pr_debug("\n");
236
237 schedule_work(&ndlc->sm_work);
238}
239
240static void ndlc_t2_timeout(unsigned long data)
241{
242 struct llt_ndlc *ndlc = (struct llt_ndlc *)data;
243
244 pr_debug("\n");
245
246 schedule_work(&ndlc->sm_work);
247}
248
249int ndlc_probe(void *phy_id, struct nfc_phy_ops *phy_ops, struct device *dev,
250 int phy_headroom, int phy_tailroom, struct llt_ndlc **ndlc_id)
251{
252 struct llt_ndlc *ndlc;
253
254 ndlc = devm_kzalloc(dev, sizeof(struct llt_ndlc), GFP_KERNEL);
255 if (!ndlc) {
256 nfc_err(dev, "Cannot allocate memory for ndlc.\n");
257 return -ENOMEM;
258 }
259 ndlc->ops = phy_ops;
260 ndlc->phy_id = phy_id;
261 ndlc->dev = dev;
262
263 *ndlc_id = ndlc;
264
265 /* start timers */
266 init_timer(&ndlc->t1_timer);
267 ndlc->t1_timer.data = (unsigned long)ndlc;
268 ndlc->t1_timer.function = ndlc_t1_timeout;
269
270 init_timer(&ndlc->t2_timer);
271 ndlc->t2_timer.data = (unsigned long)ndlc;
272 ndlc->t2_timer.function = ndlc_t2_timeout;
273
274 skb_queue_head_init(&ndlc->rcv_q);
275 skb_queue_head_init(&ndlc->send_q);
276 skb_queue_head_init(&ndlc->ack_pending_q);
277
278 INIT_WORK(&ndlc->sm_work, llt_ndlc_sm_work);
279
280 return st21nfcb_nci_probe(ndlc, phy_headroom, phy_tailroom);
281}
282EXPORT_SYMBOL(ndlc_probe);
283
284void ndlc_remove(struct llt_ndlc *ndlc)
285{
286 /* cancel timers */
287 del_timer_sync(&ndlc->t1_timer);
288 del_timer_sync(&ndlc->t2_timer);
289 ndlc->t2_active = false;
290 ndlc->t1_active = false;
291
292 skb_queue_purge(&ndlc->rcv_q);
293 skb_queue_purge(&ndlc->send_q);
294
295 st21nfcb_nci_remove(ndlc->ndev);
296 kfree(ndlc);
297}
298EXPORT_SYMBOL(ndlc_remove);
diff --git a/drivers/nfc/st21nfcb/ndlc.h b/drivers/nfc/st21nfcb/ndlc.h
new file mode 100644
index 000000000000..c30a2f0faa5f
--- /dev/null
+++ b/drivers/nfc/st21nfcb/ndlc.h
@@ -0,0 +1,55 @@
1/*
2 * NCI based Driver for STMicroelectronics NFC Chip
3 *
4 * Copyright (C) 2014 STMicroelectronics SAS. All rights reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License,
8 * version 2, as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, see <http://www.gnu.org/licenses/>.
17 */
18
19#ifndef __LOCAL_NDLC_H_
20#define __LOCAL_NDLC_H_
21
22#include <linux/skbuff.h>
23#include <net/nfc/nfc.h>
24
25/* Low Level Transport description */
26struct llt_ndlc {
27 struct nci_dev *ndev;
28 struct nfc_phy_ops *ops;
29 void *phy_id;
30
31 struct timer_list t1_timer;
32 bool t1_active;
33
34 struct timer_list t2_timer;
35 bool t2_active;
36
37 struct sk_buff_head rcv_q;
38 struct sk_buff_head send_q;
39 struct sk_buff_head ack_pending_q;
40
41 struct work_struct sm_work;
42
43 struct device *dev;
44
45 int hard_fault;
46};
47
48int ndlc_open(struct llt_ndlc *ndlc);
49void ndlc_close(struct llt_ndlc *ndlc);
50int ndlc_send(struct llt_ndlc *ndlc, struct sk_buff *skb);
51void ndlc_recv(struct llt_ndlc *ndlc, struct sk_buff *skb);
52int ndlc_probe(void *phy_id, struct nfc_phy_ops *phy_ops, struct device *dev,
53 int phy_headroom, int phy_tailroom, struct llt_ndlc **ndlc_id);
54void ndlc_remove(struct llt_ndlc *ndlc);
55#endif /* __LOCAL_NDLC_H__ */
diff --git a/drivers/nfc/st21nfcb/st21nfcb.c b/drivers/nfc/st21nfcb/st21nfcb.c
new file mode 100644
index 000000000000..4d95863e3063
--- /dev/null
+++ b/drivers/nfc/st21nfcb/st21nfcb.c
@@ -0,0 +1,129 @@
1/*
2 * NCI based Driver for STMicroelectronics NFC Chip
3 *
4 * Copyright (C) 2014 STMicroelectronics SAS. All rights reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License,
8 * version 2, as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, see <http://www.gnu.org/licenses/>.
17 */
18
19#include <linux/module.h>
20#include <linux/nfc.h>
21#include <net/nfc/nci.h>
22#include <net/nfc/nci_core.h>
23
24#include "st21nfcb.h"
25#include "ndlc.h"
26
27#define DRIVER_DESC "NCI NFC driver for ST21NFCB"
28
29static int st21nfcb_nci_open(struct nci_dev *ndev)
30{
31 struct st21nfcb_nci_info *info = nci_get_drvdata(ndev);
32 int r;
33
34 if (test_and_set_bit(ST21NFCB_NCI_RUNNING, &info->flags))
35 return 0;
36
37 r = ndlc_open(info->ndlc);
38 if (r)
39 clear_bit(ST21NFCB_NCI_RUNNING, &info->flags);
40
41 return r;
42}
43
44static int st21nfcb_nci_close(struct nci_dev *ndev)
45{
46 struct st21nfcb_nci_info *info = nci_get_drvdata(ndev);
47
48 if (!test_and_clear_bit(ST21NFCB_NCI_RUNNING, &info->flags))
49 return 0;
50
51 ndlc_close(info->ndlc);
52
53 return 0;
54}
55
56static int st21nfcb_nci_send(struct nci_dev *ndev, struct sk_buff *skb)
57{
58 struct st21nfcb_nci_info *info = nci_get_drvdata(ndev);
59
60 skb->dev = (void *)ndev;
61
62 if (!test_bit(ST21NFCB_NCI_RUNNING, &info->flags))
63 return -EBUSY;
64
65 return ndlc_send(info->ndlc, skb);
66}
67
68static struct nci_ops st21nfcb_nci_ops = {
69 .open = st21nfcb_nci_open,
70 .close = st21nfcb_nci_close,
71 .send = st21nfcb_nci_send,
72};
73
74int st21nfcb_nci_probe(struct llt_ndlc *ndlc, int phy_headroom,
75 int phy_tailroom)
76{
77 struct st21nfcb_nci_info *info;
78 int r;
79 u32 protocols;
80
81 info = devm_kzalloc(ndlc->dev,
82 sizeof(struct st21nfcb_nci_info), GFP_KERNEL);
83 if (!info)
84 return -ENOMEM;
85
86 protocols = NFC_PROTO_JEWEL_MASK
87 | NFC_PROTO_MIFARE_MASK
88 | NFC_PROTO_FELICA_MASK
89 | NFC_PROTO_ISO14443_MASK
90 | NFC_PROTO_ISO14443_B_MASK
91 | NFC_PROTO_NFC_DEP_MASK;
92
93 ndlc->ndev = nci_allocate_device(&st21nfcb_nci_ops, protocols,
94 phy_headroom, phy_tailroom);
95 if (!ndlc->ndev) {
96 pr_err("Cannot allocate nfc ndev\n");
97 r = -ENOMEM;
98 goto err_alloc_ndev;
99 }
100 info->ndlc = ndlc;
101
102 nci_set_drvdata(ndlc->ndev, info);
103
104 r = nci_register_device(ndlc->ndev);
105 if (r)
106 goto err_regdev;
107
108 return r;
109err_regdev:
110 nci_free_device(ndlc->ndev);
111
112err_alloc_ndev:
113 kfree(info);
114 return r;
115}
116EXPORT_SYMBOL_GPL(st21nfcb_nci_probe);
117
118void st21nfcb_nci_remove(struct nci_dev *ndev)
119{
120 struct st21nfcb_nci_info *info = nci_get_drvdata(ndev);
121
122 nci_unregister_device(ndev);
123 nci_free_device(ndev);
124 kfree(info);
125}
126EXPORT_SYMBOL_GPL(st21nfcb_nci_remove);
127
128MODULE_LICENSE("GPL");
129MODULE_DESCRIPTION(DRIVER_DESC);
diff --git a/drivers/nfc/st21nfcb/st21nfcb.h b/drivers/nfc/st21nfcb/st21nfcb.h
new file mode 100644
index 000000000000..4bbbebb9f34d
--- /dev/null
+++ b/drivers/nfc/st21nfcb/st21nfcb.h
@@ -0,0 +1,38 @@
1/*
2 * NCI based Driver for STMicroelectronics NFC Chip
3 *
4 * Copyright (C) 2014 STMicroelectronics SAS. All rights reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License,
8 * version 2, as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, see <http://www.gnu.org/licenses/>.
17 */
18
19#ifndef __LOCAL_ST21NFCB_H_
20#define __LOCAL_ST21NFCB_H_
21
22#include <net/nfc/nci_core.h>
23
24#include "ndlc.h"
25
26/* Define private flags: */
27#define ST21NFCB_NCI_RUNNING 1
28
29struct st21nfcb_nci_info {
30 struct llt_ndlc *ndlc;
31 unsigned long flags;
32};
33
34void st21nfcb_nci_remove(struct nci_dev *ndev);
35int st21nfcb_nci_probe(struct llt_ndlc *ndlc, int phy_headroom,
36 int phy_tailroom);
37
38#endif /* __LOCAL_ST21NFCB_H_ */
diff --git a/include/linux/bcma/bcma.h b/include/linux/bcma/bcma.h
index 969af0f2bdf9..0272e49135d0 100644
--- a/include/linux/bcma/bcma.h
+++ b/include/linux/bcma/bcma.h
@@ -73,17 +73,17 @@ struct bcma_host_ops {
73/* Core-ID values. */ 73/* Core-ID values. */
74#define BCMA_CORE_OOB_ROUTER 0x367 /* Out of band */ 74#define BCMA_CORE_OOB_ROUTER 0x367 /* Out of band */
75#define BCMA_CORE_4706_CHIPCOMMON 0x500 75#define BCMA_CORE_4706_CHIPCOMMON 0x500
76#define BCMA_CORE_PCIEG2 0x501 76#define BCMA_CORE_NS_PCIEG2 0x501
77#define BCMA_CORE_DMA 0x502 77#define BCMA_CORE_NS_DMA 0x502
78#define BCMA_CORE_SDIO3 0x503 78#define BCMA_CORE_NS_SDIO3 0x503
79#define BCMA_CORE_USB20 0x504 79#define BCMA_CORE_NS_USB20 0x504
80#define BCMA_CORE_USB30 0x505 80#define BCMA_CORE_NS_USB30 0x505
81#define BCMA_CORE_A9JTAG 0x506 81#define BCMA_CORE_NS_A9JTAG 0x506
82#define BCMA_CORE_DDR23 0x507 82#define BCMA_CORE_NS_DDR23 0x507
83#define BCMA_CORE_ROM 0x508 83#define BCMA_CORE_NS_ROM 0x508
84#define BCMA_CORE_NAND 0x509 84#define BCMA_CORE_NS_NAND 0x509
85#define BCMA_CORE_QSPI 0x50A 85#define BCMA_CORE_NS_QSPI 0x50A
86#define BCMA_CORE_CHIPCOMMON_B 0x50B 86#define BCMA_CORE_NS_CHIPCOMMON_B 0x50B
87#define BCMA_CORE_4706_SOC_RAM 0x50E 87#define BCMA_CORE_4706_SOC_RAM 0x50E
88#define BCMA_CORE_ARMCA9 0x510 88#define BCMA_CORE_ARMCA9 0x510
89#define BCMA_CORE_4706_MAC_GBIT 0x52D 89#define BCMA_CORE_4706_MAC_GBIT 0x52D
@@ -158,6 +158,7 @@ struct bcma_host_ops {
158/* Chip IDs of PCIe devices */ 158/* Chip IDs of PCIe devices */
159#define BCMA_CHIP_ID_BCM4313 0x4313 159#define BCMA_CHIP_ID_BCM4313 0x4313
160#define BCMA_CHIP_ID_BCM43142 43142 160#define BCMA_CHIP_ID_BCM43142 43142
161#define BCMA_CHIP_ID_BCM43131 43131
161#define BCMA_CHIP_ID_BCM43217 43217 162#define BCMA_CHIP_ID_BCM43217 43217
162#define BCMA_CHIP_ID_BCM43222 43222 163#define BCMA_CHIP_ID_BCM43222 43222
163#define BCMA_CHIP_ID_BCM43224 43224 164#define BCMA_CHIP_ID_BCM43224 43224
diff --git a/include/linux/platform_data/st21nfcb.h b/include/linux/platform_data/st21nfcb.h
new file mode 100644
index 000000000000..2d11f1f5efab
--- /dev/null
+++ b/include/linux/platform_data/st21nfcb.h
@@ -0,0 +1,32 @@
1/*
2 * Driver include for the ST21NFCB NFC chip.
3 *
4 * Copyright (C) 2014 STMicroelectronics SAS. All rights reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License,
8 * version 2, as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, see <http://www.gnu.org/licenses/>.
17 */
18
19#ifndef _ST21NFCB_NCI_H_
20#define _ST21NFCB_NCI_H_
21
22#include <linux/i2c.h>
23
24#define ST21NFCB_NCI_DRIVER_NAME "st21nfcb_nci"
25
26struct st21nfcb_nfc_platform_data {
27 unsigned int gpio_irq;
28 unsigned int gpio_reset;
29 unsigned int irq_polarity;
30};
31
32#endif /* _ST21NFCA_HCI_H_ */
diff --git a/include/net/6lowpan.h b/include/net/6lowpan.h
index 79b530fb2c4d..d184df1d0d41 100644
--- a/include/net/6lowpan.h
+++ b/include/net/6lowpan.h
@@ -75,20 +75,6 @@
75 (((a)->s6_addr[14]) == (m)[6]) && \ 75 (((a)->s6_addr[14]) == (m)[6]) && \
76 (((a)->s6_addr[15]) == (m)[7])) 76 (((a)->s6_addr[15]) == (m)[7]))
77 77
78/* ipv6 address is unspecified */
79#define is_addr_unspecified(a) \
80 ((((a)->s6_addr32[0]) == 0) && \
81 (((a)->s6_addr32[1]) == 0) && \
82 (((a)->s6_addr32[2]) == 0) && \
83 (((a)->s6_addr32[3]) == 0))
84
85/* compare ipv6 addresses prefixes */
86#define ipaddr_prefixcmp(addr1, addr2, length) \
87 (memcmp(addr1, addr2, length >> 3) == 0)
88
89/* local link, i.e. FE80::/10 */
90#define is_addr_link_local(a) (((a)->s6_addr16[0]) == htons(0xFE80))
91
92/* 78/*
93 * check whether we can compress the IID to 16 bits, 79 * check whether we can compress the IID to 16 bits,
94 * it's possible for unicast adresses with first 49 bits are zero only. 80 * it's possible for unicast adresses with first 49 bits are zero only.
@@ -100,22 +86,8 @@
100 (((a)->s6_addr[12]) == 0xfe) && \ 86 (((a)->s6_addr[12]) == 0xfe) && \
101 (((a)->s6_addr[13]) == 0)) 87 (((a)->s6_addr[13]) == 0))
102 88
103/* multicast address */
104#define is_addr_mcast(a) (((a)->s6_addr[0]) == 0xFF)
105
106/* check whether the 112-bit gid of the multicast address is mappable to: */ 89/* check whether the 112-bit gid of the multicast address is mappable to: */
107 90
108/* 9 bits, for FF02::1 (all nodes) and FF02::2 (all routers) addresses only. */
109#define lowpan_is_mcast_addr_compressable(a) \
110 ((((a)->s6_addr16[1]) == 0) && \
111 (((a)->s6_addr16[2]) == 0) && \
112 (((a)->s6_addr16[3]) == 0) && \
113 (((a)->s6_addr16[4]) == 0) && \
114 (((a)->s6_addr16[5]) == 0) && \
115 (((a)->s6_addr16[6]) == 0) && \
116 (((a)->s6_addr[14]) == 0) && \
117 ((((a)->s6_addr[15]) == 1) || (((a)->s6_addr[15]) == 2)))
118
119/* 48 bits, FFXX::00XX:XXXX:XXXX */ 91/* 48 bits, FFXX::00XX:XXXX:XXXX */
120#define lowpan_is_mcast_addr_compressable48(a) \ 92#define lowpan_is_mcast_addr_compressable48(a) \
121 ((((a)->s6_addr16[1]) == 0) && \ 93 ((((a)->s6_addr16[1]) == 0) && \
@@ -168,17 +140,6 @@
168#define LOWPAN_FRAGN_HEAD_SIZE 0x5 140#define LOWPAN_FRAGN_HEAD_SIZE 0x5
169 141
170/* 142/*
171 * According IEEE802.15.4 standard:
172 * - MTU is 127 octets
173 * - maximum MHR size is 37 octets
174 * - MFR size is 2 octets
175 *
176 * so minimal payload size that we may guarantee is:
177 * MTU - MHR - MFR = 88 octets
178 */
179#define LOWPAN_FRAG_SIZE 88
180
181/*
182 * Values of fields within the IPHC encoding first byte 143 * Values of fields within the IPHC encoding first byte
183 * (C stands for compressed and I for inline) 144 * (C stands for compressed and I for inline)
184 */ 145 */
@@ -279,17 +240,6 @@ static inline int lowpan_fetch_skb_u8(struct sk_buff *skb, u8 *val)
279 return 0; 240 return 0;
280} 241}
281 242
282static inline int lowpan_fetch_skb_u16(struct sk_buff *skb, u16 *val)
283{
284 if (unlikely(!pskb_may_pull(skb, 2)))
285 return -EINVAL;
286
287 *val = (skb->data[0] << 8) | skb->data[1];
288 skb_pull(skb, 2);
289
290 return 0;
291}
292
293static inline bool lowpan_fetch_skb(struct sk_buff *skb, 243static inline bool lowpan_fetch_skb(struct sk_buff *skb,
294 void *data, const unsigned int len) 244 void *data, const unsigned int len)
295{ 245{
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
index f0a3d8890760..3f8547f1c6f8 100644
--- a/include/net/bluetooth/hci.h
+++ b/include/net/bluetooth/hci.h
@@ -167,7 +167,7 @@ enum {
167 HCI_AUTO_OFF, 167 HCI_AUTO_OFF,
168 HCI_RFKILLED, 168 HCI_RFKILLED,
169 HCI_MGMT, 169 HCI_MGMT,
170 HCI_PAIRABLE, 170 HCI_BONDABLE,
171 HCI_SERVICE_CACHE, 171 HCI_SERVICE_CACHE,
172 HCI_KEEP_DEBUG_KEYS, 172 HCI_KEEP_DEBUG_KEYS,
173 HCI_USE_DEBUG_KEYS, 173 HCI_USE_DEBUG_KEYS,
@@ -1074,6 +1074,8 @@ struct hci_rp_read_data_block_size {
1074 __le16 num_blocks; 1074 __le16 num_blocks;
1075} __packed; 1075} __packed;
1076 1076
1077#define HCI_OP_READ_LOCAL_CODECS 0x100b
1078
1077#define HCI_OP_READ_PAGE_SCAN_ACTIVITY 0x0c1b 1079#define HCI_OP_READ_PAGE_SCAN_ACTIVITY 0x0c1b
1078struct hci_rp_read_page_scan_activity { 1080struct hci_rp_read_page_scan_activity {
1079 __u8 status; 1081 __u8 status;
@@ -1170,6 +1172,8 @@ struct hci_rp_write_remote_amp_assoc {
1170 __u8 phy_handle; 1172 __u8 phy_handle;
1171} __packed; 1173} __packed;
1172 1174
1175#define HCI_OP_GET_MWS_TRANSPORT_CONFIG 0x140c
1176
1173#define HCI_OP_ENABLE_DUT_MODE 0x1803 1177#define HCI_OP_ENABLE_DUT_MODE 0x1803
1174 1178
1175#define HCI_OP_WRITE_SSP_DEBUG_MODE 0x1804 1179#define HCI_OP_WRITE_SSP_DEBUG_MODE 0x1804
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 996ed065b6c2..b5d5af3aa469 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -203,6 +203,8 @@ struct hci_dev {
203 __u16 page_scan_window; 203 __u16 page_scan_window;
204 __u8 page_scan_type; 204 __u8 page_scan_type;
205 __u8 le_adv_channel_map; 205 __u8 le_adv_channel_map;
206 __u16 le_adv_min_interval;
207 __u16 le_adv_max_interval;
206 __u8 le_scan_type; 208 __u8 le_scan_type;
207 __u16 le_scan_interval; 209 __u16 le_scan_interval;
208 __u16 le_scan_window; 210 __u16 le_scan_window;
@@ -458,6 +460,7 @@ struct hci_conn_params {
458 enum { 460 enum {
459 HCI_AUTO_CONN_DISABLED, 461 HCI_AUTO_CONN_DISABLED,
460 HCI_AUTO_CONN_REPORT, 462 HCI_AUTO_CONN_REPORT,
463 HCI_AUTO_CONN_DIRECT,
461 HCI_AUTO_CONN_ALWAYS, 464 HCI_AUTO_CONN_ALWAYS,
462 HCI_AUTO_CONN_LINK_LOSS, 465 HCI_AUTO_CONN_LINK_LOSS,
463 } auto_connect; 466 } auto_connect;
diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h
index 623d5203c592..414cd2f9a437 100644
--- a/include/net/bluetooth/mgmt.h
+++ b/include/net/bluetooth/mgmt.h
@@ -87,7 +87,7 @@ struct mgmt_rp_read_index_list {
87#define MGMT_SETTING_CONNECTABLE 0x00000002 87#define MGMT_SETTING_CONNECTABLE 0x00000002
88#define MGMT_SETTING_FAST_CONNECTABLE 0x00000004 88#define MGMT_SETTING_FAST_CONNECTABLE 0x00000004
89#define MGMT_SETTING_DISCOVERABLE 0x00000008 89#define MGMT_SETTING_DISCOVERABLE 0x00000008
90#define MGMT_SETTING_PAIRABLE 0x00000010 90#define MGMT_SETTING_BONDABLE 0x00000010
91#define MGMT_SETTING_LINK_SECURITY 0x00000020 91#define MGMT_SETTING_LINK_SECURITY 0x00000020
92#define MGMT_SETTING_SSP 0x00000040 92#define MGMT_SETTING_SSP 0x00000040
93#define MGMT_SETTING_BREDR 0x00000080 93#define MGMT_SETTING_BREDR 0x00000080
@@ -131,7 +131,7 @@ struct mgmt_cp_set_discoverable {
131 131
132#define MGMT_OP_SET_FAST_CONNECTABLE 0x0008 132#define MGMT_OP_SET_FAST_CONNECTABLE 0x0008
133 133
134#define MGMT_OP_SET_PAIRABLE 0x0009 134#define MGMT_OP_SET_BONDABLE 0x0009
135 135
136#define MGMT_OP_SET_LINK_SECURITY 0x000A 136#define MGMT_OP_SET_LINK_SECURITY 0x000A
137 137
diff --git a/include/net/nfc/digital.h b/include/net/nfc/digital.h
index bdf55c3b7a19..d9a5cf7ac1c4 100644
--- a/include/net/nfc/digital.h
+++ b/include/net/nfc/digital.h
@@ -49,6 +49,7 @@ enum {
49 NFC_DIGITAL_FRAMING_NFCA_SHORT = 0, 49 NFC_DIGITAL_FRAMING_NFCA_SHORT = 0,
50 NFC_DIGITAL_FRAMING_NFCA_STANDARD, 50 NFC_DIGITAL_FRAMING_NFCA_STANDARD,
51 NFC_DIGITAL_FRAMING_NFCA_STANDARD_WITH_CRC_A, 51 NFC_DIGITAL_FRAMING_NFCA_STANDARD_WITH_CRC_A,
52 NFC_DIGITAL_FRAMING_NFCA_ANTICOL_COMPLETE,
52 53
53 NFC_DIGITAL_FRAMING_NFCA_T1T, 54 NFC_DIGITAL_FRAMING_NFCA_T1T,
54 NFC_DIGITAL_FRAMING_NFCA_T2T, 55 NFC_DIGITAL_FRAMING_NFCA_T2T,
@@ -126,6 +127,15 @@ typedef void (*nfc_digital_cmd_complete_t)(struct nfc_digital_dev *ddev,
126 * the NFC-DEP ATR_REQ command through cb. The digital stack deducts the RF 127 * the NFC-DEP ATR_REQ command through cb. The digital stack deducts the RF
127 * tech by analyzing the SoD of the frame containing the ATR_REQ command. 128 * tech by analyzing the SoD of the frame containing the ATR_REQ command.
128 * This is an asynchronous function. 129 * This is an asynchronous function.
130 * @tg_listen_md: If supported, put the device in automatic listen mode with
131 * mode detection but without automatic anti-collision. In this mode, the
132 * device automatically detects the RF technology. What the actual
133 * RF technology is can be retrieved by calling @tg_get_rf_tech.
134 * The digital stack will then perform the appropriate anti-collision
135 * sequence. This is an asynchronous function.
136 * @tg_get_rf_tech: Required when @tg_listen_md is supported, unused otherwise.
137 * Return the RF Technology that was detected by the @tg_listen_md call.
138 * This is a synchronous function.
129 * 139 *
130 * @switch_rf: Turns device radio on or off. The stack does not call explicitly 140 * @switch_rf: Turns device radio on or off. The stack does not call explicitly
131 * switch_rf to turn the radio on. A call to in|tg_configure_hw must turn 141 * switch_rf to turn the radio on. A call to in|tg_configure_hw must turn
@@ -160,6 +170,9 @@ struct nfc_digital_ops {
160 struct digital_tg_mdaa_params *mdaa_params, 170 struct digital_tg_mdaa_params *mdaa_params,
161 u16 timeout, nfc_digital_cmd_complete_t cb, 171 u16 timeout, nfc_digital_cmd_complete_t cb,
162 void *arg); 172 void *arg);
173 int (*tg_listen_md)(struct nfc_digital_dev *ddev, u16 timeout,
174 nfc_digital_cmd_complete_t cb, void *arg);
175 int (*tg_get_rf_tech)(struct nfc_digital_dev *ddev, u8 *rf_tech);
163 176
164 int (*switch_rf)(struct nfc_digital_dev *ddev, bool on); 177 int (*switch_rf)(struct nfc_digital_dev *ddev, bool on);
165 void (*abort_cmd)(struct nfc_digital_dev *ddev); 178 void (*abort_cmd)(struct nfc_digital_dev *ddev);
diff --git a/include/net/nfc/hci.h b/include/net/nfc/hci.h
index 61286db54388..7ee8f4cc610b 100644
--- a/include/net/nfc/hci.h
+++ b/include/net/nfc/hci.h
@@ -37,6 +37,7 @@ struct nfc_hci_ops {
37 int (*xmit) (struct nfc_hci_dev *hdev, struct sk_buff *skb); 37 int (*xmit) (struct nfc_hci_dev *hdev, struct sk_buff *skb);
38 int (*start_poll) (struct nfc_hci_dev *hdev, 38 int (*start_poll) (struct nfc_hci_dev *hdev,
39 u32 im_protocols, u32 tm_protocols); 39 u32 im_protocols, u32 tm_protocols);
40 void (*stop_poll) (struct nfc_hci_dev *hdev);
40 int (*dep_link_up)(struct nfc_hci_dev *hdev, struct nfc_target *target, 41 int (*dep_link_up)(struct nfc_hci_dev *hdev, struct nfc_target *target,
41 u8 comm_mode, u8 *gb, size_t gb_len); 42 u8 comm_mode, u8 *gb, size_t gb_len);
42 int (*dep_link_down)(struct nfc_hci_dev *hdev); 43 int (*dep_link_down)(struct nfc_hci_dev *hdev);
diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c
index a1b7117a9600..142eef55c9e2 100644
--- a/net/6lowpan/iphc.c
+++ b/net/6lowpan/iphc.c
@@ -177,8 +177,8 @@ static int skb_deliver(struct sk_buff *skb, struct ipv6hdr *hdr,
177 struct sk_buff *new; 177 struct sk_buff *new;
178 int stat; 178 int stat;
179 179
180 new = skb_copy_expand(skb, sizeof(struct ipv6hdr), 180 new = skb_copy_expand(skb, sizeof(struct ipv6hdr), skb_tailroom(skb),
181 skb_tailroom(skb), GFP_ATOMIC); 181 GFP_ATOMIC);
182 kfree_skb(skb); 182 kfree_skb(skb);
183 183
184 if (!new) 184 if (!new)
@@ -205,10 +205,9 @@ static int skb_deliver(struct sk_buff *skb, struct ipv6hdr *hdr,
205/* Uncompress function for multicast destination address, 205/* Uncompress function for multicast destination address,
206 * when M bit is set. 206 * when M bit is set.
207 */ 207 */
208static int 208static int lowpan_uncompress_multicast_daddr(struct sk_buff *skb,
209lowpan_uncompress_multicast_daddr(struct sk_buff *skb, 209 struct in6_addr *ipaddr,
210 struct in6_addr *ipaddr, 210 const u8 dam)
211 const u8 dam)
212{ 211{
213 bool fail; 212 bool fail;
214 213
@@ -254,41 +253,41 @@ lowpan_uncompress_multicast_daddr(struct sk_buff *skb,
254 } 253 }
255 254
256 raw_dump_inline(NULL, "Reconstructed ipv6 multicast addr is", 255 raw_dump_inline(NULL, "Reconstructed ipv6 multicast addr is",
257 ipaddr->s6_addr, 16); 256 ipaddr->s6_addr, 16);
258 257
259 return 0; 258 return 0;
260} 259}
261 260
262static int 261static int uncompress_udp_header(struct sk_buff *skb, struct udphdr *uh)
263uncompress_udp_header(struct sk_buff *skb, struct udphdr *uh)
264{ 262{
265 bool fail; 263 bool fail;
266 u8 tmp = 0, val = 0; 264 u8 tmp = 0, val = 0;
267 265
268 if (!uh) 266 fail = lowpan_fetch_skb(skb, &tmp, sizeof(tmp));
269 goto err;
270
271 fail = lowpan_fetch_skb(skb, &tmp, 1);
272 267
273 if ((tmp & LOWPAN_NHC_UDP_MASK) == LOWPAN_NHC_UDP_ID) { 268 if ((tmp & LOWPAN_NHC_UDP_MASK) == LOWPAN_NHC_UDP_ID) {
274 pr_debug("UDP header uncompression\n"); 269 pr_debug("UDP header uncompression\n");
275 switch (tmp & LOWPAN_NHC_UDP_CS_P_11) { 270 switch (tmp & LOWPAN_NHC_UDP_CS_P_11) {
276 case LOWPAN_NHC_UDP_CS_P_00: 271 case LOWPAN_NHC_UDP_CS_P_00:
277 fail |= lowpan_fetch_skb(skb, &uh->source, 2); 272 fail |= lowpan_fetch_skb(skb, &uh->source,
278 fail |= lowpan_fetch_skb(skb, &uh->dest, 2); 273 sizeof(uh->source));
274 fail |= lowpan_fetch_skb(skb, &uh->dest,
275 sizeof(uh->dest));
279 break; 276 break;
280 case LOWPAN_NHC_UDP_CS_P_01: 277 case LOWPAN_NHC_UDP_CS_P_01:
281 fail |= lowpan_fetch_skb(skb, &uh->source, 2); 278 fail |= lowpan_fetch_skb(skb, &uh->source,
282 fail |= lowpan_fetch_skb(skb, &val, 1); 279 sizeof(uh->source));
280 fail |= lowpan_fetch_skb(skb, &val, sizeof(val));
283 uh->dest = htons(val + LOWPAN_NHC_UDP_8BIT_PORT); 281 uh->dest = htons(val + LOWPAN_NHC_UDP_8BIT_PORT);
284 break; 282 break;
285 case LOWPAN_NHC_UDP_CS_P_10: 283 case LOWPAN_NHC_UDP_CS_P_10:
286 fail |= lowpan_fetch_skb(skb, &val, 1); 284 fail |= lowpan_fetch_skb(skb, &val, sizeof(val));
287 uh->source = htons(val + LOWPAN_NHC_UDP_8BIT_PORT); 285 uh->source = htons(val + LOWPAN_NHC_UDP_8BIT_PORT);
288 fail |= lowpan_fetch_skb(skb, &uh->dest, 2); 286 fail |= lowpan_fetch_skb(skb, &uh->dest,
287 sizeof(uh->dest));
289 break; 288 break;
290 case LOWPAN_NHC_UDP_CS_P_11: 289 case LOWPAN_NHC_UDP_CS_P_11:
291 fail |= lowpan_fetch_skb(skb, &val, 1); 290 fail |= lowpan_fetch_skb(skb, &val, sizeof(val));
292 uh->source = htons(LOWPAN_NHC_UDP_4BIT_PORT + 291 uh->source = htons(LOWPAN_NHC_UDP_4BIT_PORT +
293 (val >> 4)); 292 (val >> 4));
294 uh->dest = htons(LOWPAN_NHC_UDP_4BIT_PORT + 293 uh->dest = htons(LOWPAN_NHC_UDP_4BIT_PORT +
@@ -307,10 +306,11 @@ uncompress_udp_header(struct sk_buff *skb, struct udphdr *uh)
307 pr_debug_ratelimited("checksum elided currently not supported\n"); 306 pr_debug_ratelimited("checksum elided currently not supported\n");
308 goto err; 307 goto err;
309 } else { 308 } else {
310 fail |= lowpan_fetch_skb(skb, &uh->check, 2); 309 fail |= lowpan_fetch_skb(skb, &uh->check,
310 sizeof(uh->check));
311 } 311 }
312 312
313 /* UDP lenght needs to be infered from the lower layers 313 /* UDP length needs to be infered from the lower layers
314 * here, we obtain the hint from the remaining size of the 314 * here, we obtain the hint from the remaining size of the
315 * frame 315 * frame
316 */ 316 */
@@ -333,9 +333,8 @@ err:
333static const u8 lowpan_ttl_values[] = { 0, 1, 64, 255 }; 333static const u8 lowpan_ttl_values[] = { 0, 1, 64, 255 };
334 334
335int lowpan_process_data(struct sk_buff *skb, struct net_device *dev, 335int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
336 const u8 *saddr, const u8 saddr_type, 336 const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
337 const u8 saddr_len, const u8 *daddr, 337 const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
338 const u8 daddr_type, const u8 daddr_len,
339 u8 iphc0, u8 iphc1, skb_delivery_cb deliver_skb) 338 u8 iphc0, u8 iphc1, skb_delivery_cb deliver_skb)
340{ 339{
341 struct ipv6hdr hdr = {}; 340 struct ipv6hdr hdr = {};
@@ -348,7 +347,7 @@ int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
348 /* another if the CID flag is set */ 347 /* another if the CID flag is set */
349 if (iphc1 & LOWPAN_IPHC_CID) { 348 if (iphc1 & LOWPAN_IPHC_CID) {
350 pr_debug("CID flag is set, increase header with one\n"); 349 pr_debug("CID flag is set, increase header with one\n");
351 if (lowpan_fetch_skb_u8(skb, &num_context)) 350 if (lowpan_fetch_skb(skb, &num_context, sizeof(num_context)))
352 goto drop; 351 goto drop;
353 } 352 }
354 353
@@ -360,7 +359,7 @@ int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
360 * ECN + DSCP + 4-bit Pad + Flow Label (4 bytes) 359 * ECN + DSCP + 4-bit Pad + Flow Label (4 bytes)
361 */ 360 */
362 case 0: /* 00b */ 361 case 0: /* 00b */
363 if (lowpan_fetch_skb_u8(skb, &tmp)) 362 if (lowpan_fetch_skb(skb, &tmp, sizeof(tmp)))
364 goto drop; 363 goto drop;
365 364
366 memcpy(&hdr.flow_lbl, &skb->data[0], 3); 365 memcpy(&hdr.flow_lbl, &skb->data[0], 3);
@@ -373,7 +372,7 @@ int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
373 * ECN + DSCP (1 byte), Flow Label is elided 372 * ECN + DSCP (1 byte), Flow Label is elided
374 */ 373 */
375 case 2: /* 10b */ 374 case 2: /* 10b */
376 if (lowpan_fetch_skb_u8(skb, &tmp)) 375 if (lowpan_fetch_skb(skb, &tmp, sizeof(tmp)))
377 goto drop; 376 goto drop;
378 377
379 hdr.priority = ((tmp >> 2) & 0x0f); 378 hdr.priority = ((tmp >> 2) & 0x0f);
@@ -383,7 +382,7 @@ int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
383 * ECN + 2-bit Pad + Flow Label (3 bytes), DSCP is elided 382 * ECN + 2-bit Pad + Flow Label (3 bytes), DSCP is elided
384 */ 383 */
385 case 1: /* 01b */ 384 case 1: /* 01b */
386 if (lowpan_fetch_skb_u8(skb, &tmp)) 385 if (lowpan_fetch_skb(skb, &tmp, sizeof(tmp)))
387 goto drop; 386 goto drop;
388 387
389 hdr.flow_lbl[0] = (skb->data[0] & 0x0F) | ((tmp >> 2) & 0x30); 388 hdr.flow_lbl[0] = (skb->data[0] & 0x0F) | ((tmp >> 2) & 0x30);
@@ -400,7 +399,7 @@ int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
400 /* Next Header */ 399 /* Next Header */
401 if ((iphc0 & LOWPAN_IPHC_NH_C) == 0) { 400 if ((iphc0 & LOWPAN_IPHC_NH_C) == 0) {
402 /* Next header is carried inline */ 401 /* Next header is carried inline */
403 if (lowpan_fetch_skb_u8(skb, &(hdr.nexthdr))) 402 if (lowpan_fetch_skb(skb, &hdr.nexthdr, sizeof(hdr.nexthdr)))
404 goto drop; 403 goto drop;
405 404
406 pr_debug("NH flag is set, next header carried inline: %02x\n", 405 pr_debug("NH flag is set, next header carried inline: %02x\n",
@@ -411,7 +410,8 @@ int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
411 if ((iphc0 & 0x03) != LOWPAN_IPHC_TTL_I) { 410 if ((iphc0 & 0x03) != LOWPAN_IPHC_TTL_I) {
412 hdr.hop_limit = lowpan_ttl_values[iphc0 & 0x03]; 411 hdr.hop_limit = lowpan_ttl_values[iphc0 & 0x03];
413 } else { 412 } else {
414 if (lowpan_fetch_skb_u8(skb, &(hdr.hop_limit))) 413 if (lowpan_fetch_skb(skb, &hdr.hop_limit,
414 sizeof(hdr.hop_limit)))
415 goto drop; 415 goto drop;
416 } 416 }
417 417
@@ -421,8 +421,7 @@ int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
421 if (iphc1 & LOWPAN_IPHC_SAC) { 421 if (iphc1 & LOWPAN_IPHC_SAC) {
422 /* Source address context based uncompression */ 422 /* Source address context based uncompression */
423 pr_debug("SAC bit is set. Handle context based source address.\n"); 423 pr_debug("SAC bit is set. Handle context based source address.\n");
424 err = uncompress_context_based_src_addr( 424 err = uncompress_context_based_src_addr(skb, &hdr.saddr, tmp);
425 skb, &hdr.saddr, tmp);
426 } else { 425 } else {
427 /* Source address uncompression */ 426 /* Source address uncompression */
428 pr_debug("source address stateless compression\n"); 427 pr_debug("source address stateless compression\n");
@@ -443,8 +442,9 @@ int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
443 pr_debug("dest: context-based mcast compression\n"); 442 pr_debug("dest: context-based mcast compression\n");
444 /* TODO: implement this */ 443 /* TODO: implement this */
445 } else { 444 } else {
446 err = lowpan_uncompress_multicast_daddr( 445 err = lowpan_uncompress_multicast_daddr(skb, &hdr.daddr,
447 skb, &hdr.daddr, tmp); 446 tmp);
447
448 if (err) 448 if (err)
449 goto drop; 449 goto drop;
450 } 450 }
@@ -497,8 +497,7 @@ int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
497 hdr.version, ntohs(hdr.payload_len), hdr.nexthdr, 497 hdr.version, ntohs(hdr.payload_len), hdr.nexthdr,
498 hdr.hop_limit, &hdr.daddr); 498 hdr.hop_limit, &hdr.daddr);
499 499
500 raw_dump_table(__func__, "raw header dump", 500 raw_dump_table(__func__, "raw header dump", (u8 *)&hdr, sizeof(hdr));
501 (u8 *)&hdr, sizeof(hdr));
502 501
503 return skb_deliver(skb, &hdr, dev, deliver_skb); 502 return skb_deliver(skb, &hdr, dev, deliver_skb);
504 503
@@ -508,7 +507,7 @@ drop:
508} 507}
509EXPORT_SYMBOL_GPL(lowpan_process_data); 508EXPORT_SYMBOL_GPL(lowpan_process_data);
510 509
511static u8 lowpan_compress_addr_64(u8 **hc06_ptr, u8 shift, 510static u8 lowpan_compress_addr_64(u8 **hc_ptr, u8 shift,
512 const struct in6_addr *ipaddr, 511 const struct in6_addr *ipaddr,
513 const unsigned char *lladdr) 512 const unsigned char *lladdr)
514{ 513{
@@ -519,24 +518,22 @@ static u8 lowpan_compress_addr_64(u8 **hc06_ptr, u8 shift,
519 pr_debug("address compression 0 bits\n"); 518 pr_debug("address compression 0 bits\n");
520 } else if (lowpan_is_iid_16_bit_compressable(ipaddr)) { 519 } else if (lowpan_is_iid_16_bit_compressable(ipaddr)) {
521 /* compress IID to 16 bits xxxx::XXXX */ 520 /* compress IID to 16 bits xxxx::XXXX */
522 memcpy(*hc06_ptr, &ipaddr->s6_addr16[7], 2); 521 lowpan_push_hc_data(hc_ptr, &ipaddr->s6_addr16[7], 2);
523 *hc06_ptr += 2;
524 val = 2; /* 16-bits */ 522 val = 2; /* 16-bits */
525 raw_dump_inline(NULL, "Compressed ipv6 addr is (16 bits)", 523 raw_dump_inline(NULL, "Compressed ipv6 addr is (16 bits)",
526 *hc06_ptr - 2, 2); 524 *hc_ptr - 2, 2);
527 } else { 525 } else {
528 /* do not compress IID => xxxx::IID */ 526 /* do not compress IID => xxxx::IID */
529 memcpy(*hc06_ptr, &ipaddr->s6_addr16[4], 8); 527 lowpan_push_hc_data(hc_ptr, &ipaddr->s6_addr16[4], 8);
530 *hc06_ptr += 8;
531 val = 1; /* 64-bits */ 528 val = 1; /* 64-bits */
532 raw_dump_inline(NULL, "Compressed ipv6 addr is (64 bits)", 529 raw_dump_inline(NULL, "Compressed ipv6 addr is (64 bits)",
533 *hc06_ptr - 8, 8); 530 *hc_ptr - 8, 8);
534 } 531 }
535 532
536 return rol8(val, shift); 533 return rol8(val, shift);
537} 534}
538 535
539static void compress_udp_header(u8 **hc06_ptr, struct sk_buff *skb) 536static void compress_udp_header(u8 **hc_ptr, struct sk_buff *skb)
540{ 537{
541 struct udphdr *uh = udp_hdr(skb); 538 struct udphdr *uh = udp_hdr(skb);
542 u8 tmp; 539 u8 tmp;
@@ -548,46 +545,46 @@ static void compress_udp_header(u8 **hc06_ptr, struct sk_buff *skb)
548 pr_debug("UDP header: both ports compression to 4 bits\n"); 545 pr_debug("UDP header: both ports compression to 4 bits\n");
549 /* compression value */ 546 /* compression value */
550 tmp = LOWPAN_NHC_UDP_CS_P_11; 547 tmp = LOWPAN_NHC_UDP_CS_P_11;
551 lowpan_push_hc_data(hc06_ptr, &tmp, sizeof(tmp)); 548 lowpan_push_hc_data(hc_ptr, &tmp, sizeof(tmp));
552 /* source and destination port */ 549 /* source and destination port */
553 tmp = ntohs(uh->dest) - LOWPAN_NHC_UDP_4BIT_PORT + 550 tmp = ntohs(uh->dest) - LOWPAN_NHC_UDP_4BIT_PORT +
554 ((ntohs(uh->source) - LOWPAN_NHC_UDP_4BIT_PORT) << 4); 551 ((ntohs(uh->source) - LOWPAN_NHC_UDP_4BIT_PORT) << 4);
555 lowpan_push_hc_data(hc06_ptr, &tmp, sizeof(tmp)); 552 lowpan_push_hc_data(hc_ptr, &tmp, sizeof(tmp));
556 } else if ((ntohs(uh->dest) & LOWPAN_NHC_UDP_8BIT_MASK) == 553 } else if ((ntohs(uh->dest) & LOWPAN_NHC_UDP_8BIT_MASK) ==
557 LOWPAN_NHC_UDP_8BIT_PORT) { 554 LOWPAN_NHC_UDP_8BIT_PORT) {
558 pr_debug("UDP header: remove 8 bits of dest\n"); 555 pr_debug("UDP header: remove 8 bits of dest\n");
559 /* compression value */ 556 /* compression value */
560 tmp = LOWPAN_NHC_UDP_CS_P_01; 557 tmp = LOWPAN_NHC_UDP_CS_P_01;
561 lowpan_push_hc_data(hc06_ptr, &tmp, sizeof(tmp)); 558 lowpan_push_hc_data(hc_ptr, &tmp, sizeof(tmp));
562 /* source port */ 559 /* source port */
563 lowpan_push_hc_data(hc06_ptr, &uh->source, sizeof(uh->source)); 560 lowpan_push_hc_data(hc_ptr, &uh->source, sizeof(uh->source));
564 /* destination port */ 561 /* destination port */
565 tmp = ntohs(uh->dest) - LOWPAN_NHC_UDP_8BIT_PORT; 562 tmp = ntohs(uh->dest) - LOWPAN_NHC_UDP_8BIT_PORT;
566 lowpan_push_hc_data(hc06_ptr, &tmp, sizeof(tmp)); 563 lowpan_push_hc_data(hc_ptr, &tmp, sizeof(tmp));
567 } else if ((ntohs(uh->source) & LOWPAN_NHC_UDP_8BIT_MASK) == 564 } else if ((ntohs(uh->source) & LOWPAN_NHC_UDP_8BIT_MASK) ==
568 LOWPAN_NHC_UDP_8BIT_PORT) { 565 LOWPAN_NHC_UDP_8BIT_PORT) {
569 pr_debug("UDP header: remove 8 bits of source\n"); 566 pr_debug("UDP header: remove 8 bits of source\n");
570 /* compression value */ 567 /* compression value */
571 tmp = LOWPAN_NHC_UDP_CS_P_10; 568 tmp = LOWPAN_NHC_UDP_CS_P_10;
572 lowpan_push_hc_data(hc06_ptr, &tmp, sizeof(tmp)); 569 lowpan_push_hc_data(hc_ptr, &tmp, sizeof(tmp));
573 /* source port */ 570 /* source port */
574 tmp = ntohs(uh->source) - LOWPAN_NHC_UDP_8BIT_PORT; 571 tmp = ntohs(uh->source) - LOWPAN_NHC_UDP_8BIT_PORT;
575 lowpan_push_hc_data(hc06_ptr, &tmp, sizeof(tmp)); 572 lowpan_push_hc_data(hc_ptr, &tmp, sizeof(tmp));
576 /* destination port */ 573 /* destination port */
577 lowpan_push_hc_data(hc06_ptr, &uh->dest, sizeof(uh->dest)); 574 lowpan_push_hc_data(hc_ptr, &uh->dest, sizeof(uh->dest));
578 } else { 575 } else {
579 pr_debug("UDP header: can't compress\n"); 576 pr_debug("UDP header: can't compress\n");
580 /* compression value */ 577 /* compression value */
581 tmp = LOWPAN_NHC_UDP_CS_P_00; 578 tmp = LOWPAN_NHC_UDP_CS_P_00;
582 lowpan_push_hc_data(hc06_ptr, &tmp, sizeof(tmp)); 579 lowpan_push_hc_data(hc_ptr, &tmp, sizeof(tmp));
583 /* source port */ 580 /* source port */
584 lowpan_push_hc_data(hc06_ptr, &uh->source, sizeof(uh->source)); 581 lowpan_push_hc_data(hc_ptr, &uh->source, sizeof(uh->source));
585 /* destination port */ 582 /* destination port */
586 lowpan_push_hc_data(hc06_ptr, &uh->dest, sizeof(uh->dest)); 583 lowpan_push_hc_data(hc_ptr, &uh->dest, sizeof(uh->dest));
587 } 584 }
588 585
589 /* checksum is always inline */ 586 /* checksum is always inline */
590 lowpan_push_hc_data(hc06_ptr, &uh->check, sizeof(uh->check)); 587 lowpan_push_hc_data(hc_ptr, &uh->check, sizeof(uh->check));
591 588
592 /* skip the UDP header */ 589 /* skip the UDP header */
593 skb_pull(skb, sizeof(struct udphdr)); 590 skb_pull(skb, sizeof(struct udphdr));
@@ -597,15 +594,16 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
597 unsigned short type, const void *_daddr, 594 unsigned short type, const void *_daddr,
598 const void *_saddr, unsigned int len) 595 const void *_saddr, unsigned int len)
599{ 596{
600 u8 tmp, iphc0, iphc1, *hc06_ptr; 597 u8 tmp, iphc0, iphc1, *hc_ptr;
601 struct ipv6hdr *hdr; 598 struct ipv6hdr *hdr;
602 u8 head[100] = {}; 599 u8 head[100] = {};
600 int addr_type;
603 601
604 if (type != ETH_P_IPV6) 602 if (type != ETH_P_IPV6)
605 return -EINVAL; 603 return -EINVAL;
606 604
607 hdr = ipv6_hdr(skb); 605 hdr = ipv6_hdr(skb);
608 hc06_ptr = head + 2; 606 hc_ptr = head + 2;
609 607
610 pr_debug("IPv6 header dump:\n\tversion = %d\n\tlength = %d\n" 608 pr_debug("IPv6 header dump:\n\tversion = %d\n\tlength = %d\n"
611 "\tnexthdr = 0x%02x\n\thop_lim = %d\n\tdest = %pI6c\n", 609 "\tnexthdr = 0x%02x\n\thop_lim = %d\n\tdest = %pI6c\n",
@@ -630,8 +628,7 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
630 raw_dump_inline(__func__, "daddr", 628 raw_dump_inline(__func__, "daddr",
631 (unsigned char *)_daddr, IEEE802154_ADDR_LEN); 629 (unsigned char *)_daddr, IEEE802154_ADDR_LEN);
632 630
633 raw_dump_table(__func__, 631 raw_dump_table(__func__, "sending raw skb network uncompressed packet",
634 "sending raw skb network uncompressed packet",
635 skb->data, skb->len); 632 skb->data, skb->len);
636 633
637 /* Traffic class, flow label 634 /* Traffic class, flow label
@@ -640,7 +637,7 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
640 * class depends on the presence of version and flow label 637 * class depends on the presence of version and flow label
641 */ 638 */
642 639
643 /* hc06 format of TC is ECN | DSCP , original one is DSCP | ECN */ 640 /* hc format of TC is ECN | DSCP , original one is DSCP | ECN */
644 tmp = (hdr->priority << 4) | (hdr->flow_lbl[0] >> 4); 641 tmp = (hdr->priority << 4) | (hdr->flow_lbl[0] >> 4);
645 tmp = ((tmp & 0x03) << 6) | (tmp >> 2); 642 tmp = ((tmp & 0x03) << 6) | (tmp >> 2);
646 643
@@ -654,8 +651,8 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
654 iphc0 |= LOWPAN_IPHC_TC_C; 651 iphc0 |= LOWPAN_IPHC_TC_C;
655 } else { 652 } else {
656 /* compress only the flow label */ 653 /* compress only the flow label */
657 *hc06_ptr = tmp; 654 *hc_ptr = tmp;
658 hc06_ptr += 1; 655 hc_ptr += 1;
659 } 656 }
660 } else { 657 } else {
661 /* Flow label cannot be compressed */ 658 /* Flow label cannot be compressed */
@@ -663,15 +660,15 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
663 ((hdr->flow_lbl[0] & 0xF0) == 0)) { 660 ((hdr->flow_lbl[0] & 0xF0) == 0)) {
664 /* compress only traffic class */ 661 /* compress only traffic class */
665 iphc0 |= LOWPAN_IPHC_TC_C; 662 iphc0 |= LOWPAN_IPHC_TC_C;
666 *hc06_ptr = (tmp & 0xc0) | (hdr->flow_lbl[0] & 0x0F); 663 *hc_ptr = (tmp & 0xc0) | (hdr->flow_lbl[0] & 0x0F);
667 memcpy(hc06_ptr + 1, &hdr->flow_lbl[1], 2); 664 memcpy(hc_ptr + 1, &hdr->flow_lbl[1], 2);
668 hc06_ptr += 3; 665 hc_ptr += 3;
669 } else { 666 } else {
670 /* compress nothing */ 667 /* compress nothing */
671 memcpy(hc06_ptr, hdr, 4); 668 memcpy(hc_ptr, hdr, 4);
672 /* replace the top byte with new ECN | DSCP format */ 669 /* replace the top byte with new ECN | DSCP format */
673 *hc06_ptr = tmp; 670 *hc_ptr = tmp;
674 hc06_ptr += 4; 671 hc_ptr += 4;
675 } 672 }
676 } 673 }
677 674
@@ -681,10 +678,9 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
681 if (hdr->nexthdr == UIP_PROTO_UDP) 678 if (hdr->nexthdr == UIP_PROTO_UDP)
682 iphc0 |= LOWPAN_IPHC_NH_C; 679 iphc0 |= LOWPAN_IPHC_NH_C;
683 680
684 if ((iphc0 & LOWPAN_IPHC_NH_C) == 0) { 681 if ((iphc0 & LOWPAN_IPHC_NH_C) == 0)
685 *hc06_ptr = hdr->nexthdr; 682 lowpan_push_hc_data(&hc_ptr, &hdr->nexthdr,
686 hc06_ptr += 1; 683 sizeof(hdr->nexthdr));
687 }
688 684
689 /* Hop limit 685 /* Hop limit
690 * if 1: compress, encoding is 01 686 * if 1: compress, encoding is 01
@@ -703,84 +699,86 @@ int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev,
703 iphc0 |= LOWPAN_IPHC_TTL_255; 699 iphc0 |= LOWPAN_IPHC_TTL_255;
704 break; 700 break;
705 default: 701 default:
706 *hc06_ptr = hdr->hop_limit; 702 lowpan_push_hc_data(&hc_ptr, &hdr->hop_limit,
707 hc06_ptr += 1; 703 sizeof(hdr->hop_limit));
708 break;
709 } 704 }
710 705
706 addr_type = ipv6_addr_type(&hdr->saddr);
711 /* source address compression */ 707 /* source address compression */
712 if (is_addr_unspecified(&hdr->saddr)) { 708 if (addr_type == IPV6_ADDR_ANY) {
713 pr_debug("source address is unspecified, setting SAC\n"); 709 pr_debug("source address is unspecified, setting SAC\n");
714 iphc1 |= LOWPAN_IPHC_SAC; 710 iphc1 |= LOWPAN_IPHC_SAC;
715 /* TODO: context lookup */
716 } else if (is_addr_link_local(&hdr->saddr)) {
717 iphc1 |= lowpan_compress_addr_64(&hc06_ptr,
718 LOWPAN_IPHC_SAM_BIT, &hdr->saddr, _saddr);
719 pr_debug("source address unicast link-local %pI6c "
720 "iphc1 0x%02x\n", &hdr->saddr, iphc1);
721 } else { 711 } else {
722 pr_debug("send the full source address\n"); 712 if (addr_type & IPV6_ADDR_LINKLOCAL) {
723 memcpy(hc06_ptr, &hdr->saddr.s6_addr16[0], 16); 713 iphc1 |= lowpan_compress_addr_64(&hc_ptr,
724 hc06_ptr += 16; 714 LOWPAN_IPHC_SAM_BIT,
715 &hdr->saddr, _saddr);
716 pr_debug("source address unicast link-local %pI6c iphc1 0x%02x\n",
717 &hdr->saddr, iphc1);
718 } else {
719 pr_debug("send the full source address\n");
720 lowpan_push_hc_data(&hc_ptr, hdr->saddr.s6_addr, 16);
721 }
725 } 722 }
726 723
724 addr_type = ipv6_addr_type(&hdr->daddr);
727 /* destination address compression */ 725 /* destination address compression */
728 if (is_addr_mcast(&hdr->daddr)) { 726 if (addr_type & IPV6_ADDR_MULTICAST) {
729 pr_debug("destination address is multicast: "); 727 pr_debug("destination address is multicast: ");
730 iphc1 |= LOWPAN_IPHC_M; 728 iphc1 |= LOWPAN_IPHC_M;
731 if (lowpan_is_mcast_addr_compressable8(&hdr->daddr)) { 729 if (lowpan_is_mcast_addr_compressable8(&hdr->daddr)) {
732 pr_debug("compressed to 1 octet\n"); 730 pr_debug("compressed to 1 octet\n");
733 iphc1 |= LOWPAN_IPHC_DAM_11; 731 iphc1 |= LOWPAN_IPHC_DAM_11;
734 /* use last byte */ 732 /* use last byte */
735 *hc06_ptr = hdr->daddr.s6_addr[15]; 733 lowpan_push_hc_data(&hc_ptr,
736 hc06_ptr += 1; 734 &hdr->daddr.s6_addr[15], 1);
737 } else if (lowpan_is_mcast_addr_compressable32(&hdr->daddr)) { 735 } else if (lowpan_is_mcast_addr_compressable32(&hdr->daddr)) {
738 pr_debug("compressed to 4 octets\n"); 736 pr_debug("compressed to 4 octets\n");
739 iphc1 |= LOWPAN_IPHC_DAM_10; 737 iphc1 |= LOWPAN_IPHC_DAM_10;
740 /* second byte + the last three */ 738 /* second byte + the last three */
741 *hc06_ptr = hdr->daddr.s6_addr[1]; 739 lowpan_push_hc_data(&hc_ptr,
742 memcpy(hc06_ptr + 1, &hdr->daddr.s6_addr[13], 3); 740 &hdr->daddr.s6_addr[1], 1);
743 hc06_ptr += 4; 741 lowpan_push_hc_data(&hc_ptr,
742 &hdr->daddr.s6_addr[13], 3);
744 } else if (lowpan_is_mcast_addr_compressable48(&hdr->daddr)) { 743 } else if (lowpan_is_mcast_addr_compressable48(&hdr->daddr)) {
745 pr_debug("compressed to 6 octets\n"); 744 pr_debug("compressed to 6 octets\n");
746 iphc1 |= LOWPAN_IPHC_DAM_01; 745 iphc1 |= LOWPAN_IPHC_DAM_01;
747 /* second byte + the last five */ 746 /* second byte + the last five */
748 *hc06_ptr = hdr->daddr.s6_addr[1]; 747 lowpan_push_hc_data(&hc_ptr,
749 memcpy(hc06_ptr + 1, &hdr->daddr.s6_addr[11], 5); 748 &hdr->daddr.s6_addr[1], 1);
750 hc06_ptr += 6; 749 lowpan_push_hc_data(&hc_ptr,
750 &hdr->daddr.s6_addr[11], 5);
751 } else { 751 } else {
752 pr_debug("using full address\n"); 752 pr_debug("using full address\n");
753 iphc1 |= LOWPAN_IPHC_DAM_00; 753 iphc1 |= LOWPAN_IPHC_DAM_00;
754 memcpy(hc06_ptr, &hdr->daddr.s6_addr[0], 16); 754 lowpan_push_hc_data(&hc_ptr, hdr->daddr.s6_addr, 16);
755 hc06_ptr += 16;
756 } 755 }
757 } else { 756 } else {
758 /* TODO: context lookup */ 757 if (addr_type & IPV6_ADDR_LINKLOCAL) {
759 if (is_addr_link_local(&hdr->daddr)) { 758 /* TODO: context lookup */
760 iphc1 |= lowpan_compress_addr_64(&hc06_ptr, 759 iphc1 |= lowpan_compress_addr_64(&hc_ptr,
761 LOWPAN_IPHC_DAM_BIT, &hdr->daddr, _daddr); 760 LOWPAN_IPHC_DAM_BIT, &hdr->daddr, _daddr);
762 pr_debug("dest address unicast link-local %pI6c " 761 pr_debug("dest address unicast link-local %pI6c "
763 "iphc1 0x%02x\n", &hdr->daddr, iphc1); 762 "iphc1 0x%02x\n", &hdr->daddr, iphc1);
764 } else { 763 } else {
765 pr_debug("dest address unicast %pI6c\n", &hdr->daddr); 764 pr_debug("dest address unicast %pI6c\n", &hdr->daddr);
766 memcpy(hc06_ptr, &hdr->daddr.s6_addr16[0], 16); 765 lowpan_push_hc_data(&hc_ptr, hdr->daddr.s6_addr, 16);
767 hc06_ptr += 16;
768 } 766 }
769 } 767 }
770 768
771 /* UDP header compression */ 769 /* UDP header compression */
772 if (hdr->nexthdr == UIP_PROTO_UDP) 770 if (hdr->nexthdr == UIP_PROTO_UDP)
773 compress_udp_header(&hc06_ptr, skb); 771 compress_udp_header(&hc_ptr, skb);
774 772
775 head[0] = iphc0; 773 head[0] = iphc0;
776 head[1] = iphc1; 774 head[1] = iphc1;
777 775
778 skb_pull(skb, sizeof(struct ipv6hdr)); 776 skb_pull(skb, sizeof(struct ipv6hdr));
779 skb_reset_transport_header(skb); 777 skb_reset_transport_header(skb);
780 memcpy(skb_push(skb, hc06_ptr - head), head, hc06_ptr - head); 778 memcpy(skb_push(skb, hc_ptr - head), head, hc_ptr - head);
781 skb_reset_network_header(skb); 779 skb_reset_network_header(skb);
782 780
783 pr_debug("header len %d skb %u\n", (int)(hc06_ptr - head), skb->len); 781 pr_debug("header len %d skb %u\n", (int)(hc_ptr - head), skb->len);
784 782
785 raw_dump_table(__func__, "raw skb data dump compressed", 783 raw_dump_table(__func__, "raw skb data dump compressed",
786 skb->data, skb->len); 784 skb->data, skb->len);
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index cfcb6055ced8..32b96f1aaf42 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -970,6 +970,62 @@ static int adv_channel_map_get(void *data, u64 *val)
970DEFINE_SIMPLE_ATTRIBUTE(adv_channel_map_fops, adv_channel_map_get, 970DEFINE_SIMPLE_ATTRIBUTE(adv_channel_map_fops, adv_channel_map_get,
971 adv_channel_map_set, "%llu\n"); 971 adv_channel_map_set, "%llu\n");
972 972
973static int adv_min_interval_set(void *data, u64 val)
974{
975 struct hci_dev *hdev = data;
976
977 if (val < 0x0020 || val > 0x4000 || val > hdev->le_adv_max_interval)
978 return -EINVAL;
979
980 hci_dev_lock(hdev);
981 hdev->le_adv_min_interval = val;
982 hci_dev_unlock(hdev);
983
984 return 0;
985}
986
987static int adv_min_interval_get(void *data, u64 *val)
988{
989 struct hci_dev *hdev = data;
990
991 hci_dev_lock(hdev);
992 *val = hdev->le_adv_min_interval;
993 hci_dev_unlock(hdev);
994
995 return 0;
996}
997
998DEFINE_SIMPLE_ATTRIBUTE(adv_min_interval_fops, adv_min_interval_get,
999 adv_min_interval_set, "%llu\n");
1000
1001static int adv_max_interval_set(void *data, u64 val)
1002{
1003 struct hci_dev *hdev = data;
1004
1005 if (val < 0x0020 || val > 0x4000 || val < hdev->le_adv_min_interval)
1006 return -EINVAL;
1007
1008 hci_dev_lock(hdev);
1009 hdev->le_adv_max_interval = val;
1010 hci_dev_unlock(hdev);
1011
1012 return 0;
1013}
1014
1015static int adv_max_interval_get(void *data, u64 *val)
1016{
1017 struct hci_dev *hdev = data;
1018
1019 hci_dev_lock(hdev);
1020 *val = hdev->le_adv_max_interval;
1021 hci_dev_unlock(hdev);
1022
1023 return 0;
1024}
1025
1026DEFINE_SIMPLE_ATTRIBUTE(adv_max_interval_fops, adv_max_interval_get,
1027 adv_max_interval_set, "%llu\n");
1028
973static int device_list_show(struct seq_file *f, void *ptr) 1029static int device_list_show(struct seq_file *f, void *ptr)
974{ 1030{
975 struct hci_dev *hdev = f->private; 1031 struct hci_dev *hdev = f->private;
@@ -1567,7 +1623,7 @@ static void hci_set_le_support(struct hci_request *req)
1567 1623
1568 if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) { 1624 if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
1569 cp.le = 0x01; 1625 cp.le = 0x01;
1570 cp.simul = lmp_le_br_capable(hdev); 1626 cp.simul = 0x00;
1571 } 1627 }
1572 1628
1573 if (cp.le != lmp_host_le_capable(hdev)) 1629 if (cp.le != lmp_host_le_capable(hdev))
@@ -1686,6 +1742,14 @@ static void hci_init4_req(struct hci_request *req, unsigned long opt)
1686 if (hdev->commands[22] & 0x04) 1742 if (hdev->commands[22] & 0x04)
1687 hci_set_event_mask_page_2(req); 1743 hci_set_event_mask_page_2(req);
1688 1744
1745 /* Read local codec list if the HCI command is supported */
1746 if (hdev->commands[29] & 0x20)
1747 hci_req_add(req, HCI_OP_READ_LOCAL_CODECS, 0, NULL);
1748
1749 /* Get MWS transport configuration if the HCI command is supported */
1750 if (hdev->commands[30] & 0x08)
1751 hci_req_add(req, HCI_OP_GET_MWS_TRANSPORT_CONFIG, 0, NULL);
1752
1689 /* Check for Synchronization Train support */ 1753 /* Check for Synchronization Train support */
1690 if (lmp_sync_train_capable(hdev)) 1754 if (lmp_sync_train_capable(hdev))
1691 hci_req_add(req, HCI_OP_READ_SYNC_TRAIN_PARAMS, 0, NULL); 1755 hci_req_add(req, HCI_OP_READ_SYNC_TRAIN_PARAMS, 0, NULL);
@@ -1825,6 +1889,10 @@ static int __hci_init(struct hci_dev *hdev)
1825 hdev, &supervision_timeout_fops); 1889 hdev, &supervision_timeout_fops);
1826 debugfs_create_file("adv_channel_map", 0644, hdev->debugfs, 1890 debugfs_create_file("adv_channel_map", 0644, hdev->debugfs,
1827 hdev, &adv_channel_map_fops); 1891 hdev, &adv_channel_map_fops);
1892 debugfs_create_file("adv_min_interval", 0644, hdev->debugfs,
1893 hdev, &adv_min_interval_fops);
1894 debugfs_create_file("adv_max_interval", 0644, hdev->debugfs,
1895 hdev, &adv_max_interval_fops);
1828 debugfs_create_file("device_list", 0444, hdev->debugfs, hdev, 1896 debugfs_create_file("device_list", 0444, hdev->debugfs, hdev,
1829 &device_list_fops); 1897 &device_list_fops);
1830 debugfs_create_u16("discov_interleaved_timeout", 0644, 1898 debugfs_create_u16("discov_interleaved_timeout", 0644,
@@ -2453,14 +2521,14 @@ int hci_dev_open(__u16 dev)
2453 flush_workqueue(hdev->req_workqueue); 2521 flush_workqueue(hdev->req_workqueue);
2454 2522
2455 /* For controllers not using the management interface and that 2523 /* For controllers not using the management interface and that
2456 * are brought up using legacy ioctl, set the HCI_PAIRABLE bit 2524 * are brought up using legacy ioctl, set the HCI_BONDABLE bit
2457 * so that pairing works for them. Once the management interface 2525 * so that pairing works for them. Once the management interface
2458 * is in use this bit will be cleared again and userspace has 2526 * is in use this bit will be cleared again and userspace has
2459 * to explicitly enable it. 2527 * to explicitly enable it.
2460 */ 2528 */
2461 if (!test_bit(HCI_USER_CHANNEL, &hdev->dev_flags) && 2529 if (!test_bit(HCI_USER_CHANNEL, &hdev->dev_flags) &&
2462 !test_bit(HCI_MGMT, &hdev->dev_flags)) 2530 !test_bit(HCI_MGMT, &hdev->dev_flags))
2463 set_bit(HCI_PAIRABLE, &hdev->dev_flags); 2531 set_bit(HCI_BONDABLE, &hdev->dev_flags);
2464 2532
2465 err = hci_dev_do_open(hdev); 2533 err = hci_dev_do_open(hdev);
2466 2534
@@ -3639,6 +3707,7 @@ int hci_conn_params_set(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type,
3639 list_add(&params->action, &hdev->pend_le_reports); 3707 list_add(&params->action, &hdev->pend_le_reports);
3640 hci_update_background_scan(hdev); 3708 hci_update_background_scan(hdev);
3641 break; 3709 break;
3710 case HCI_AUTO_CONN_DIRECT:
3642 case HCI_AUTO_CONN_ALWAYS: 3711 case HCI_AUTO_CONN_ALWAYS:
3643 if (!is_connected(hdev, addr, addr_type)) { 3712 if (!is_connected(hdev, addr, addr_type)) {
3644 list_add(&params->action, &hdev->pend_le_conns); 3713 list_add(&params->action, &hdev->pend_le_conns);
@@ -3914,6 +3983,8 @@ struct hci_dev *hci_alloc_dev(void)
3914 hdev->sniff_min_interval = 80; 3983 hdev->sniff_min_interval = 80;
3915 3984
3916 hdev->le_adv_channel_map = 0x07; 3985 hdev->le_adv_channel_map = 0x07;
3986 hdev->le_adv_min_interval = 0x0800;
3987 hdev->le_adv_max_interval = 0x0800;
3917 hdev->le_scan_interval = 0x0060; 3988 hdev->le_scan_interval = 0x0060;
3918 hdev->le_scan_window = 0x0030; 3989 hdev->le_scan_window = 0x0030;
3919 hdev->le_conn_min_interval = 0x0028; 3990 hdev->le_conn_min_interval = 0x0028;
@@ -5397,12 +5468,113 @@ void hci_req_add_le_scan_disable(struct hci_request *req)
5397 hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(cp), &cp); 5468 hci_req_add(req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(cp), &cp);
5398} 5469}
5399 5470
5471static void add_to_white_list(struct hci_request *req,
5472 struct hci_conn_params *params)
5473{
5474 struct hci_cp_le_add_to_white_list cp;
5475
5476 cp.bdaddr_type = params->addr_type;
5477 bacpy(&cp.bdaddr, &params->addr);
5478
5479 hci_req_add(req, HCI_OP_LE_ADD_TO_WHITE_LIST, sizeof(cp), &cp);
5480}
5481
5482static u8 update_white_list(struct hci_request *req)
5483{
5484 struct hci_dev *hdev = req->hdev;
5485 struct hci_conn_params *params;
5486 struct bdaddr_list *b;
5487 uint8_t white_list_entries = 0;
5488
5489 /* Go through the current white list programmed into the
5490 * controller one by one and check if that address is still
5491 * in the list of pending connections or list of devices to
5492 * report. If not present in either list, then queue the
5493 * command to remove it from the controller.
5494 */
5495 list_for_each_entry(b, &hdev->le_white_list, list) {
5496 struct hci_cp_le_del_from_white_list cp;
5497
5498 if (hci_pend_le_action_lookup(&hdev->pend_le_conns,
5499 &b->bdaddr, b->bdaddr_type) ||
5500 hci_pend_le_action_lookup(&hdev->pend_le_reports,
5501 &b->bdaddr, b->bdaddr_type)) {
5502 white_list_entries++;
5503 continue;
5504 }
5505
5506 cp.bdaddr_type = b->bdaddr_type;
5507 bacpy(&cp.bdaddr, &b->bdaddr);
5508
5509 hci_req_add(req, HCI_OP_LE_DEL_FROM_WHITE_LIST,
5510 sizeof(cp), &cp);
5511 }
5512
5513 /* Since all no longer valid white list entries have been
5514 * removed, walk through the list of pending connections
5515 * and ensure that any new device gets programmed into
5516 * the controller.
5517 *
5518 * If the list of the devices is larger than the list of
5519 * available white list entries in the controller, then
5520 * just abort and return filer policy value to not use the
5521 * white list.
5522 */
5523 list_for_each_entry(params, &hdev->pend_le_conns, action) {
5524 if (hci_bdaddr_list_lookup(&hdev->le_white_list,
5525 &params->addr, params->addr_type))
5526 continue;
5527
5528 if (white_list_entries >= hdev->le_white_list_size) {
5529 /* Select filter policy to accept all advertising */
5530 return 0x00;
5531 }
5532
5533 if (hci_find_irk_by_addr(hdev, &params->addr,
5534 params->addr_type)) {
5535 /* White list can not be used with RPAs */
5536 return 0x00;
5537 }
5538
5539 white_list_entries++;
5540 add_to_white_list(req, params);
5541 }
5542
5543 /* After adding all new pending connections, walk through
5544 * the list of pending reports and also add these to the
5545 * white list if there is still space.
5546 */
5547 list_for_each_entry(params, &hdev->pend_le_reports, action) {
5548 if (hci_bdaddr_list_lookup(&hdev->le_white_list,
5549 &params->addr, params->addr_type))
5550 continue;
5551
5552 if (white_list_entries >= hdev->le_white_list_size) {
5553 /* Select filter policy to accept all advertising */
5554 return 0x00;
5555 }
5556
5557 if (hci_find_irk_by_addr(hdev, &params->addr,
5558 params->addr_type)) {
5559 /* White list can not be used with RPAs */
5560 return 0x00;
5561 }
5562
5563 white_list_entries++;
5564 add_to_white_list(req, params);
5565 }
5566
5567 /* Select filter policy to use white list */
5568 return 0x01;
5569}
5570
5400void hci_req_add_le_passive_scan(struct hci_request *req) 5571void hci_req_add_le_passive_scan(struct hci_request *req)
5401{ 5572{
5402 struct hci_cp_le_set_scan_param param_cp; 5573 struct hci_cp_le_set_scan_param param_cp;
5403 struct hci_cp_le_set_scan_enable enable_cp; 5574 struct hci_cp_le_set_scan_enable enable_cp;
5404 struct hci_dev *hdev = req->hdev; 5575 struct hci_dev *hdev = req->hdev;
5405 u8 own_addr_type; 5576 u8 own_addr_type;
5577 u8 filter_policy;
5406 5578
5407 /* Set require_privacy to false since no SCAN_REQ are send 5579 /* Set require_privacy to false since no SCAN_REQ are send
5408 * during passive scanning. Not using an unresolvable address 5580 * during passive scanning. Not using an unresolvable address
@@ -5413,11 +5585,18 @@ void hci_req_add_le_passive_scan(struct hci_request *req)
5413 if (hci_update_random_address(req, false, &own_addr_type)) 5585 if (hci_update_random_address(req, false, &own_addr_type))
5414 return; 5586 return;
5415 5587
5588 /* Adding or removing entries from the white list must
5589 * happen before enabling scanning. The controller does
5590 * not allow white list modification while scanning.
5591 */
5592 filter_policy = update_white_list(req);
5593
5416 memset(&param_cp, 0, sizeof(param_cp)); 5594 memset(&param_cp, 0, sizeof(param_cp));
5417 param_cp.type = LE_SCAN_PASSIVE; 5595 param_cp.type = LE_SCAN_PASSIVE;
5418 param_cp.interval = cpu_to_le16(hdev->le_scan_interval); 5596 param_cp.interval = cpu_to_le16(hdev->le_scan_interval);
5419 param_cp.window = cpu_to_le16(hdev->le_scan_window); 5597 param_cp.window = cpu_to_le16(hdev->le_scan_window);
5420 param_cp.own_address_type = own_addr_type; 5598 param_cp.own_address_type = own_addr_type;
5599 param_cp.filter_policy = filter_policy;
5421 hci_req_add(req, HCI_OP_LE_SET_SCAN_PARAM, sizeof(param_cp), 5600 hci_req_add(req, HCI_OP_LE_SET_SCAN_PARAM, sizeof(param_cp),
5422 &param_cp); 5601 &param_cp);
5423 5602
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 4c41774aa556..be35598984d9 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -317,7 +317,7 @@ static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb)
317 if (param & SCAN_PAGE) 317 if (param & SCAN_PAGE)
318 set_bit(HCI_PSCAN, &hdev->flags); 318 set_bit(HCI_PSCAN, &hdev->flags);
319 else 319 else
320 clear_bit(HCI_ISCAN, &hdev->flags); 320 clear_bit(HCI_PSCAN, &hdev->flags);
321 321
322done: 322done:
323 hci_dev_unlock(hdev); 323 hci_dev_unlock(hdev);
@@ -2259,6 +2259,7 @@ static void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
2259 break; 2259 break;
2260 /* Fall through */ 2260 /* Fall through */
2261 2261
2262 case HCI_AUTO_CONN_DIRECT:
2262 case HCI_AUTO_CONN_ALWAYS: 2263 case HCI_AUTO_CONN_ALWAYS:
2263 list_del_init(&params->action); 2264 list_del_init(&params->action);
2264 list_add(&params->action, &hdev->pend_le_conns); 2265 list_add(&params->action, &hdev->pend_le_conns);
@@ -3118,7 +3119,7 @@ static void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
3118 hci_conn_drop(conn); 3119 hci_conn_drop(conn);
3119 } 3120 }
3120 3121
3121 if (!test_bit(HCI_PAIRABLE, &hdev->dev_flags) && 3122 if (!test_bit(HCI_BONDABLE, &hdev->dev_flags) &&
3122 !test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags)) { 3123 !test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags)) {
3123 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY, 3124 hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
3124 sizeof(ev->bdaddr), &ev->bdaddr); 3125 sizeof(ev->bdaddr), &ev->bdaddr);
@@ -3651,7 +3652,7 @@ static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
3651 /* Allow pairing if we're pairable, the initiators of the 3652 /* Allow pairing if we're pairable, the initiators of the
3652 * pairing or if the remote is not requesting bonding. 3653 * pairing or if the remote is not requesting bonding.
3653 */ 3654 */
3654 if (test_bit(HCI_PAIRABLE, &hdev->dev_flags) || 3655 if (test_bit(HCI_BONDABLE, &hdev->dev_flags) ||
3655 test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags) || 3656 test_bit(HCI_CONN_AUTH_INITIATOR, &conn->flags) ||
3656 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) { 3657 (conn->remote_auth & ~0x01) == HCI_AT_NO_BONDING) {
3657 struct hci_cp_io_capability_reply cp; 3658 struct hci_cp_io_capability_reply cp;
@@ -3670,13 +3671,18 @@ static void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
3670 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT && 3671 if (conn->io_capability != HCI_IO_NO_INPUT_OUTPUT &&
3671 conn->auth_type != HCI_AT_NO_BONDING) 3672 conn->auth_type != HCI_AT_NO_BONDING)
3672 conn->auth_type |= 0x01; 3673 conn->auth_type |= 0x01;
3673
3674 cp.authentication = conn->auth_type;
3675 } else { 3674 } else {
3676 conn->auth_type = hci_get_auth_req(conn); 3675 conn->auth_type = hci_get_auth_req(conn);
3677 cp.authentication = conn->auth_type;
3678 } 3676 }
3679 3677
3678 /* If we're not bondable, force one of the non-bondable
3679 * authentication requirement values.
3680 */
3681 if (!test_bit(HCI_BONDABLE, &hdev->dev_flags))
3682 conn->auth_type &= HCI_AT_NO_BONDING_MITM;
3683
3684 cp.authentication = conn->auth_type;
3685
3680 if (hci_find_remote_oob_data(hdev, &conn->dst) && 3686 if (hci_find_remote_oob_data(hdev, &conn->dst) &&
3681 (conn->out || test_bit(HCI_CONN_REMOTE_OOB, &conn->flags))) 3687 (conn->out || test_bit(HCI_CONN_REMOTE_OOB, &conn->flags)))
3682 cp.oob_data = 0x01; 3688 cp.oob_data = 0x01;
@@ -4251,6 +4257,7 @@ static void check_pending_le_conn(struct hci_dev *hdev, bdaddr_t *addr,
4251 u8 addr_type, u8 adv_type) 4257 u8 addr_type, u8 adv_type)
4252{ 4258{
4253 struct hci_conn *conn; 4259 struct hci_conn *conn;
4260 struct hci_conn_params *params;
4254 4261
4255 /* If the event is not connectable don't proceed further */ 4262 /* If the event is not connectable don't proceed further */
4256 if (adv_type != LE_ADV_IND && adv_type != LE_ADV_DIRECT_IND) 4263 if (adv_type != LE_ADV_IND && adv_type != LE_ADV_DIRECT_IND)
@@ -4266,18 +4273,35 @@ static void check_pending_le_conn(struct hci_dev *hdev, bdaddr_t *addr,
4266 if (hdev->conn_hash.le_num_slave > 0) 4273 if (hdev->conn_hash.le_num_slave > 0)
4267 return; 4274 return;
4268 4275
4269 /* If we're connectable, always connect any ADV_DIRECT_IND event */
4270 if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags) &&
4271 adv_type == LE_ADV_DIRECT_IND)
4272 goto connect;
4273
4274 /* If we're not connectable only connect devices that we have in 4276 /* If we're not connectable only connect devices that we have in
4275 * our pend_le_conns list. 4277 * our pend_le_conns list.
4276 */ 4278 */
4277 if (!hci_pend_le_action_lookup(&hdev->pend_le_conns, addr, addr_type)) 4279 params = hci_pend_le_action_lookup(&hdev->pend_le_conns,
4280 addr, addr_type);
4281 if (!params)
4282 return;
4283
4284 switch (params->auto_connect) {
4285 case HCI_AUTO_CONN_DIRECT:
4286 /* Only devices advertising with ADV_DIRECT_IND are
4287 * triggering a connection attempt. This is allowing
4288 * incoming connections from slave devices.
4289 */
4290 if (adv_type != LE_ADV_DIRECT_IND)
4291 return;
4292 break;
4293 case HCI_AUTO_CONN_ALWAYS:
4294 /* Devices advertising with ADV_IND or ADV_DIRECT_IND
4295 * are triggering a connection attempt. This means
4296 * that incoming connectioms from slave device are
4297 * accepted and also outgoing connections to slave
4298 * devices are established when found.
4299 */
4300 break;
4301 default:
4278 return; 4302 return;
4303 }
4279 4304
4280connect:
4281 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW, 4305 conn = hci_connect_le(hdev, addr, addr_type, BT_SECURITY_LOW,
4282 HCI_LE_AUTOCONN_TIMEOUT, HCI_ROLE_MASTER); 4306 HCI_LE_AUTOCONN_TIMEOUT, HCI_ROLE_MASTER);
4283 if (!IS_ERR(conn)) 4307 if (!IS_ERR(conn))
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c
index 8181ea4bc2f2..6c7ecf116e74 100644
--- a/net/bluetooth/hidp/core.c
+++ b/net/bluetooth/hidp/core.c
@@ -154,7 +154,7 @@ static int hidp_input_event(struct input_dev *dev, unsigned int type,
154 (!!test_bit(LED_COMPOSE, dev->led) << 3) | 154 (!!test_bit(LED_COMPOSE, dev->led) << 3) |
155 (!!test_bit(LED_SCROLLL, dev->led) << 2) | 155 (!!test_bit(LED_SCROLLL, dev->led) << 2) |
156 (!!test_bit(LED_CAPSL, dev->led) << 1) | 156 (!!test_bit(LED_CAPSL, dev->led) << 1) |
157 (!!test_bit(LED_NUML, dev->led)); 157 (!!test_bit(LED_NUML, dev->led) << 0);
158 158
159 if (session->leds == newleds) 159 if (session->leds == newleds)
160 return 0; 160 return 0;
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 190668367e42..b8554d429d88 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -44,7 +44,7 @@ static const u16 mgmt_commands[] = {
44 MGMT_OP_SET_DISCOVERABLE, 44 MGMT_OP_SET_DISCOVERABLE,
45 MGMT_OP_SET_CONNECTABLE, 45 MGMT_OP_SET_CONNECTABLE,
46 MGMT_OP_SET_FAST_CONNECTABLE, 46 MGMT_OP_SET_FAST_CONNECTABLE,
47 MGMT_OP_SET_PAIRABLE, 47 MGMT_OP_SET_BONDABLE,
48 MGMT_OP_SET_LINK_SECURITY, 48 MGMT_OP_SET_LINK_SECURITY,
49 MGMT_OP_SET_SSP, 49 MGMT_OP_SET_SSP,
50 MGMT_OP_SET_HS, 50 MGMT_OP_SET_HS,
@@ -553,7 +553,7 @@ static u32 get_supported_settings(struct hci_dev *hdev)
553 u32 settings = 0; 553 u32 settings = 0;
554 554
555 settings |= MGMT_SETTING_POWERED; 555 settings |= MGMT_SETTING_POWERED;
556 settings |= MGMT_SETTING_PAIRABLE; 556 settings |= MGMT_SETTING_BONDABLE;
557 settings |= MGMT_SETTING_DEBUG_KEYS; 557 settings |= MGMT_SETTING_DEBUG_KEYS;
558 settings |= MGMT_SETTING_CONNECTABLE; 558 settings |= MGMT_SETTING_CONNECTABLE;
559 settings |= MGMT_SETTING_DISCOVERABLE; 559 settings |= MGMT_SETTING_DISCOVERABLE;
@@ -603,8 +603,8 @@ static u32 get_current_settings(struct hci_dev *hdev)
603 if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) 603 if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
604 settings |= MGMT_SETTING_DISCOVERABLE; 604 settings |= MGMT_SETTING_DISCOVERABLE;
605 605
606 if (test_bit(HCI_PAIRABLE, &hdev->dev_flags)) 606 if (test_bit(HCI_BONDABLE, &hdev->dev_flags))
607 settings |= MGMT_SETTING_PAIRABLE; 607 settings |= MGMT_SETTING_BONDABLE;
608 608
609 if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) 609 if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
610 settings |= MGMT_SETTING_BREDR; 610 settings |= MGMT_SETTING_BREDR;
@@ -1086,8 +1086,8 @@ static void enable_advertising(struct hci_request *req)
1086 return; 1086 return;
1087 1087
1088 memset(&cp, 0, sizeof(cp)); 1088 memset(&cp, 0, sizeof(cp));
1089 cp.min_interval = cpu_to_le16(0x0800); 1089 cp.min_interval = cpu_to_le16(hdev->le_adv_min_interval);
1090 cp.max_interval = cpu_to_le16(0x0800); 1090 cp.max_interval = cpu_to_le16(hdev->le_adv_max_interval);
1091 cp.type = connectable ? LE_ADV_IND : LE_ADV_NONCONN_IND; 1091 cp.type = connectable ? LE_ADV_IND : LE_ADV_NONCONN_IND;
1092 cp.own_address_type = own_addr_type; 1092 cp.own_address_type = own_addr_type;
1093 cp.channel_map = hdev->le_adv_channel_map; 1093 cp.channel_map = hdev->le_adv_channel_map;
@@ -1152,7 +1152,7 @@ static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev)
1152 * for mgmt we require user-space to explicitly enable 1152 * for mgmt we require user-space to explicitly enable
1153 * it 1153 * it
1154 */ 1154 */
1155 clear_bit(HCI_PAIRABLE, &hdev->dev_flags); 1155 clear_bit(HCI_BONDABLE, &hdev->dev_flags);
1156} 1156}
1157 1157
1158static int read_controller_info(struct sock *sk, struct hci_dev *hdev, 1158static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
@@ -1881,7 +1881,18 @@ static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
1881 if (cp->val) { 1881 if (cp->val) {
1882 scan = SCAN_PAGE; 1882 scan = SCAN_PAGE;
1883 } else { 1883 } else {
1884 scan = 0; 1884 /* If we don't have any whitelist entries just
1885 * disable all scanning. If there are entries
1886 * and we had both page and inquiry scanning
1887 * enabled then fall back to only page scanning.
1888 * Otherwise no changes are needed.
1889 */
1890 if (list_empty(&hdev->whitelist))
1891 scan = SCAN_DISABLED;
1892 else if (test_bit(HCI_ISCAN, &hdev->flags))
1893 scan = SCAN_PAGE;
1894 else
1895 goto no_scan_update;
1885 1896
1886 if (test_bit(HCI_ISCAN, &hdev->flags) && 1897 if (test_bit(HCI_ISCAN, &hdev->flags) &&
1887 hdev->discov_timeout > 0) 1898 hdev->discov_timeout > 0)
@@ -1891,6 +1902,7 @@ static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
1891 hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan); 1902 hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
1892 } 1903 }
1893 1904
1905no_scan_update:
1894 /* If we're going from non-connectable to connectable or 1906 /* If we're going from non-connectable to connectable or
1895 * vice-versa when fast connectable is enabled ensure that fast 1907 * vice-versa when fast connectable is enabled ensure that fast
1896 * connectable gets disabled. write_fast_connectable won't do 1908 * connectable gets disabled. write_fast_connectable won't do
@@ -1918,7 +1930,7 @@ failed:
1918 return err; 1930 return err;
1919} 1931}
1920 1932
1921static int set_pairable(struct sock *sk, struct hci_dev *hdev, void *data, 1933static int set_bondable(struct sock *sk, struct hci_dev *hdev, void *data,
1922 u16 len) 1934 u16 len)
1923{ 1935{
1924 struct mgmt_mode *cp = data; 1936 struct mgmt_mode *cp = data;
@@ -1928,17 +1940,17 @@ static int set_pairable(struct sock *sk, struct hci_dev *hdev, void *data,
1928 BT_DBG("request for %s", hdev->name); 1940 BT_DBG("request for %s", hdev->name);
1929 1941
1930 if (cp->val != 0x00 && cp->val != 0x01) 1942 if (cp->val != 0x00 && cp->val != 0x01)
1931 return cmd_status(sk, hdev->id, MGMT_OP_SET_PAIRABLE, 1943 return cmd_status(sk, hdev->id, MGMT_OP_SET_BONDABLE,
1932 MGMT_STATUS_INVALID_PARAMS); 1944 MGMT_STATUS_INVALID_PARAMS);
1933 1945
1934 hci_dev_lock(hdev); 1946 hci_dev_lock(hdev);
1935 1947
1936 if (cp->val) 1948 if (cp->val)
1937 changed = !test_and_set_bit(HCI_PAIRABLE, &hdev->dev_flags); 1949 changed = !test_and_set_bit(HCI_BONDABLE, &hdev->dev_flags);
1938 else 1950 else
1939 changed = test_and_clear_bit(HCI_PAIRABLE, &hdev->dev_flags); 1951 changed = test_and_clear_bit(HCI_BONDABLE, &hdev->dev_flags);
1940 1952
1941 err = send_settings_rsp(sk, MGMT_OP_SET_PAIRABLE, hdev); 1953 err = send_settings_rsp(sk, MGMT_OP_SET_BONDABLE, hdev);
1942 if (err < 0) 1954 if (err < 0)
1943 goto unlock; 1955 goto unlock;
1944 1956
@@ -2264,7 +2276,7 @@ static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
2264 2276
2265 if (val) { 2277 if (val) {
2266 hci_cp.le = val; 2278 hci_cp.le = val;
2267 hci_cp.simul = lmp_le_br_capable(hdev); 2279 hci_cp.simul = 0x00;
2268 } else { 2280 } else {
2269 if (test_bit(HCI_LE_ADV, &hdev->dev_flags)) 2281 if (test_bit(HCI_LE_ADV, &hdev->dev_flags))
2270 disable_advertising(&req); 2282 disable_advertising(&req);
@@ -3201,7 +3213,7 @@ static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
3201 conn->io_capability = cp->io_cap; 3213 conn->io_capability = cp->io_cap;
3202 cmd->user_data = conn; 3214 cmd->user_data = conn;
3203 3215
3204 if (conn->state == BT_CONNECTED && 3216 if ((conn->state == BT_CONNECTED || conn->state == BT_CONFIG) &&
3205 hci_conn_security(conn, sec_level, auth_type, true)) 3217 hci_conn_security(conn, sec_level, auth_type, true))
3206 pairing_complete(cmd, 0); 3218 pairing_complete(cmd, 0);
3207 3219
@@ -5271,7 +5283,7 @@ static int add_device(struct sock *sk, struct hci_dev *hdev,
5271 MGMT_STATUS_INVALID_PARAMS, 5283 MGMT_STATUS_INVALID_PARAMS,
5272 &cp->addr, sizeof(cp->addr)); 5284 &cp->addr, sizeof(cp->addr));
5273 5285
5274 if (cp->action != 0x00 && cp->action != 0x01) 5286 if (cp->action != 0x00 && cp->action != 0x01 && cp->action != 0x02)
5275 return cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, 5287 return cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
5276 MGMT_STATUS_INVALID_PARAMS, 5288 MGMT_STATUS_INVALID_PARAMS,
5277 &cp->addr, sizeof(cp->addr)); 5289 &cp->addr, sizeof(cp->addr));
@@ -5281,7 +5293,7 @@ static int add_device(struct sock *sk, struct hci_dev *hdev,
5281 if (cp->addr.type == BDADDR_BREDR) { 5293 if (cp->addr.type == BDADDR_BREDR) {
5282 bool update_scan; 5294 bool update_scan;
5283 5295
5284 /* Only "connect" action supported for now */ 5296 /* Only incoming connections action is supported for now */
5285 if (cp->action != 0x01) { 5297 if (cp->action != 0x01) {
5286 err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE, 5298 err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_DEVICE,
5287 MGMT_STATUS_INVALID_PARAMS, 5299 MGMT_STATUS_INVALID_PARAMS,
@@ -5307,8 +5319,10 @@ static int add_device(struct sock *sk, struct hci_dev *hdev,
5307 else 5319 else
5308 addr_type = ADDR_LE_DEV_RANDOM; 5320 addr_type = ADDR_LE_DEV_RANDOM;
5309 5321
5310 if (cp->action) 5322 if (cp->action == 0x02)
5311 auto_conn = HCI_AUTO_CONN_ALWAYS; 5323 auto_conn = HCI_AUTO_CONN_ALWAYS;
5324 else if (cp->action == 0x01)
5325 auto_conn = HCI_AUTO_CONN_DIRECT;
5312 else 5326 else
5313 auto_conn = HCI_AUTO_CONN_REPORT; 5327 auto_conn = HCI_AUTO_CONN_REPORT;
5314 5328
@@ -5665,7 +5679,7 @@ static const struct mgmt_handler {
5665 { set_discoverable, false, MGMT_SET_DISCOVERABLE_SIZE }, 5679 { set_discoverable, false, MGMT_SET_DISCOVERABLE_SIZE },
5666 { set_connectable, false, MGMT_SETTING_SIZE }, 5680 { set_connectable, false, MGMT_SETTING_SIZE },
5667 { set_fast_connectable, false, MGMT_SETTING_SIZE }, 5681 { set_fast_connectable, false, MGMT_SETTING_SIZE },
5668 { set_pairable, false, MGMT_SETTING_SIZE }, 5682 { set_bondable, false, MGMT_SETTING_SIZE },
5669 { set_link_security, false, MGMT_SETTING_SIZE }, 5683 { set_link_security, false, MGMT_SETTING_SIZE },
5670 { set_ssp, false, MGMT_SETTING_SIZE }, 5684 { set_ssp, false, MGMT_SETTING_SIZE },
5671 { set_hs, false, MGMT_SETTING_SIZE }, 5685 { set_hs, false, MGMT_SETTING_SIZE },
@@ -5870,6 +5884,7 @@ static void restart_le_actions(struct hci_dev *hdev)
5870 list_del_init(&p->action); 5884 list_del_init(&p->action);
5871 5885
5872 switch (p->auto_connect) { 5886 switch (p->auto_connect) {
5887 case HCI_AUTO_CONN_DIRECT:
5873 case HCI_AUTO_CONN_ALWAYS: 5888 case HCI_AUTO_CONN_ALWAYS:
5874 list_add(&p->action, &hdev->pend_le_conns); 5889 list_add(&p->action, &hdev->pend_le_conns);
5875 break; 5890 break;
@@ -5922,8 +5937,8 @@ static int powered_update_hci(struct hci_dev *hdev)
5922 lmp_bredr_capable(hdev)) { 5937 lmp_bredr_capable(hdev)) {
5923 struct hci_cp_write_le_host_supported cp; 5938 struct hci_cp_write_le_host_supported cp;
5924 5939
5925 cp.le = 1; 5940 cp.le = 0x01;
5926 cp.simul = lmp_le_br_capable(hdev); 5941 cp.simul = 0x00;
5927 5942
5928 /* Check first if we already have the right 5943 /* Check first if we already have the right
5929 * host state (host features set) 5944 * host state (host features set)
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c
index a0690a84f3e9..af73bc3acb40 100644
--- a/net/bluetooth/rfcomm/core.c
+++ b/net/bluetooth/rfcomm/core.c
@@ -1910,10 +1910,13 @@ static struct rfcomm_session *rfcomm_process_rx(struct rfcomm_session *s)
1910 /* Get data directly from socket receive queue without copying it. */ 1910 /* Get data directly from socket receive queue without copying it. */
1911 while ((skb = skb_dequeue(&sk->sk_receive_queue))) { 1911 while ((skb = skb_dequeue(&sk->sk_receive_queue))) {
1912 skb_orphan(skb); 1912 skb_orphan(skb);
1913 if (!skb_linearize(skb)) 1913 if (!skb_linearize(skb)) {
1914 s = rfcomm_recv_frame(s, skb); 1914 s = rfcomm_recv_frame(s, skb);
1915 else 1915 if (!s)
1916 break;
1917 } else {
1916 kfree_skb(skb); 1918 kfree_skb(skb);
1919 }
1917 } 1920 }
1918 1921
1919 if (s && (sk->sk_state == BT_CLOSED)) 1922 if (s && (sk->sk_state == BT_CLOSED))
diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c
index e49c83d8b957..fd3294300803 100644
--- a/net/bluetooth/smp.c
+++ b/net/bluetooth/smp.c
@@ -307,7 +307,7 @@ static void build_pairing_cmd(struct l2cap_conn *conn,
307 struct hci_dev *hdev = hcon->hdev; 307 struct hci_dev *hdev = hcon->hdev;
308 u8 local_dist = 0, remote_dist = 0; 308 u8 local_dist = 0, remote_dist = 0;
309 309
310 if (test_bit(HCI_PAIRABLE, &conn->hcon->hdev->dev_flags)) { 310 if (test_bit(HCI_BONDABLE, &conn->hcon->hdev->dev_flags)) {
311 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN; 311 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
312 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN; 312 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
313 authreq |= SMP_AUTH_BONDING; 313 authreq |= SMP_AUTH_BONDING;
@@ -579,13 +579,16 @@ static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
579 struct smp_chan *smp; 579 struct smp_chan *smp;
580 580
581 smp = kzalloc(sizeof(*smp), GFP_ATOMIC); 581 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
582 if (!smp) 582 if (!smp) {
583 clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags);
583 return NULL; 584 return NULL;
585 }
584 586
585 smp->tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC); 587 smp->tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
586 if (IS_ERR(smp->tfm_aes)) { 588 if (IS_ERR(smp->tfm_aes)) {
587 BT_ERR("Unable to create ECB crypto context"); 589 BT_ERR("Unable to create ECB crypto context");
588 kfree(smp); 590 kfree(smp);
591 clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags);
589 return NULL; 592 return NULL;
590 } 593 }
591 594
@@ -701,7 +704,7 @@ static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
701 if (!smp) 704 if (!smp)
702 return SMP_UNSPECIFIED; 705 return SMP_UNSPECIFIED;
703 706
704 if (!test_bit(HCI_PAIRABLE, &hdev->dev_flags) && 707 if (!test_bit(HCI_BONDABLE, &hdev->dev_flags) &&
705 (req->auth_req & SMP_AUTH_BONDING)) 708 (req->auth_req & SMP_AUTH_BONDING))
706 return SMP_PAIRING_NOTSUPP; 709 return SMP_PAIRING_NOTSUPP;
707 710
@@ -923,14 +926,14 @@ static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
923 if (test_and_set_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags)) 926 if (test_and_set_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags))
924 return 0; 927 return 0;
925 928
926 if (!test_bit(HCI_PAIRABLE, &hcon->hdev->dev_flags) &&
927 (rp->auth_req & SMP_AUTH_BONDING))
928 return SMP_PAIRING_NOTSUPP;
929
930 smp = smp_chan_create(conn); 929 smp = smp_chan_create(conn);
931 if (!smp) 930 if (!smp)
932 return SMP_UNSPECIFIED; 931 return SMP_UNSPECIFIED;
933 932
933 if (!test_bit(HCI_BONDABLE, &hcon->hdev->dev_flags) &&
934 (rp->auth_req & SMP_AUTH_BONDING))
935 return SMP_PAIRING_NOTSUPP;
936
934 skb_pull(skb, sizeof(*rp)); 937 skb_pull(skb, sizeof(*rp));
935 938
936 memset(&cp, 0, sizeof(cp)); 939 memset(&cp, 0, sizeof(cp));
@@ -1291,6 +1294,22 @@ static void smp_notify_keys(struct l2cap_conn *conn)
1291 bacpy(&hcon->dst, &smp->remote_irk->bdaddr); 1294 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
1292 hcon->dst_type = smp->remote_irk->addr_type; 1295 hcon->dst_type = smp->remote_irk->addr_type;
1293 l2cap_conn_update_id_addr(hcon); 1296 l2cap_conn_update_id_addr(hcon);
1297
1298 /* When receiving an indentity resolving key for
1299 * a remote device that does not use a resolvable
1300 * private address, just remove the key so that
1301 * it is possible to use the controller white
1302 * list for scanning.
1303 *
1304 * Userspace will have been told to not store
1305 * this key at this point. So it is safe to
1306 * just remove it.
1307 */
1308 if (!bacmp(&smp->remote_irk->rpa, BDADDR_ANY)) {
1309 list_del(&smp->remote_irk->list);
1310 kfree(smp->remote_irk);
1311 smp->remote_irk = NULL;
1312 }
1294 } 1313 }
1295 1314
1296 /* The LTKs and CSRKs should be persistent only if both sides 1315 /* The LTKs and CSRKs should be persistent only if both sides
diff --git a/net/nfc/digital.h b/net/nfc/digital.h
index 71ad7eefddd4..3c39c72eb038 100644
--- a/net/nfc/digital.h
+++ b/net/nfc/digital.h
@@ -29,6 +29,7 @@
29#define DIGITAL_CMD_TG_SEND 1 29#define DIGITAL_CMD_TG_SEND 1
30#define DIGITAL_CMD_TG_LISTEN 2 30#define DIGITAL_CMD_TG_LISTEN 2
31#define DIGITAL_CMD_TG_LISTEN_MDAA 3 31#define DIGITAL_CMD_TG_LISTEN_MDAA 3
32#define DIGITAL_CMD_TG_LISTEN_MD 4
32 33
33#define DIGITAL_MAX_HEADER_LEN 7 34#define DIGITAL_MAX_HEADER_LEN 7
34#define DIGITAL_CRC_LEN 2 35#define DIGITAL_CRC_LEN 2
@@ -121,6 +122,8 @@ int digital_tg_send_dep_res(struct nfc_digital_dev *ddev, struct sk_buff *skb);
121 122
122int digital_tg_listen_nfca(struct nfc_digital_dev *ddev, u8 rf_tech); 123int digital_tg_listen_nfca(struct nfc_digital_dev *ddev, u8 rf_tech);
123int digital_tg_listen_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech); 124int digital_tg_listen_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech);
125void digital_tg_recv_md_req(struct nfc_digital_dev *ddev, void *arg,
126 struct sk_buff *resp);
124 127
125typedef u16 (*crc_func_t)(u16, const u8 *, size_t); 128typedef u16 (*crc_func_t)(u16, const u8 *, size_t);
126 129
diff --git a/net/nfc/digital_core.c b/net/nfc/digital_core.c
index a6ce3c627e4e..009bcf317101 100644
--- a/net/nfc/digital_core.c
+++ b/net/nfc/digital_core.c
@@ -201,6 +201,11 @@ static void digital_wq_cmd(struct work_struct *work)
201 digital_send_cmd_complete, cmd); 201 digital_send_cmd_complete, cmd);
202 break; 202 break;
203 203
204 case DIGITAL_CMD_TG_LISTEN_MD:
205 rc = ddev->ops->tg_listen_md(ddev, cmd->timeout,
206 digital_send_cmd_complete, cmd);
207 break;
208
204 default: 209 default:
205 pr_err("Unknown cmd type %d\n", cmd->type); 210 pr_err("Unknown cmd type %d\n", cmd->type);
206 return; 211 return;
@@ -293,12 +298,19 @@ static int digital_tg_listen_mdaa(struct nfc_digital_dev *ddev, u8 rf_tech)
293 500, digital_tg_recv_atr_req, NULL); 298 500, digital_tg_recv_atr_req, NULL);
294} 299}
295 300
301static int digital_tg_listen_md(struct nfc_digital_dev *ddev, u8 rf_tech)
302{
303 return digital_send_cmd(ddev, DIGITAL_CMD_TG_LISTEN_MD, NULL, NULL, 500,
304 digital_tg_recv_md_req, NULL);
305}
306
296int digital_target_found(struct nfc_digital_dev *ddev, 307int digital_target_found(struct nfc_digital_dev *ddev,
297 struct nfc_target *target, u8 protocol) 308 struct nfc_target *target, u8 protocol)
298{ 309{
299 int rc; 310 int rc;
300 u8 framing; 311 u8 framing;
301 u8 rf_tech; 312 u8 rf_tech;
313 u8 poll_tech_count;
302 int (*check_crc)(struct sk_buff *skb); 314 int (*check_crc)(struct sk_buff *skb);
303 void (*add_crc)(struct sk_buff *skb); 315 void (*add_crc)(struct sk_buff *skb);
304 316
@@ -375,12 +387,16 @@ int digital_target_found(struct nfc_digital_dev *ddev,
375 return rc; 387 return rc;
376 388
377 target->supported_protocols = (1 << protocol); 389 target->supported_protocols = (1 << protocol);
378 rc = nfc_targets_found(ddev->nfc_dev, target, 1);
379 if (rc)
380 return rc;
381 390
391 poll_tech_count = ddev->poll_tech_count;
382 ddev->poll_tech_count = 0; 392 ddev->poll_tech_count = 0;
383 393
394 rc = nfc_targets_found(ddev->nfc_dev, target, 1);
395 if (rc) {
396 ddev->poll_tech_count = poll_tech_count;
397 return rc;
398 }
399
384 return 0; 400 return 0;
385} 401}
386 402
@@ -505,6 +521,9 @@ static int digital_start_poll(struct nfc_dev *nfc_dev, __u32 im_protocols,
505 if (ddev->ops->tg_listen_mdaa) { 521 if (ddev->ops->tg_listen_mdaa) {
506 digital_add_poll_tech(ddev, 0, 522 digital_add_poll_tech(ddev, 0,
507 digital_tg_listen_mdaa); 523 digital_tg_listen_mdaa);
524 } else if (ddev->ops->tg_listen_md) {
525 digital_add_poll_tech(ddev, 0,
526 digital_tg_listen_md);
508 } else { 527 } else {
509 digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_106A, 528 digital_add_poll_tech(ddev, NFC_DIGITAL_RF_TECH_106A,
510 digital_tg_listen_nfca); 529 digital_tg_listen_nfca);
@@ -732,7 +751,7 @@ struct nfc_digital_dev *nfc_digital_allocate_device(struct nfc_digital_ops *ops,
732 751
733 if (!ops->in_configure_hw || !ops->in_send_cmd || !ops->tg_listen || 752 if (!ops->in_configure_hw || !ops->in_send_cmd || !ops->tg_listen ||
734 !ops->tg_configure_hw || !ops->tg_send_cmd || !ops->abort_cmd || 753 !ops->tg_configure_hw || !ops->tg_send_cmd || !ops->abort_cmd ||
735 !ops->switch_rf) 754 !ops->switch_rf || (ops->tg_listen_md && !ops->tg_get_rf_tech))
736 return NULL; 755 return NULL;
737 756
738 ddev = kzalloc(sizeof(struct nfc_digital_dev), GFP_KERNEL); 757 ddev = kzalloc(sizeof(struct nfc_digital_dev), GFP_KERNEL);
diff --git a/net/nfc/digital_dep.c b/net/nfc/digital_dep.c
index 37deb173c956..e1638dab076d 100644
--- a/net/nfc/digital_dep.c
+++ b/net/nfc/digital_dep.c
@@ -671,6 +671,7 @@ void digital_tg_recv_atr_req(struct nfc_digital_dev *ddev, void *arg,
671 int rc; 671 int rc;
672 struct digital_atr_req *atr_req; 672 struct digital_atr_req *atr_req;
673 size_t gb_len, min_size; 673 size_t gb_len, min_size;
674 u8 poll_tech_count;
674 675
675 if (IS_ERR(resp)) { 676 if (IS_ERR(resp)) {
676 rc = PTR_ERR(resp); 677 rc = PTR_ERR(resp);
@@ -728,12 +729,16 @@ void digital_tg_recv_atr_req(struct nfc_digital_dev *ddev, void *arg,
728 goto exit; 729 goto exit;
729 730
730 gb_len = resp->len - sizeof(struct digital_atr_req); 731 gb_len = resp->len - sizeof(struct digital_atr_req);
732
733 poll_tech_count = ddev->poll_tech_count;
734 ddev->poll_tech_count = 0;
735
731 rc = nfc_tm_activated(ddev->nfc_dev, NFC_PROTO_NFC_DEP_MASK, 736 rc = nfc_tm_activated(ddev->nfc_dev, NFC_PROTO_NFC_DEP_MASK,
732 NFC_COMM_PASSIVE, atr_req->gb, gb_len); 737 NFC_COMM_PASSIVE, atr_req->gb, gb_len);
733 if (rc) 738 if (rc) {
739 ddev->poll_tech_count = poll_tech_count;
734 goto exit; 740 goto exit;
735 741 }
736 ddev->poll_tech_count = 0;
737 742
738 rc = 0; 743 rc = 0;
739exit: 744exit:
diff --git a/net/nfc/digital_technology.c b/net/nfc/digital_technology.c
index c2c1c0189b7c..fb58ed2dd41d 100644
--- a/net/nfc/digital_technology.c
+++ b/net/nfc/digital_technology.c
@@ -318,6 +318,8 @@ static void digital_in_recv_sel_res(struct nfc_digital_dev *ddev, void *arg,
318 318
319 if (DIGITAL_SEL_RES_IS_T2T(sel_res)) { 319 if (DIGITAL_SEL_RES_IS_T2T(sel_res)) {
320 nfc_proto = NFC_PROTO_MIFARE; 320 nfc_proto = NFC_PROTO_MIFARE;
321 } else if (DIGITAL_SEL_RES_IS_NFC_DEP(sel_res)) {
322 nfc_proto = NFC_PROTO_NFC_DEP;
321 } else if (DIGITAL_SEL_RES_IS_T4T(sel_res)) { 323 } else if (DIGITAL_SEL_RES_IS_T4T(sel_res)) {
322 rc = digital_in_send_rats(ddev, target); 324 rc = digital_in_send_rats(ddev, target);
323 if (rc) 325 if (rc)
@@ -327,8 +329,6 @@ static void digital_in_recv_sel_res(struct nfc_digital_dev *ddev, void *arg,
327 * done when receiving the ATS 329 * done when receiving the ATS
328 */ 330 */
329 goto exit_free_skb; 331 goto exit_free_skb;
330 } else if (DIGITAL_SEL_RES_IS_NFC_DEP(sel_res)) {
331 nfc_proto = NFC_PROTO_NFC_DEP;
332 } else { 332 } else {
333 rc = -EOPNOTSUPP; 333 rc = -EOPNOTSUPP;
334 goto exit; 334 goto exit;
@@ -944,6 +944,13 @@ static int digital_tg_send_sel_res(struct nfc_digital_dev *ddev)
944 if (!DIGITAL_DRV_CAPS_TG_CRC(ddev)) 944 if (!DIGITAL_DRV_CAPS_TG_CRC(ddev))
945 digital_skb_add_crc_a(skb); 945 digital_skb_add_crc_a(skb);
946 946
947 rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
948 NFC_DIGITAL_FRAMING_NFCA_ANTICOL_COMPLETE);
949 if (rc) {
950 kfree_skb(skb);
951 return rc;
952 }
953
947 rc = digital_tg_send_cmd(ddev, skb, 300, digital_tg_recv_atr_req, 954 rc = digital_tg_send_cmd(ddev, skb, 300, digital_tg_recv_atr_req,
948 NULL); 955 NULL);
949 if (rc) 956 if (rc)
@@ -1002,6 +1009,13 @@ static int digital_tg_send_sdd_res(struct nfc_digital_dev *ddev)
1002 for (i = 0; i < 4; i++) 1009 for (i = 0; i < 4; i++)
1003 sdd_res->bcc ^= sdd_res->nfcid1[i]; 1010 sdd_res->bcc ^= sdd_res->nfcid1[i];
1004 1011
1012 rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
1013 NFC_DIGITAL_FRAMING_NFCA_STANDARD_WITH_CRC_A);
1014 if (rc) {
1015 kfree_skb(skb);
1016 return rc;
1017 }
1018
1005 rc = digital_tg_send_cmd(ddev, skb, 300, digital_tg_recv_sel_req, 1019 rc = digital_tg_send_cmd(ddev, skb, 300, digital_tg_recv_sel_req,
1006 NULL); 1020 NULL);
1007 if (rc) 1021 if (rc)
@@ -1054,6 +1068,13 @@ static int digital_tg_send_sens_res(struct nfc_digital_dev *ddev)
1054 sens_res[0] = (DIGITAL_SENS_RES_NFC_DEP >> 8) & 0xFF; 1068 sens_res[0] = (DIGITAL_SENS_RES_NFC_DEP >> 8) & 0xFF;
1055 sens_res[1] = DIGITAL_SENS_RES_NFC_DEP & 0xFF; 1069 sens_res[1] = DIGITAL_SENS_RES_NFC_DEP & 0xFF;
1056 1070
1071 rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
1072 NFC_DIGITAL_FRAMING_NFCA_STANDARD);
1073 if (rc) {
1074 kfree_skb(skb);
1075 return rc;
1076 }
1077
1057 rc = digital_tg_send_cmd(ddev, skb, 300, digital_tg_recv_sdd_req, 1078 rc = digital_tg_send_cmd(ddev, skb, 300, digital_tg_recv_sdd_req,
1058 NULL); 1079 NULL);
1059 if (rc) 1080 if (rc)
@@ -1197,33 +1218,48 @@ exit:
1197 dev_kfree_skb(resp); 1218 dev_kfree_skb(resp);
1198} 1219}
1199 1220
1200int digital_tg_listen_nfca(struct nfc_digital_dev *ddev, u8 rf_tech) 1221static int digital_tg_config_nfca(struct nfc_digital_dev *ddev)
1201{ 1222{
1202 int rc; 1223 int rc;
1203 1224
1204 rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH, rf_tech); 1225 rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH,
1226 NFC_DIGITAL_RF_TECH_106A);
1205 if (rc) 1227 if (rc)
1206 return rc; 1228 return rc;
1207 1229
1208 rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING, 1230 return digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
1209 NFC_DIGITAL_FRAMING_NFCA_NFC_DEP); 1231 NFC_DIGITAL_FRAMING_NFCA_NFC_DEP);
1232}
1233
1234int digital_tg_listen_nfca(struct nfc_digital_dev *ddev, u8 rf_tech)
1235{
1236 int rc;
1237
1238 rc = digital_tg_config_nfca(ddev);
1210 if (rc) 1239 if (rc)
1211 return rc; 1240 return rc;
1212 1241
1213 return digital_tg_listen(ddev, 300, digital_tg_recv_sens_req, NULL); 1242 return digital_tg_listen(ddev, 300, digital_tg_recv_sens_req, NULL);
1214} 1243}
1215 1244
1216int digital_tg_listen_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech) 1245static int digital_tg_config_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech)
1217{ 1246{
1218 int rc; 1247 int rc;
1219 u8 *nfcid2;
1220 1248
1221 rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH, rf_tech); 1249 rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH, rf_tech);
1222 if (rc) 1250 if (rc)
1223 return rc; 1251 return rc;
1224 1252
1225 rc = digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING, 1253 return digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
1226 NFC_DIGITAL_FRAMING_NFCF_NFC_DEP); 1254 NFC_DIGITAL_FRAMING_NFCF_NFC_DEP);
1255}
1256
1257int digital_tg_listen_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech)
1258{
1259 int rc;
1260 u8 *nfcid2;
1261
1262 rc = digital_tg_config_nfcf(ddev, rf_tech);
1227 if (rc) 1263 if (rc)
1228 return rc; 1264 return rc;
1229 1265
@@ -1237,3 +1273,43 @@ int digital_tg_listen_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech)
1237 1273
1238 return digital_tg_listen(ddev, 300, digital_tg_recv_sensf_req, nfcid2); 1274 return digital_tg_listen(ddev, 300, digital_tg_recv_sensf_req, nfcid2);
1239} 1275}
1276
1277void digital_tg_recv_md_req(struct nfc_digital_dev *ddev, void *arg,
1278 struct sk_buff *resp)
1279{
1280 u8 rf_tech;
1281 int rc;
1282
1283 if (IS_ERR(resp)) {
1284 resp = NULL;
1285 goto exit_free_skb;
1286 }
1287
1288 rc = ddev->ops->tg_get_rf_tech(ddev, &rf_tech);
1289 if (rc)
1290 goto exit_free_skb;
1291
1292 switch (rf_tech) {
1293 case NFC_DIGITAL_RF_TECH_106A:
1294 rc = digital_tg_config_nfca(ddev);
1295 if (rc)
1296 goto exit_free_skb;
1297 digital_tg_recv_sens_req(ddev, arg, resp);
1298 break;
1299 case NFC_DIGITAL_RF_TECH_212F:
1300 case NFC_DIGITAL_RF_TECH_424F:
1301 rc = digital_tg_config_nfcf(ddev, rf_tech);
1302 if (rc)
1303 goto exit_free_skb;
1304 digital_tg_recv_sensf_req(ddev, arg, resp);
1305 break;
1306 default:
1307 goto exit_free_skb;
1308 }
1309
1310 return;
1311
1312exit_free_skb:
1313 digital_poll_next_tech(ddev);
1314 dev_kfree_skb(resp);
1315}
diff --git a/net/nfc/hci/core.c b/net/nfc/hci/core.c
index 47403705197e..117708263ced 100644
--- a/net/nfc/hci/core.c
+++ b/net/nfc/hci/core.c
@@ -553,8 +553,11 @@ static void hci_stop_poll(struct nfc_dev *nfc_dev)
553{ 553{
554 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev); 554 struct nfc_hci_dev *hdev = nfc_get_drvdata(nfc_dev);
555 555
556 nfc_hci_send_event(hdev, NFC_HCI_RF_READER_A_GATE, 556 if (hdev->ops->stop_poll)
557 NFC_HCI_EVT_END_OPERATION, NULL, 0); 557 hdev->ops->stop_poll(hdev);
558 else
559 nfc_hci_send_event(hdev, NFC_HCI_RF_READER_A_GATE,
560 NFC_HCI_EVT_END_OPERATION, NULL, 0);
558} 561}
559 562
560static int hci_dep_link_up(struct nfc_dev *nfc_dev, struct nfc_target *target, 563static int hci_dep_link_up(struct nfc_dev *nfc_dev, struct nfc_target *target,
diff --git a/net/nfc/nci/ntf.c b/net/nfc/nci/ntf.c
index f8f6af231381..df91bb95b12a 100644
--- a/net/nfc/nci/ntf.c
+++ b/net/nfc/nci/ntf.c
@@ -166,7 +166,9 @@ static int nci_add_new_protocol(struct nci_dev *ndev,
166 struct rf_tech_specific_params_nfcf_poll *nfcf_poll; 166 struct rf_tech_specific_params_nfcf_poll *nfcf_poll;
167 __u32 protocol; 167 __u32 protocol;
168 168
169 if (rf_protocol == NCI_RF_PROTOCOL_T2T) 169 if (rf_protocol == NCI_RF_PROTOCOL_T1T)
170 protocol = NFC_PROTO_JEWEL_MASK;
171 else if (rf_protocol == NCI_RF_PROTOCOL_T2T)
170 protocol = NFC_PROTO_MIFARE_MASK; 172 protocol = NFC_PROTO_MIFARE_MASK;
171 else if (rf_protocol == NCI_RF_PROTOCOL_ISO_DEP) 173 else if (rf_protocol == NCI_RF_PROTOCOL_ISO_DEP)
172 if (rf_tech_and_mode == NCI_NFC_A_PASSIVE_POLL_MODE) 174 if (rf_tech_and_mode == NCI_NFC_A_PASSIVE_POLL_MODE)