Loading Documentation/DocBook/80211.tmpl +1 −0 Original line number Original line Diff line number Diff line Loading @@ -100,6 +100,7 @@ !Finclude/net/cfg80211.h wdev_priv !Finclude/net/cfg80211.h wdev_priv !Finclude/net/cfg80211.h ieee80211_iface_limit !Finclude/net/cfg80211.h ieee80211_iface_limit !Finclude/net/cfg80211.h ieee80211_iface_combination !Finclude/net/cfg80211.h ieee80211_iface_combination !Finclude/net/cfg80211.h cfg80211_check_combinations </chapter> </chapter> <chapter> <chapter> <title>Actions and configuration</title> <title>Actions and configuration</title> Loading drivers/bluetooth/btmrvl_drv.h +3 −1 Original line number Original line Diff line number Diff line Loading @@ -59,6 +59,8 @@ struct btmrvl_device { }; }; struct btmrvl_adapter { struct btmrvl_adapter { void *hw_regs_buf; u8 *hw_regs; u32 int_count; u32 int_count; struct sk_buff_head tx_queue; struct sk_buff_head tx_queue; u8 psmode; u8 psmode; Loading Loading @@ -140,7 +142,7 @@ void btmrvl_interrupt(struct btmrvl_private *priv); bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb); bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb); int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb); int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb); int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, int subcmd); int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, u8 subcmd); int btmrvl_send_hscfg_cmd(struct btmrvl_private *priv); int btmrvl_send_hscfg_cmd(struct btmrvl_private *priv); int btmrvl_enable_ps(struct btmrvl_private *priv); int btmrvl_enable_ps(struct btmrvl_private *priv); int btmrvl_prepare_command(struct btmrvl_private *priv); int btmrvl_prepare_command(struct btmrvl_private *priv); Loading drivers/bluetooth/btmrvl_main.c +18 −1 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,7 @@ #include <net/bluetooth/hci_core.h> #include <net/bluetooth/hci_core.h> #include "btmrvl_drv.h" #include "btmrvl_drv.h" #include "btmrvl_sdio.h" #define VERSION "1.0" #define VERSION "1.0" Loading Loading @@ -201,7 +202,7 @@ static int btmrvl_send_sync_cmd(struct btmrvl_private *priv, u16 opcode, return 0; return 0; } } int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, int subcmd) int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, u8 subcmd) { { int ret; int ret; Loading Loading @@ -337,10 +338,25 @@ static int btmrvl_tx_pkt(struct btmrvl_private *priv, struct sk_buff *skb) static void btmrvl_init_adapter(struct btmrvl_private *priv) static void btmrvl_init_adapter(struct btmrvl_private *priv) { { int buf_size; skb_queue_head_init(&priv->adapter->tx_queue); skb_queue_head_init(&priv->adapter->tx_queue); priv->adapter->ps_state = PS_AWAKE; priv->adapter->ps_state = PS_AWAKE; buf_size = ALIGN_SZ(SDIO_BLOCK_SIZE, BTSDIO_DMA_ALIGN); priv->adapter->hw_regs_buf = kzalloc(buf_size, GFP_KERNEL); if (!priv->adapter->hw_regs_buf) { priv->adapter->hw_regs = NULL; BT_ERR("Unable to allocate buffer for hw_regs."); } else { priv->adapter->hw_regs = (u8 *)ALIGN_ADDR(priv->adapter->hw_regs_buf, BTSDIO_DMA_ALIGN); BT_DBG("hw_regs_buf=%p hw_regs=%p", priv->adapter->hw_regs_buf, priv->adapter->hw_regs); } init_waitqueue_head(&priv->adapter->cmd_wait_q); init_waitqueue_head(&priv->adapter->cmd_wait_q); } } Loading @@ -348,6 +364,7 @@ static void btmrvl_free_adapter(struct btmrvl_private *priv) { { skb_queue_purge(&priv->adapter->tx_queue); skb_queue_purge(&priv->adapter->tx_queue); kfree(priv->adapter->hw_regs_buf); kfree(priv->adapter); kfree(priv->adapter); priv->adapter = NULL; priv->adapter = NULL; Loading drivers/bluetooth/btmrvl_sdio.c +82 −21 Original line number Original line Diff line number Diff line Loading @@ -64,6 +64,7 @@ static const struct btmrvl_sdio_card_reg btmrvl_reg_8688 = { .io_port_0 = 0x00, .io_port_0 = 0x00, .io_port_1 = 0x01, .io_port_1 = 0x01, .io_port_2 = 0x02, .io_port_2 = 0x02, .int_read_to_clear = false, }; }; static const struct btmrvl_sdio_card_reg btmrvl_reg_87xx = { static const struct btmrvl_sdio_card_reg btmrvl_reg_87xx = { .cfg = 0x00, .cfg = 0x00, Loading @@ -80,6 +81,7 @@ static const struct btmrvl_sdio_card_reg btmrvl_reg_87xx = { .io_port_0 = 0x78, .io_port_0 = 0x78, .io_port_1 = 0x79, .io_port_1 = 0x79, .io_port_2 = 0x7a, .io_port_2 = 0x7a, .int_read_to_clear = false, }; }; static const struct btmrvl_sdio_card_reg btmrvl_reg_88xx = { static const struct btmrvl_sdio_card_reg btmrvl_reg_88xx = { Loading @@ -97,6 +99,9 @@ static const struct btmrvl_sdio_card_reg btmrvl_reg_88xx = { .io_port_0 = 0xd8, .io_port_0 = 0xd8, .io_port_1 = 0xd9, .io_port_1 = 0xd9, .io_port_2 = 0xda, .io_port_2 = 0xda, .int_read_to_clear = true, .host_int_rsr = 0x01, .card_misc_cfg = 0xcc, }; }; static const struct btmrvl_sdio_device btmrvl_sdio_sd8688 = { static const struct btmrvl_sdio_device btmrvl_sdio_sd8688 = { Loading Loading @@ -667,46 +672,78 @@ static int btmrvl_sdio_process_int_status(struct btmrvl_private *priv) return 0; return 0; } } static void btmrvl_sdio_interrupt(struct sdio_func *func) static int btmrvl_sdio_read_to_clear(struct btmrvl_sdio_card *card, u8 *ireg) { { struct btmrvl_private *priv; struct btmrvl_adapter *adapter = card->priv->adapter; struct btmrvl_sdio_card *card; ulong flags; u8 ireg = 0; int ret; int ret; card = sdio_get_drvdata(func); ret = sdio_readsb(card->func, adapter->hw_regs, 0, SDIO_BLOCK_SIZE); if (!card || !card->priv) { if (ret) { BT_ERR("sbi_interrupt(%p) card or priv is " BT_ERR("sdio_readsb: read int hw_regs failed: %d", ret); "NULL, card=%p\n", func, card); return ret; return; } } priv = card->priv; *ireg = adapter->hw_regs[card->reg->host_intstatus]; BT_DBG("hw_regs[%#x]=%#x", card->reg->host_intstatus, *ireg); return 0; } static int btmrvl_sdio_write_to_clear(struct btmrvl_sdio_card *card, u8 *ireg) { int ret; ireg = sdio_readb(card->func, card->reg->host_intstatus, &ret); *ireg = sdio_readb(card->func, card->reg->host_intstatus, &ret); if (ret) { if (ret) { BT_ERR("sdio_readb: read int status register failed"); BT_ERR("sdio_readb: read int status failed: %d", ret); return; return ret; } } if (ireg != 0) { if (*ireg) { /* /* * DN_LD_HOST_INT_STATUS and/or UP_LD_HOST_INT_STATUS * DN_LD_HOST_INT_STATUS and/or UP_LD_HOST_INT_STATUS * Clear the interrupt status register and re-enable the * Clear the interrupt status register and re-enable the * interrupt. * interrupt. */ */ BT_DBG("ireg = 0x%x", ireg); BT_DBG("int_status = 0x%x", *ireg); sdio_writeb(card->func, ~(ireg) & (DN_LD_HOST_INT_STATUS | sdio_writeb(card->func, ~(*ireg) & (DN_LD_HOST_INT_STATUS | UP_LD_HOST_INT_STATUS), UP_LD_HOST_INT_STATUS), card->reg->host_intstatus, &ret); card->reg->host_intstatus, &ret); if (ret) { if (ret) { BT_ERR("sdio_writeb: clear int status register failed"); BT_ERR("sdio_writeb: clear int status failed: %d", ret); return; return ret; } } } return 0; } } static void btmrvl_sdio_interrupt(struct sdio_func *func) { struct btmrvl_private *priv; struct btmrvl_sdio_card *card; ulong flags; u8 ireg = 0; int ret; card = sdio_get_drvdata(func); if (!card || !card->priv) { BT_ERR("sbi_interrupt(%p) card or priv is " "NULL, card=%p\n", func, card); return; } priv = card->priv; if (card->reg->int_read_to_clear) ret = btmrvl_sdio_read_to_clear(card, &ireg); else ret = btmrvl_sdio_write_to_clear(card, &ireg); if (ret) return; spin_lock_irqsave(&priv->driver_lock, flags); spin_lock_irqsave(&priv->driver_lock, flags); sdio_ireg |= ireg; sdio_ireg |= ireg; spin_unlock_irqrestore(&priv->driver_lock, flags); spin_unlock_irqrestore(&priv->driver_lock, flags); Loading Loading @@ -777,6 +814,30 @@ static int btmrvl_sdio_register_dev(struct btmrvl_sdio_card *card) BT_DBG("SDIO FUNC%d IO port: 0x%x", func->num, card->ioport); BT_DBG("SDIO FUNC%d IO port: 0x%x", func->num, card->ioport); if (card->reg->int_read_to_clear) { reg = sdio_readb(func, card->reg->host_int_rsr, &ret); if (ret < 0) { ret = -EIO; goto release_irq; } sdio_writeb(func, reg | 0x3f, card->reg->host_int_rsr, &ret); if (ret < 0) { ret = -EIO; goto release_irq; } reg = sdio_readb(func, card->reg->card_misc_cfg, &ret); if (ret < 0) { ret = -EIO; goto release_irq; } sdio_writeb(func, reg | 0x10, card->reg->card_misc_cfg, &ret); if (ret < 0) { ret = -EIO; goto release_irq; } } sdio_set_drvdata(func, card); sdio_set_drvdata(func, card); sdio_release_host(func); sdio_release_host(func); Loading drivers/bluetooth/btmrvl_sdio.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -78,6 +78,9 @@ struct btmrvl_sdio_card_reg { u8 io_port_0; u8 io_port_0; u8 io_port_1; u8 io_port_1; u8 io_port_2; u8 io_port_2; bool int_read_to_clear; u8 host_int_rsr; u8 card_misc_cfg; }; }; struct btmrvl_sdio_card { struct btmrvl_sdio_card { Loading Loading
Documentation/DocBook/80211.tmpl +1 −0 Original line number Original line Diff line number Diff line Loading @@ -100,6 +100,7 @@ !Finclude/net/cfg80211.h wdev_priv !Finclude/net/cfg80211.h wdev_priv !Finclude/net/cfg80211.h ieee80211_iface_limit !Finclude/net/cfg80211.h ieee80211_iface_limit !Finclude/net/cfg80211.h ieee80211_iface_combination !Finclude/net/cfg80211.h ieee80211_iface_combination !Finclude/net/cfg80211.h cfg80211_check_combinations </chapter> </chapter> <chapter> <chapter> <title>Actions and configuration</title> <title>Actions and configuration</title> Loading
drivers/bluetooth/btmrvl_drv.h +3 −1 Original line number Original line Diff line number Diff line Loading @@ -59,6 +59,8 @@ struct btmrvl_device { }; }; struct btmrvl_adapter { struct btmrvl_adapter { void *hw_regs_buf; u8 *hw_regs; u32 int_count; u32 int_count; struct sk_buff_head tx_queue; struct sk_buff_head tx_queue; u8 psmode; u8 psmode; Loading Loading @@ -140,7 +142,7 @@ void btmrvl_interrupt(struct btmrvl_private *priv); bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb); bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb); int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb); int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb); int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, int subcmd); int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, u8 subcmd); int btmrvl_send_hscfg_cmd(struct btmrvl_private *priv); int btmrvl_send_hscfg_cmd(struct btmrvl_private *priv); int btmrvl_enable_ps(struct btmrvl_private *priv); int btmrvl_enable_ps(struct btmrvl_private *priv); int btmrvl_prepare_command(struct btmrvl_private *priv); int btmrvl_prepare_command(struct btmrvl_private *priv); Loading
drivers/bluetooth/btmrvl_main.c +18 −1 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,7 @@ #include <net/bluetooth/hci_core.h> #include <net/bluetooth/hci_core.h> #include "btmrvl_drv.h" #include "btmrvl_drv.h" #include "btmrvl_sdio.h" #define VERSION "1.0" #define VERSION "1.0" Loading Loading @@ -201,7 +202,7 @@ static int btmrvl_send_sync_cmd(struct btmrvl_private *priv, u16 opcode, return 0; return 0; } } int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, int subcmd) int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, u8 subcmd) { { int ret; int ret; Loading Loading @@ -337,10 +338,25 @@ static int btmrvl_tx_pkt(struct btmrvl_private *priv, struct sk_buff *skb) static void btmrvl_init_adapter(struct btmrvl_private *priv) static void btmrvl_init_adapter(struct btmrvl_private *priv) { { int buf_size; skb_queue_head_init(&priv->adapter->tx_queue); skb_queue_head_init(&priv->adapter->tx_queue); priv->adapter->ps_state = PS_AWAKE; priv->adapter->ps_state = PS_AWAKE; buf_size = ALIGN_SZ(SDIO_BLOCK_SIZE, BTSDIO_DMA_ALIGN); priv->adapter->hw_regs_buf = kzalloc(buf_size, GFP_KERNEL); if (!priv->adapter->hw_regs_buf) { priv->adapter->hw_regs = NULL; BT_ERR("Unable to allocate buffer for hw_regs."); } else { priv->adapter->hw_regs = (u8 *)ALIGN_ADDR(priv->adapter->hw_regs_buf, BTSDIO_DMA_ALIGN); BT_DBG("hw_regs_buf=%p hw_regs=%p", priv->adapter->hw_regs_buf, priv->adapter->hw_regs); } init_waitqueue_head(&priv->adapter->cmd_wait_q); init_waitqueue_head(&priv->adapter->cmd_wait_q); } } Loading @@ -348,6 +364,7 @@ static void btmrvl_free_adapter(struct btmrvl_private *priv) { { skb_queue_purge(&priv->adapter->tx_queue); skb_queue_purge(&priv->adapter->tx_queue); kfree(priv->adapter->hw_regs_buf); kfree(priv->adapter); kfree(priv->adapter); priv->adapter = NULL; priv->adapter = NULL; Loading
drivers/bluetooth/btmrvl_sdio.c +82 −21 Original line number Original line Diff line number Diff line Loading @@ -64,6 +64,7 @@ static const struct btmrvl_sdio_card_reg btmrvl_reg_8688 = { .io_port_0 = 0x00, .io_port_0 = 0x00, .io_port_1 = 0x01, .io_port_1 = 0x01, .io_port_2 = 0x02, .io_port_2 = 0x02, .int_read_to_clear = false, }; }; static const struct btmrvl_sdio_card_reg btmrvl_reg_87xx = { static const struct btmrvl_sdio_card_reg btmrvl_reg_87xx = { .cfg = 0x00, .cfg = 0x00, Loading @@ -80,6 +81,7 @@ static const struct btmrvl_sdio_card_reg btmrvl_reg_87xx = { .io_port_0 = 0x78, .io_port_0 = 0x78, .io_port_1 = 0x79, .io_port_1 = 0x79, .io_port_2 = 0x7a, .io_port_2 = 0x7a, .int_read_to_clear = false, }; }; static const struct btmrvl_sdio_card_reg btmrvl_reg_88xx = { static const struct btmrvl_sdio_card_reg btmrvl_reg_88xx = { Loading @@ -97,6 +99,9 @@ static const struct btmrvl_sdio_card_reg btmrvl_reg_88xx = { .io_port_0 = 0xd8, .io_port_0 = 0xd8, .io_port_1 = 0xd9, .io_port_1 = 0xd9, .io_port_2 = 0xda, .io_port_2 = 0xda, .int_read_to_clear = true, .host_int_rsr = 0x01, .card_misc_cfg = 0xcc, }; }; static const struct btmrvl_sdio_device btmrvl_sdio_sd8688 = { static const struct btmrvl_sdio_device btmrvl_sdio_sd8688 = { Loading Loading @@ -667,46 +672,78 @@ static int btmrvl_sdio_process_int_status(struct btmrvl_private *priv) return 0; return 0; } } static void btmrvl_sdio_interrupt(struct sdio_func *func) static int btmrvl_sdio_read_to_clear(struct btmrvl_sdio_card *card, u8 *ireg) { { struct btmrvl_private *priv; struct btmrvl_adapter *adapter = card->priv->adapter; struct btmrvl_sdio_card *card; ulong flags; u8 ireg = 0; int ret; int ret; card = sdio_get_drvdata(func); ret = sdio_readsb(card->func, adapter->hw_regs, 0, SDIO_BLOCK_SIZE); if (!card || !card->priv) { if (ret) { BT_ERR("sbi_interrupt(%p) card or priv is " BT_ERR("sdio_readsb: read int hw_regs failed: %d", ret); "NULL, card=%p\n", func, card); return ret; return; } } priv = card->priv; *ireg = adapter->hw_regs[card->reg->host_intstatus]; BT_DBG("hw_regs[%#x]=%#x", card->reg->host_intstatus, *ireg); return 0; } static int btmrvl_sdio_write_to_clear(struct btmrvl_sdio_card *card, u8 *ireg) { int ret; ireg = sdio_readb(card->func, card->reg->host_intstatus, &ret); *ireg = sdio_readb(card->func, card->reg->host_intstatus, &ret); if (ret) { if (ret) { BT_ERR("sdio_readb: read int status register failed"); BT_ERR("sdio_readb: read int status failed: %d", ret); return; return ret; } } if (ireg != 0) { if (*ireg) { /* /* * DN_LD_HOST_INT_STATUS and/or UP_LD_HOST_INT_STATUS * DN_LD_HOST_INT_STATUS and/or UP_LD_HOST_INT_STATUS * Clear the interrupt status register and re-enable the * Clear the interrupt status register and re-enable the * interrupt. * interrupt. */ */ BT_DBG("ireg = 0x%x", ireg); BT_DBG("int_status = 0x%x", *ireg); sdio_writeb(card->func, ~(ireg) & (DN_LD_HOST_INT_STATUS | sdio_writeb(card->func, ~(*ireg) & (DN_LD_HOST_INT_STATUS | UP_LD_HOST_INT_STATUS), UP_LD_HOST_INT_STATUS), card->reg->host_intstatus, &ret); card->reg->host_intstatus, &ret); if (ret) { if (ret) { BT_ERR("sdio_writeb: clear int status register failed"); BT_ERR("sdio_writeb: clear int status failed: %d", ret); return; return ret; } } } return 0; } } static void btmrvl_sdio_interrupt(struct sdio_func *func) { struct btmrvl_private *priv; struct btmrvl_sdio_card *card; ulong flags; u8 ireg = 0; int ret; card = sdio_get_drvdata(func); if (!card || !card->priv) { BT_ERR("sbi_interrupt(%p) card or priv is " "NULL, card=%p\n", func, card); return; } priv = card->priv; if (card->reg->int_read_to_clear) ret = btmrvl_sdio_read_to_clear(card, &ireg); else ret = btmrvl_sdio_write_to_clear(card, &ireg); if (ret) return; spin_lock_irqsave(&priv->driver_lock, flags); spin_lock_irqsave(&priv->driver_lock, flags); sdio_ireg |= ireg; sdio_ireg |= ireg; spin_unlock_irqrestore(&priv->driver_lock, flags); spin_unlock_irqrestore(&priv->driver_lock, flags); Loading Loading @@ -777,6 +814,30 @@ static int btmrvl_sdio_register_dev(struct btmrvl_sdio_card *card) BT_DBG("SDIO FUNC%d IO port: 0x%x", func->num, card->ioport); BT_DBG("SDIO FUNC%d IO port: 0x%x", func->num, card->ioport); if (card->reg->int_read_to_clear) { reg = sdio_readb(func, card->reg->host_int_rsr, &ret); if (ret < 0) { ret = -EIO; goto release_irq; } sdio_writeb(func, reg | 0x3f, card->reg->host_int_rsr, &ret); if (ret < 0) { ret = -EIO; goto release_irq; } reg = sdio_readb(func, card->reg->card_misc_cfg, &ret); if (ret < 0) { ret = -EIO; goto release_irq; } sdio_writeb(func, reg | 0x10, card->reg->card_misc_cfg, &ret); if (ret < 0) { ret = -EIO; goto release_irq; } } sdio_set_drvdata(func, card); sdio_set_drvdata(func, card); sdio_release_host(func); sdio_release_host(func); Loading
drivers/bluetooth/btmrvl_sdio.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -78,6 +78,9 @@ struct btmrvl_sdio_card_reg { u8 io_port_0; u8 io_port_0; u8 io_port_1; u8 io_port_1; u8 io_port_2; u8 io_port_2; bool int_read_to_clear; u8 host_int_rsr; u8 card_misc_cfg; }; }; struct btmrvl_sdio_card { struct btmrvl_sdio_card { Loading