mirror of
https://github.com/ukui/kernel.git
synced 2026-03-09 10:07:04 -07:00
Merge tag 'wireless-drivers-next-for-davem-2019-04-18' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next
Kalle Valo says: ==================== wireless-drivers-next patches for 5.2 Nothing really special standing out this time, iwlwifi being the most active driver. Major changes: iwlwifi * send NO_DATA events so they can be captured in radiotap * support for multiple BSSID * support for some new FW API versions * support new hardware * debugfs cleanups by Greg-KH qtnfmac * allow each MAC to specify its own regulatory rules ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -1835,7 +1835,7 @@ static void lpphy_papd_cal(struct b43_wldev *dev, struct lpphy_tx_gains gains,
|
||||
static void lpphy_papd_cal_txpwr(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_phy_lp *lpphy = dev->phy.lp;
|
||||
struct lpphy_tx_gains gains, oldgains;
|
||||
struct lpphy_tx_gains oldgains;
|
||||
int old_txpctl, old_afe_ovr, old_rf, old_bbmult;
|
||||
|
||||
lpphy_read_tx_pctl_mode_from_hardware(dev);
|
||||
@@ -1849,9 +1849,9 @@ static void lpphy_papd_cal_txpwr(struct b43_wldev *dev)
|
||||
lpphy_set_tx_power_control(dev, B43_LPPHY_TXPCTL_OFF);
|
||||
|
||||
if (dev->dev->chip_id == 0x4325 && dev->dev->chip_rev == 0)
|
||||
lpphy_papd_cal(dev, gains, 0, 1, 30);
|
||||
lpphy_papd_cal(dev, oldgains, 0, 1, 30);
|
||||
else
|
||||
lpphy_papd_cal(dev, gains, 0, 1, 65);
|
||||
lpphy_papd_cal(dev, oldgains, 0, 1, 65);
|
||||
|
||||
if (old_afe_ovr)
|
||||
lpphy_set_tx_gains(dev, oldgains);
|
||||
|
||||
@@ -490,11 +490,18 @@ fail:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr)
|
||||
void brcmf_proto_bcdc_detach_pre_delif(struct brcmf_pub *drvr)
|
||||
{
|
||||
struct brcmf_bcdc *bcdc = drvr->proto->pd;
|
||||
|
||||
brcmf_fws_detach_pre_delif(bcdc->fws);
|
||||
}
|
||||
|
||||
void brcmf_proto_bcdc_detach_post_delif(struct brcmf_pub *drvr)
|
||||
{
|
||||
struct brcmf_bcdc *bcdc = drvr->proto->pd;
|
||||
|
||||
drvr->proto->pd = NULL;
|
||||
brcmf_fws_detach(bcdc->fws);
|
||||
brcmf_fws_detach_post_delif(bcdc->fws);
|
||||
kfree(bcdc);
|
||||
}
|
||||
|
||||
@@ -18,14 +18,16 @@
|
||||
|
||||
#ifdef CONFIG_BRCMFMAC_PROTO_BCDC
|
||||
int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr);
|
||||
void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr);
|
||||
void brcmf_proto_bcdc_detach_pre_delif(struct brcmf_pub *drvr);
|
||||
void brcmf_proto_bcdc_detach_post_delif(struct brcmf_pub *drvr);
|
||||
void brcmf_proto_bcdc_txflowblock(struct device *dev, bool state);
|
||||
void brcmf_proto_bcdc_txcomplete(struct device *dev, struct sk_buff *txp,
|
||||
bool success);
|
||||
struct brcmf_fws_info *drvr_to_fws(struct brcmf_pub *drvr);
|
||||
#else
|
||||
static inline int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) { return 0; }
|
||||
static inline void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr) {}
|
||||
static void brcmf_proto_bcdc_detach_pre_delif(struct brcmf_pub *drvr) {};
|
||||
static inline void brcmf_proto_bcdc_detach_post_delif(struct brcmf_pub *drvr) {}
|
||||
#endif
|
||||
|
||||
#endif /* BRCMFMAC_BCDC_H */
|
||||
|
||||
@@ -628,15 +628,13 @@ int brcmf_sdiod_send_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes)
|
||||
|
||||
err = brcmf_sdiod_set_backplane_window(sdiodev, addr);
|
||||
if (err)
|
||||
return err;
|
||||
goto out;
|
||||
|
||||
addr &= SBSDIO_SB_OFT_ADDR_MASK;
|
||||
addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
|
||||
|
||||
if (!err)
|
||||
err = brcmf_sdiod_skbuff_write(sdiodev, sdiodev->func2, addr,
|
||||
mypkt);
|
||||
|
||||
err = brcmf_sdiod_skbuff_write(sdiodev, sdiodev->func2, addr, mypkt);
|
||||
out:
|
||||
brcmu_pkt_buf_free_skb(mypkt);
|
||||
|
||||
return err;
|
||||
|
||||
@@ -91,6 +91,7 @@ struct brcmf_bus_ops {
|
||||
int (*get_fwname)(struct device *dev, const char *ext,
|
||||
unsigned char *fw_name);
|
||||
void (*debugfs_create)(struct device *dev);
|
||||
int (*reset)(struct device *dev);
|
||||
};
|
||||
|
||||
|
||||
@@ -245,6 +246,15 @@ void brcmf_bus_debugfs_create(struct brcmf_bus *bus)
|
||||
return bus->ops->debugfs_create(bus->dev);
|
||||
}
|
||||
|
||||
static inline
|
||||
int brcmf_bus_reset(struct brcmf_bus *bus)
|
||||
{
|
||||
if (!bus->ops->reset)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return bus->ops->reset(bus->dev);
|
||||
}
|
||||
|
||||
/*
|
||||
* interface functions from common layer
|
||||
*/
|
||||
@@ -262,6 +272,8 @@ void brcmf_detach(struct device *dev);
|
||||
void brcmf_dev_reset(struct device *dev);
|
||||
/* Request from bus module to initiate a coredump */
|
||||
void brcmf_dev_coredump(struct device *dev);
|
||||
/* Indication that firmware has halted or crashed */
|
||||
void brcmf_fw_crashed(struct device *dev);
|
||||
|
||||
/* Configure the "global" bus state used by upper layers */
|
||||
void brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state state);
|
||||
|
||||
@@ -5464,6 +5464,8 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
|
||||
conn_info->req_ie =
|
||||
kmemdup(cfg->extra_buf, conn_info->req_ie_len,
|
||||
GFP_KERNEL);
|
||||
if (!conn_info->req_ie)
|
||||
conn_info->req_ie_len = 0;
|
||||
} else {
|
||||
conn_info->req_ie_len = 0;
|
||||
conn_info->req_ie = NULL;
|
||||
@@ -5480,6 +5482,8 @@ static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
|
||||
conn_info->resp_ie =
|
||||
kmemdup(cfg->extra_buf, conn_info->resp_ie_len,
|
||||
GFP_KERNEL);
|
||||
if (!conn_info->resp_ie)
|
||||
conn_info->resp_ie_len = 0;
|
||||
} else {
|
||||
conn_info->resp_ie_len = 0;
|
||||
conn_info->resp_ie = NULL;
|
||||
|
||||
@@ -841,17 +841,17 @@ static void brcmf_del_if(struct brcmf_pub *drvr, s32 bsscfgidx,
|
||||
bool rtnl_locked)
|
||||
{
|
||||
struct brcmf_if *ifp;
|
||||
int ifidx;
|
||||
|
||||
ifp = drvr->iflist[bsscfgidx];
|
||||
drvr->iflist[bsscfgidx] = NULL;
|
||||
if (!ifp) {
|
||||
bphy_err(drvr, "Null interface, bsscfgidx=%d\n", bsscfgidx);
|
||||
return;
|
||||
}
|
||||
brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, ifidx=%d\n", bsscfgidx,
|
||||
ifp->ifidx);
|
||||
if (drvr->if2bss[ifp->ifidx] == bsscfgidx)
|
||||
drvr->if2bss[ifp->ifidx] = BRCMF_BSSIDX_INVALID;
|
||||
ifidx = ifp->ifidx;
|
||||
|
||||
if (ifp->ndev) {
|
||||
if (bsscfgidx == 0) {
|
||||
if (ifp->ndev->netdev_ops == &brcmf_netdev_ops_pri) {
|
||||
@@ -879,6 +879,10 @@ static void brcmf_del_if(struct brcmf_pub *drvr, s32 bsscfgidx,
|
||||
brcmf_p2p_ifp_removed(ifp, rtnl_locked);
|
||||
kfree(ifp);
|
||||
}
|
||||
|
||||
drvr->iflist[bsscfgidx] = NULL;
|
||||
if (drvr->if2bss[ifidx] == bsscfgidx)
|
||||
drvr->if2bss[ifidx] = BRCMF_BSSIDX_INVALID;
|
||||
}
|
||||
|
||||
void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked)
|
||||
@@ -1084,6 +1088,14 @@ static int brcmf_revinfo_read(struct seq_file *s, void *data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void brcmf_core_bus_reset(struct work_struct *work)
|
||||
{
|
||||
struct brcmf_pub *drvr = container_of(work, struct brcmf_pub,
|
||||
bus_reset);
|
||||
|
||||
brcmf_bus_reset(drvr->bus_if);
|
||||
}
|
||||
|
||||
static int brcmf_bus_started(struct brcmf_pub *drvr, struct cfg80211_ops *ops)
|
||||
{
|
||||
int ret = -1;
|
||||
@@ -1155,6 +1167,8 @@ static int brcmf_bus_started(struct brcmf_pub *drvr, struct cfg80211_ops *ops)
|
||||
#endif
|
||||
#endif /* CONFIG_INET */
|
||||
|
||||
INIT_WORK(&drvr->bus_reset, brcmf_core_bus_reset);
|
||||
|
||||
/* populate debugfs */
|
||||
brcmf_debugfs_add_entry(drvr, "revinfo", brcmf_revinfo_read);
|
||||
brcmf_feat_debugfs_create(drvr);
|
||||
@@ -1273,6 +1287,18 @@ void brcmf_dev_coredump(struct device *dev)
|
||||
brcmf_dbg(TRACE, "failed to create coredump\n");
|
||||
}
|
||||
|
||||
void brcmf_fw_crashed(struct device *dev)
|
||||
{
|
||||
struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
struct brcmf_pub *drvr = bus_if->drvr;
|
||||
|
||||
bphy_err(drvr, "Firmware has halted or crashed\n");
|
||||
|
||||
brcmf_dev_coredump(dev);
|
||||
|
||||
schedule_work(&drvr->bus_reset);
|
||||
}
|
||||
|
||||
void brcmf_detach(struct device *dev)
|
||||
{
|
||||
s32 i;
|
||||
@@ -1299,6 +1325,8 @@ void brcmf_detach(struct device *dev)
|
||||
|
||||
brcmf_bus_change_state(bus_if, BRCMF_BUS_DOWN);
|
||||
|
||||
brcmf_proto_detach_pre_delif(drvr);
|
||||
|
||||
/* make sure primary interface removed last */
|
||||
for (i = BRCMF_MAX_IFS-1; i > -1; i--)
|
||||
brcmf_remove_interface(drvr->iflist[i], false);
|
||||
@@ -1308,7 +1336,7 @@ void brcmf_detach(struct device *dev)
|
||||
|
||||
brcmf_bus_stop(drvr->bus_if);
|
||||
|
||||
brcmf_proto_detach(drvr);
|
||||
brcmf_proto_detach_post_delif(drvr);
|
||||
|
||||
bus_if->drvr = NULL;
|
||||
wiphy_free(drvr->wiphy);
|
||||
|
||||
@@ -143,6 +143,8 @@ struct brcmf_pub {
|
||||
struct notifier_block inet6addr_notifier;
|
||||
struct brcmf_mp_device *settings;
|
||||
|
||||
struct work_struct bus_reset;
|
||||
|
||||
u8 clmver[BRCMF_DCMD_SMLEN];
|
||||
};
|
||||
|
||||
|
||||
@@ -711,7 +711,6 @@ brcmf_fw_alloc_request(u32 chip, u32 chiprev,
|
||||
size_t mp_path_len;
|
||||
u32 i, j;
|
||||
char end = '\0';
|
||||
size_t reqsz;
|
||||
|
||||
for (i = 0; i < table_size; i++) {
|
||||
if (mapping_table[i].chipid == chip &&
|
||||
@@ -726,8 +725,7 @@ brcmf_fw_alloc_request(u32 chip, u32 chiprev,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
reqsz = sizeof(*fwreq) + n_fwnames * sizeof(struct brcmf_fw_item);
|
||||
fwreq = kzalloc(reqsz, GFP_KERNEL);
|
||||
fwreq = kzalloc(struct_size(fwreq, items, n_fwnames), GFP_KERNEL);
|
||||
if (!fwreq)
|
||||
return NULL;
|
||||
|
||||
@@ -743,6 +741,7 @@ brcmf_fw_alloc_request(u32 chip, u32 chiprev,
|
||||
|
||||
for (j = 0; j < n_fwnames; j++) {
|
||||
fwreq->items[j].path = fwnames[j].path;
|
||||
fwnames[j].path[0] = '\0';
|
||||
/* check if firmware path is provided by module parameter */
|
||||
if (brcmf_mp_global.firmware_path[0] != '\0') {
|
||||
strlcpy(fwnames[j].path, mp_path,
|
||||
|
||||
@@ -580,24 +580,6 @@ static bool brcmf_fws_ifidx_match(struct sk_buff *skb, void *arg)
|
||||
return ifidx == *(int *)arg;
|
||||
}
|
||||
|
||||
static void brcmf_fws_psq_flush(struct brcmf_fws_info *fws, struct pktq *q,
|
||||
int ifidx)
|
||||
{
|
||||
bool (*matchfn)(struct sk_buff *, void *) = NULL;
|
||||
struct sk_buff *skb;
|
||||
int prec;
|
||||
|
||||
if (ifidx != -1)
|
||||
matchfn = brcmf_fws_ifidx_match;
|
||||
for (prec = 0; prec < q->num_prec; prec++) {
|
||||
skb = brcmu_pktq_pdeq_match(q, prec, matchfn, &ifidx);
|
||||
while (skb) {
|
||||
brcmu_pkt_buf_free_skb(skb);
|
||||
skb = brcmu_pktq_pdeq_match(q, prec, matchfn, &ifidx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void brcmf_fws_hanger_init(struct brcmf_fws_hanger *hanger)
|
||||
{
|
||||
int i;
|
||||
@@ -669,6 +651,28 @@ static inline int brcmf_fws_hanger_poppkt(struct brcmf_fws_hanger *h,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void brcmf_fws_psq_flush(struct brcmf_fws_info *fws, struct pktq *q,
|
||||
int ifidx)
|
||||
{
|
||||
bool (*matchfn)(struct sk_buff *, void *) = NULL;
|
||||
struct sk_buff *skb;
|
||||
int prec;
|
||||
u32 hslot;
|
||||
|
||||
if (ifidx != -1)
|
||||
matchfn = brcmf_fws_ifidx_match;
|
||||
for (prec = 0; prec < q->num_prec; prec++) {
|
||||
skb = brcmu_pktq_pdeq_match(q, prec, matchfn, &ifidx);
|
||||
while (skb) {
|
||||
hslot = brcmf_skb_htod_tag_get_field(skb, HSLOT);
|
||||
brcmf_fws_hanger_poppkt(&fws->hanger, hslot, &skb,
|
||||
true);
|
||||
brcmu_pkt_buf_free_skb(skb);
|
||||
skb = brcmu_pktq_pdeq_match(q, prec, matchfn, &ifidx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int brcmf_fws_hanger_mark_suppressed(struct brcmf_fws_hanger *h,
|
||||
u32 slot_id)
|
||||
{
|
||||
@@ -2200,6 +2204,8 @@ void brcmf_fws_del_interface(struct brcmf_if *ifp)
|
||||
brcmf_fws_lock(fws);
|
||||
ifp->fws_desc = NULL;
|
||||
brcmf_dbg(TRACE, "deleting %s\n", entry->name);
|
||||
brcmf_fws_macdesc_cleanup(fws, &fws->desc.iface[ifp->ifidx],
|
||||
ifp->ifidx);
|
||||
brcmf_fws_macdesc_deinit(entry);
|
||||
brcmf_fws_cleanup(fws, ifp->ifidx);
|
||||
brcmf_fws_unlock(fws);
|
||||
@@ -2437,17 +2443,25 @@ struct brcmf_fws_info *brcmf_fws_attach(struct brcmf_pub *drvr)
|
||||
return fws;
|
||||
|
||||
fail:
|
||||
brcmf_fws_detach(fws);
|
||||
brcmf_fws_detach_pre_delif(fws);
|
||||
brcmf_fws_detach_post_delif(fws);
|
||||
return ERR_PTR(rc);
|
||||
}
|
||||
|
||||
void brcmf_fws_detach(struct brcmf_fws_info *fws)
|
||||
void brcmf_fws_detach_pre_delif(struct brcmf_fws_info *fws)
|
||||
{
|
||||
if (!fws)
|
||||
return;
|
||||
|
||||
if (fws->fws_wq)
|
||||
if (fws->fws_wq) {
|
||||
destroy_workqueue(fws->fws_wq);
|
||||
fws->fws_wq = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void brcmf_fws_detach_post_delif(struct brcmf_fws_info *fws)
|
||||
{
|
||||
if (!fws)
|
||||
return;
|
||||
|
||||
/* cleanup */
|
||||
brcmf_fws_lock(fws);
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
#define FWSIGNAL_H_
|
||||
|
||||
struct brcmf_fws_info *brcmf_fws_attach(struct brcmf_pub *drvr);
|
||||
void brcmf_fws_detach(struct brcmf_fws_info *fws);
|
||||
void brcmf_fws_detach_pre_delif(struct brcmf_fws_info *fws);
|
||||
void brcmf_fws_detach_post_delif(struct brcmf_fws_info *fws);
|
||||
void brcmf_fws_debugfs_create(struct brcmf_pub *drvr);
|
||||
bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws);
|
||||
bool brcmf_fws_fc_active(struct brcmf_fws_info *fws);
|
||||
|
||||
@@ -345,6 +345,10 @@ static const u32 brcmf_ring_itemsize[BRCMF_NROF_COMMON_MSGRINGS] = {
|
||||
BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE
|
||||
};
|
||||
|
||||
static void brcmf_pcie_setup(struct device *dev, int ret,
|
||||
struct brcmf_fw_request *fwreq);
|
||||
static struct brcmf_fw_request *
|
||||
brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo);
|
||||
|
||||
static u32
|
||||
brcmf_pcie_read_reg32(struct brcmf_pciedev_info *devinfo, u32 reg_offset)
|
||||
@@ -730,7 +734,7 @@ static void brcmf_pcie_handle_mb_data(struct brcmf_pciedev_info *devinfo)
|
||||
}
|
||||
if (dtoh_mb_data & BRCMF_D2H_DEV_FWHALT) {
|
||||
brcmf_dbg(PCIE, "D2H_MB_DATA: FW HALT\n");
|
||||
brcmf_dev_coredump(&devinfo->pdev->dev);
|
||||
brcmf_fw_crashed(&devinfo->pdev->dev);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1409,6 +1413,36 @@ int brcmf_pcie_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int brcmf_pcie_reset(struct device *dev)
|
||||
{
|
||||
struct brcmf_bus *bus_if = dev_get_drvdata(dev);
|
||||
struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie;
|
||||
struct brcmf_pciedev_info *devinfo = buspub->devinfo;
|
||||
struct brcmf_fw_request *fwreq;
|
||||
int err;
|
||||
|
||||
brcmf_detach(dev);
|
||||
|
||||
brcmf_pcie_release_irq(devinfo);
|
||||
brcmf_pcie_release_scratchbuffers(devinfo);
|
||||
brcmf_pcie_release_ringbuffers(devinfo);
|
||||
brcmf_pcie_reset_device(devinfo);
|
||||
|
||||
fwreq = brcmf_pcie_prepare_fw_request(devinfo);
|
||||
if (!fwreq) {
|
||||
dev_err(dev, "Failed to prepare FW request\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
err = brcmf_fw_get_firmwares(dev, fwreq, brcmf_pcie_setup);
|
||||
if (err) {
|
||||
dev_err(dev, "Failed to prepare FW request\n");
|
||||
kfree(fwreq);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static const struct brcmf_bus_ops brcmf_pcie_bus_ops = {
|
||||
.txdata = brcmf_pcie_tx,
|
||||
.stop = brcmf_pcie_down,
|
||||
@@ -1418,6 +1452,7 @@ static const struct brcmf_bus_ops brcmf_pcie_bus_ops = {
|
||||
.get_ramsize = brcmf_pcie_get_ramsize,
|
||||
.get_memdump = brcmf_pcie_get_memdump,
|
||||
.get_fwname = brcmf_pcie_get_fwname,
|
||||
.reset = brcmf_pcie_reset,
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -67,16 +67,22 @@ fail:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
void brcmf_proto_detach(struct brcmf_pub *drvr)
|
||||
void brcmf_proto_detach_post_delif(struct brcmf_pub *drvr)
|
||||
{
|
||||
brcmf_dbg(TRACE, "Enter\n");
|
||||
|
||||
if (drvr->proto) {
|
||||
if (drvr->bus_if->proto_type == BRCMF_PROTO_BCDC)
|
||||
brcmf_proto_bcdc_detach(drvr);
|
||||
brcmf_proto_bcdc_detach_post_delif(drvr);
|
||||
else if (drvr->bus_if->proto_type == BRCMF_PROTO_MSGBUF)
|
||||
brcmf_proto_msgbuf_detach(drvr);
|
||||
kfree(drvr->proto);
|
||||
drvr->proto = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void brcmf_proto_detach_pre_delif(struct brcmf_pub *drvr)
|
||||
{
|
||||
if (drvr->proto && drvr->bus_if->proto_type == BRCMF_PROTO_BCDC)
|
||||
brcmf_proto_bcdc_detach_pre_delif(drvr);
|
||||
}
|
||||
|
||||
@@ -54,7 +54,8 @@ struct brcmf_proto {
|
||||
|
||||
|
||||
int brcmf_proto_attach(struct brcmf_pub *drvr);
|
||||
void brcmf_proto_detach(struct brcmf_pub *drvr);
|
||||
void brcmf_proto_detach_pre_delif(struct brcmf_pub *drvr);
|
||||
void brcmf_proto_detach_post_delif(struct brcmf_pub *drvr);
|
||||
|
||||
static inline int brcmf_proto_hdrpull(struct brcmf_pub *drvr, bool do_fws,
|
||||
struct sk_buff *skb,
|
||||
|
||||
@@ -622,6 +622,7 @@ BRCMF_FW_DEF(43430A0, "brcmfmac43430a0-sdio");
|
||||
/* Note the names are not postfixed with a1 for backward compatibility */
|
||||
BRCMF_FW_DEF(43430A1, "brcmfmac43430-sdio");
|
||||
BRCMF_FW_DEF(43455, "brcmfmac43455-sdio");
|
||||
BRCMF_FW_DEF(43456, "brcmfmac43456-sdio");
|
||||
BRCMF_FW_DEF(4354, "brcmfmac4354-sdio");
|
||||
BRCMF_FW_DEF(4356, "brcmfmac4356-sdio");
|
||||
BRCMF_FW_DEF(4373, "brcmfmac4373-sdio");
|
||||
@@ -642,7 +643,8 @@ static const struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = {
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4339_CHIP_ID, 0xFFFFFFFF, 4339),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43430_CHIP_ID, 0x00000001, 43430A0),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_43430_CHIP_ID, 0xFFFFFFFE, 43430A1),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4345_CHIP_ID, 0xFFFFFFC0, 43455),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4345_CHIP_ID, 0x00000200, 43456),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4345_CHIP_ID, 0xFFFFFDC0, 43455),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, 4354),
|
||||
BRCMF_FW_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356),
|
||||
BRCMF_FW_ENTRY(CY_CC_4373_CHIP_ID, 0xFFFFFFFF, 4373),
|
||||
@@ -1090,8 +1092,8 @@ static u32 brcmf_sdio_hostmail(struct brcmf_sdio *bus)
|
||||
|
||||
/* dongle indicates the firmware has halted/crashed */
|
||||
if (hmb_data & HMB_DATA_FWHALT) {
|
||||
brcmf_err("mailbox indicates firmware halted\n");
|
||||
brcmf_dev_coredump(&sdiod->func1->dev);
|
||||
brcmf_dbg(SDIO, "mailbox indicates firmware halted\n");
|
||||
brcmf_fw_crashed(&sdiod->func1->dev);
|
||||
}
|
||||
|
||||
/* Dongle recomposed rx frames, accept them again */
|
||||
|
||||
@@ -160,7 +160,7 @@ struct brcmf_usbdev_info {
|
||||
|
||||
struct usb_device *usbdev;
|
||||
struct device *dev;
|
||||
struct mutex dev_init_lock;
|
||||
struct completion dev_init_done;
|
||||
|
||||
int ctl_in_pipe, ctl_out_pipe;
|
||||
struct urb *ctl_urb; /* URB for control endpoint */
|
||||
@@ -445,22 +445,17 @@ fail:
|
||||
|
||||
}
|
||||
|
||||
static void brcmf_usb_free_q(struct list_head *q, bool pending)
|
||||
static void brcmf_usb_free_q(struct list_head *q)
|
||||
{
|
||||
struct brcmf_usbreq *req, *next;
|
||||
int i = 0;
|
||||
|
||||
list_for_each_entry_safe(req, next, q, list) {
|
||||
if (!req->urb) {
|
||||
brcmf_err("bad req\n");
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
if (pending) {
|
||||
usb_kill_urb(req->urb);
|
||||
} else {
|
||||
usb_free_urb(req->urb);
|
||||
list_del_init(&req->list);
|
||||
}
|
||||
usb_free_urb(req->urb);
|
||||
list_del_init(&req->list);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -682,12 +677,18 @@ static int brcmf_usb_up(struct device *dev)
|
||||
|
||||
static void brcmf_cancel_all_urbs(struct brcmf_usbdev_info *devinfo)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (devinfo->ctl_urb)
|
||||
usb_kill_urb(devinfo->ctl_urb);
|
||||
if (devinfo->bulk_urb)
|
||||
usb_kill_urb(devinfo->bulk_urb);
|
||||
brcmf_usb_free_q(&devinfo->tx_postq, true);
|
||||
brcmf_usb_free_q(&devinfo->rx_postq, true);
|
||||
if (devinfo->tx_reqs)
|
||||
for (i = 0; i < devinfo->bus_pub.ntxq; i++)
|
||||
usb_kill_urb(devinfo->tx_reqs[i].urb);
|
||||
if (devinfo->rx_reqs)
|
||||
for (i = 0; i < devinfo->bus_pub.nrxq; i++)
|
||||
usb_kill_urb(devinfo->rx_reqs[i].urb);
|
||||
}
|
||||
|
||||
static void brcmf_usb_down(struct device *dev)
|
||||
@@ -1023,8 +1024,8 @@ static void brcmf_usb_detach(struct brcmf_usbdev_info *devinfo)
|
||||
brcmf_dbg(USB, "Enter, devinfo %p\n", devinfo);
|
||||
|
||||
/* free the URBS */
|
||||
brcmf_usb_free_q(&devinfo->rx_freeq, false);
|
||||
brcmf_usb_free_q(&devinfo->tx_freeq, false);
|
||||
brcmf_usb_free_q(&devinfo->rx_freeq);
|
||||
brcmf_usb_free_q(&devinfo->tx_freeq);
|
||||
|
||||
usb_free_urb(devinfo->ctl_urb);
|
||||
usb_free_urb(devinfo->bulk_urb);
|
||||
@@ -1193,11 +1194,11 @@ static void brcmf_usb_probe_phase2(struct device *dev, int ret,
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
mutex_unlock(&devinfo->dev_init_lock);
|
||||
complete(&devinfo->dev_init_done);
|
||||
return;
|
||||
error:
|
||||
brcmf_dbg(TRACE, "failed: dev=%s, err=%d\n", dev_name(dev), ret);
|
||||
mutex_unlock(&devinfo->dev_init_lock);
|
||||
complete(&devinfo->dev_init_done);
|
||||
device_release_driver(dev);
|
||||
}
|
||||
|
||||
@@ -1265,7 +1266,7 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
|
||||
if (ret)
|
||||
goto fail;
|
||||
/* we are done */
|
||||
mutex_unlock(&devinfo->dev_init_lock);
|
||||
complete(&devinfo->dev_init_done);
|
||||
return 0;
|
||||
}
|
||||
bus->chip = bus_pub->devid;
|
||||
@@ -1325,11 +1326,10 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
|
||||
devinfo->usbdev = usb;
|
||||
devinfo->dev = &usb->dev;
|
||||
/* Take an init lock, to protect for disconnect while still loading.
|
||||
/* Init completion, to protect for disconnect while still loading.
|
||||
* Necessary because of the asynchronous firmware load construction
|
||||
*/
|
||||
mutex_init(&devinfo->dev_init_lock);
|
||||
mutex_lock(&devinfo->dev_init_lock);
|
||||
init_completion(&devinfo->dev_init_done);
|
||||
|
||||
usb_set_intfdata(intf, devinfo);
|
||||
|
||||
@@ -1407,7 +1407,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
mutex_unlock(&devinfo->dev_init_lock);
|
||||
complete(&devinfo->dev_init_done);
|
||||
kfree(devinfo);
|
||||
usb_set_intfdata(intf, NULL);
|
||||
return ret;
|
||||
@@ -1422,7 +1422,7 @@ brcmf_usb_disconnect(struct usb_interface *intf)
|
||||
devinfo = (struct brcmf_usbdev_info *)usb_get_intfdata(intf);
|
||||
|
||||
if (devinfo) {
|
||||
mutex_lock(&devinfo->dev_init_lock);
|
||||
wait_for_completion(&devinfo->dev_init_done);
|
||||
/* Make sure that devinfo still exists. Firmware probe routines
|
||||
* may have released the device and cleared the intfdata.
|
||||
*/
|
||||
|
||||
@@ -577,7 +577,6 @@ il4965_math_div_round(s32 num, s32 denom, s32 * res)
|
||||
sign = -sign;
|
||||
denom = -denom;
|
||||
}
|
||||
*res = 1;
|
||||
*res = ((num * 2 + denom) / (denom * 2)) * sign;
|
||||
|
||||
return 1;
|
||||
|
||||
@@ -89,6 +89,7 @@
|
||||
#define IWL_22000_SO_A_HR_B_FW_PRE "iwlwifi-so-a0-hr-b0-"
|
||||
#define IWL_22000_SO_A_GF_A_FW_PRE "iwlwifi-so-a0-gf-a0-"
|
||||
#define IWL_22000_TY_A_GF_A_FW_PRE "iwlwifi-ty-a0-gf-a0-"
|
||||
#define IWL_22000_SO_A_GF4_A_FW_PRE "iwlwifi-so-a0-gf4-a0-"
|
||||
|
||||
#define IWL_22000_HR_MODULE_FIRMWARE(api) \
|
||||
IWL_22000_HR_FW_PRE __stringify(api) ".ucode"
|
||||
@@ -180,7 +181,11 @@ static const struct iwl_ht_params iwl_22000_ht_params = {
|
||||
.dbgc_supported = true, \
|
||||
.min_umac_error_event_table = 0x400000, \
|
||||
.d3_debug_data_base_addr = 0x401000, \
|
||||
.d3_debug_data_length = 60 * 1024
|
||||
.d3_debug_data_length = 60 * 1024, \
|
||||
.fw_mon_smem_write_ptr_addr = 0xa0c16c, \
|
||||
.fw_mon_smem_write_ptr_msk = 0xfffff, \
|
||||
.fw_mon_smem_cycle_cnt_ptr_addr = 0xa0c174, \
|
||||
.fw_mon_smem_cycle_cnt_ptr_msk = 0xfffff
|
||||
|
||||
#define IWL_DEVICE_AX200_COMMON \
|
||||
IWL_DEVICE_22000_COMMON, \
|
||||
@@ -190,7 +195,8 @@ static const struct iwl_ht_params iwl_22000_ht_params = {
|
||||
IWL_DEVICE_22000_COMMON, \
|
||||
.device_family = IWL_DEVICE_FAMILY_22000, \
|
||||
.base_params = &iwl_22000_base_params, \
|
||||
.csr = &iwl_csr_v1
|
||||
.csr = &iwl_csr_v1, \
|
||||
.gp2_reg_addr = 0xa02c68
|
||||
|
||||
#define IWL_DEVICE_22560 \
|
||||
IWL_DEVICE_22000_COMMON, \
|
||||
@@ -203,7 +209,9 @@ static const struct iwl_ht_params iwl_22000_ht_params = {
|
||||
.device_family = IWL_DEVICE_FAMILY_AX210, \
|
||||
.base_params = &iwl_22000_base_params, \
|
||||
.csr = &iwl_csr_v1, \
|
||||
.min_txq_size = 128
|
||||
.min_txq_size = 128, \
|
||||
.gp2_reg_addr = 0xd02c68, \
|
||||
.min_256_ba_txq_size = 512
|
||||
|
||||
const struct iwl_cfg iwl22000_2ac_cfg_hr = {
|
||||
.name = "Intel(R) Dual Band Wireless AC 22000",
|
||||
@@ -440,12 +448,20 @@ const struct iwl_cfg iwlax210_2ax_cfg_so_hr_a0 = {
|
||||
const struct iwl_cfg iwlax210_2ax_cfg_so_gf_a0 = {
|
||||
.name = "Intel(R) Wi-Fi 7 AX211 160MHz",
|
||||
.fw_name_pre = IWL_22000_SO_A_GF_A_FW_PRE,
|
||||
.uhb_supported = true,
|
||||
IWL_DEVICE_AX210,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwlax210_2ax_cfg_ty_gf_a0 = {
|
||||
.name = "Intel(R) Wi-Fi 7 AX210 160MHz",
|
||||
.fw_name_pre = IWL_22000_TY_A_GF_A_FW_PRE,
|
||||
.uhb_supported = true,
|
||||
IWL_DEVICE_AX210,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwlax210_2ax_cfg_so_gf4_a0 = {
|
||||
.name = "Intel(R) Wi-Fi 7 AX210 160MHz",
|
||||
.fw_name_pre = IWL_22000_SO_A_GF4_A_FW_PRE,
|
||||
IWL_DEVICE_AX210,
|
||||
};
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2015-2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018 Intel Corporation
|
||||
* Copyright (C) 2018 - 2019 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
@@ -20,7 +20,7 @@
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2015-2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018 Intel Corporation
|
||||
* Copyright (C) 2018 - 2019 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -148,7 +148,11 @@ static const struct iwl_tt_params iwl9000_tt_params = {
|
||||
.d3_debug_data_length = 92 * 1024, \
|
||||
.ht_params = &iwl9000_ht_params, \
|
||||
.nvm_ver = IWL9000_NVM_VERSION, \
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K
|
||||
.max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K, \
|
||||
.fw_mon_smem_write_ptr_addr = 0xa0476c, \
|
||||
.fw_mon_smem_write_ptr_msk = 0xfffff, \
|
||||
.fw_mon_smem_cycle_cnt_ptr_addr = 0xa04774, \
|
||||
.fw_mon_smem_cycle_cnt_ptr_msk = 0xfffff
|
||||
|
||||
|
||||
const struct iwl_cfg iwl9160_2ac_cfg = {
|
||||
|
||||
@@ -60,12 +60,13 @@
|
||||
|
||||
#include <linux/bitops.h>
|
||||
|
||||
/*
|
||||
/**
|
||||
* struct iwl_fw_ini_header: Common Header for all debug group TLV's structures
|
||||
*
|
||||
* @tlv_version: version info
|
||||
* @apply_point: &enum iwl_fw_ini_apply_point
|
||||
* @data: TLV data followed
|
||||
**/
|
||||
*/
|
||||
struct iwl_fw_ini_header {
|
||||
__le32 tlv_version;
|
||||
__le32 apply_point;
|
||||
@@ -73,7 +74,7 @@ struct iwl_fw_ini_header {
|
||||
} __packed; /* FW_DEBUG_TLV_HEADER_S */
|
||||
|
||||
/**
|
||||
* struct iwl_fw_ini_allocation_tlv - (IWL_FW_INI_TLV_TYPE_BUFFER_ALLOCATION)
|
||||
* struct iwl_fw_ini_allocation_tlv - (IWL_UCODE_TLV_TYPE_BUFFER_ALLOCATION)
|
||||
* buffer allocation TLV - for debug
|
||||
*
|
||||
* @iwl_fw_ini_header: header
|
||||
@@ -84,7 +85,7 @@ struct iwl_fw_ini_header {
|
||||
* @max_fragments: the maximum allowed fragmentation in the desired memory
|
||||
* allocation above
|
||||
* @min_frag_size: the minimum allowed fragmentation size in bytes
|
||||
*/
|
||||
*/
|
||||
struct iwl_fw_ini_allocation_tlv {
|
||||
struct iwl_fw_ini_header header;
|
||||
__le32 allocation_id;
|
||||
@@ -95,33 +96,52 @@ struct iwl_fw_ini_allocation_tlv {
|
||||
} __packed; /* FW_DEBUG_TLV_BUFFER_ALLOCATION_TLV_S_VER_1 */
|
||||
|
||||
/**
|
||||
* struct iwl_fw_ini_hcmd (IWL_FW_INI_TLV_TYPE_HCMD)
|
||||
* Generic Host command pass through TLV
|
||||
* enum iwl_fw_ini_dbg_domain - debug domains
|
||||
* allows to send host cmd or collect memory region if a given domain is enabled
|
||||
*
|
||||
* @IWL_FW_INI_DBG_DOMAIN_ALWAYS_ON: the default domain, always on
|
||||
* @IWL_FW_INI_DBG_DOMAIN_REPORT_PS: power save domain
|
||||
*/
|
||||
enum iwl_fw_ini_dbg_domain {
|
||||
IWL_FW_INI_DBG_DOMAIN_ALWAYS_ON = 0,
|
||||
IWL_FW_INI_DBG_DOMAIN_REPORT_PS,
|
||||
}; /* FW_DEBUG_TLV_DOMAIN_API_E_VER_1 */
|
||||
|
||||
/**
|
||||
* struct iwl_fw_ini_hcmd
|
||||
*
|
||||
* @id: the debug configuration command type for instance: 0xf6 / 0xf5 / DHC
|
||||
* @group: the desired cmd group
|
||||
* @padding: all zeros for dword alignment
|
||||
* @data: all of the relevant command (0xf6/0xf5) to be sent
|
||||
*/
|
||||
* @reserved: to align to FW struct
|
||||
* @data: all of the relevant command data to be sent
|
||||
*/
|
||||
struct iwl_fw_ini_hcmd {
|
||||
u8 id;
|
||||
u8 group;
|
||||
__le16 padding;
|
||||
__le16 reserved;
|
||||
u8 data[0];
|
||||
} __packed; /* FW_DEBUG_TLV_HCMD_DATA_S */
|
||||
} __packed; /* FW_DEBUG_TLV_HCMD_DATA_API_S_VER_1 */
|
||||
|
||||
/**
|
||||
* struct iwl_fw_ini_hcmd_tlv
|
||||
* struct iwl_fw_ini_hcmd_tlv - (IWL_UCODE_TLV_TYPE_HCMD)
|
||||
* Generic Host command pass through TLV
|
||||
*
|
||||
* @header: header
|
||||
* @domain: send command only if the specific domain is enabled
|
||||
* &enum iwl_fw_ini_dbg_domain
|
||||
* @period_msec: period in which the hcmd will be sent to FW. Measured in msec
|
||||
* (0 = one time command).
|
||||
* @hcmd: a variable length host-command to be sent to apply the configuration.
|
||||
*/
|
||||
struct iwl_fw_ini_hcmd_tlv {
|
||||
struct iwl_fw_ini_header header;
|
||||
__le32 domain;
|
||||
__le32 period_msec;
|
||||
struct iwl_fw_ini_hcmd hcmd;
|
||||
} __packed; /* FW_DEBUG_TLV_HCMD_S_VER_1 */
|
||||
} __packed; /* FW_DEBUG_TLV_HCMD_API_S_VER_1 */
|
||||
|
||||
/*
|
||||
* struct iwl_fw_ini_debug_flow_tlv (IWL_FW_INI_TLV_TYPE_DEBUG_FLOW)
|
||||
/**
|
||||
* struct iwl_fw_ini_debug_flow_tlv - (IWL_UCODE_TLV_TYPE_DEBUG_FLOW)
|
||||
*
|
||||
* @header: header
|
||||
* @debug_flow_cfg: &enum iwl_fw_ini_debug_flow
|
||||
@@ -134,8 +154,20 @@ struct iwl_fw_ini_debug_flow_tlv {
|
||||
#define IWL_FW_INI_MAX_REGION_ID 64
|
||||
#define IWL_FW_INI_MAX_NAME 32
|
||||
|
||||
/**
|
||||
* struct iwl_fw_ini_region_cfg_dhc - defines dhc response to dump.
|
||||
*
|
||||
* @id_and_grp: id and group of dhc response.
|
||||
* @desc: dhc response descriptor.
|
||||
*/
|
||||
struct iwl_fw_ini_region_cfg_dhc {
|
||||
__le32 id_and_grp;
|
||||
__le32 desc;
|
||||
} __packed; /* FW_DEBUG_TLV_REGION_DHC_API_S_VER_1 */
|
||||
|
||||
/**
|
||||
* struct iwl_fw_ini_region_cfg_internal - meta data of internal memory region
|
||||
*
|
||||
* @num_of_range: the amount of ranges in the region
|
||||
* @range_data_size: size of the data to read per range, in bytes.
|
||||
*/
|
||||
@@ -146,6 +178,7 @@ struct iwl_fw_ini_region_cfg_internal {
|
||||
|
||||
/**
|
||||
* struct iwl_fw_ini_region_cfg_fifos - meta data of fifos region
|
||||
*
|
||||
* @fid1: fifo id 1 - bitmap of lmac tx/rx fifos to include in the region
|
||||
* @fid2: fifo id 2 - bitmap of umac rx fifos to include in the region.
|
||||
* It is unused for tx.
|
||||
@@ -163,34 +196,43 @@ struct iwl_fw_ini_region_cfg_fifos {
|
||||
|
||||
/**
|
||||
* struct iwl_fw_ini_region_cfg
|
||||
*
|
||||
* @region_id: ID of this dump configuration
|
||||
* @region_type: &enum iwl_fw_ini_region_type
|
||||
* @num_regions: amount of regions in the address array.
|
||||
* @domain: dump this region only if the specific domain is enabled
|
||||
* &enum iwl_fw_ini_dbg_domain
|
||||
* @name_len: name length
|
||||
* @name: file name to use for this region
|
||||
* @internal: used in case the region uses internal memory.
|
||||
* @allocation_id: For DRAM type field substitutes for allocation_id
|
||||
* @fifos: used in case of fifos region.
|
||||
* @dhc_desc: dhc response descriptor.
|
||||
* @notif_id_and_grp: dump this region only if the specific notification
|
||||
* occurred.
|
||||
* @offset: offset to use for each memory base address
|
||||
* @start_addr: array of addresses.
|
||||
*/
|
||||
struct iwl_fw_ini_region_cfg {
|
||||
__le32 region_id;
|
||||
__le32 region_type;
|
||||
__le32 domain;
|
||||
__le32 name_len;
|
||||
u8 name[IWL_FW_INI_MAX_NAME];
|
||||
union {
|
||||
struct iwl_fw_ini_region_cfg_internal internal;
|
||||
__le32 allocation_id;
|
||||
struct iwl_fw_ini_region_cfg_fifos fifos;
|
||||
};
|
||||
struct iwl_fw_ini_region_cfg_dhc dhc_desc;
|
||||
__le32 notif_id_and_grp;
|
||||
}; /* FW_DEBUG_TLV_REGION_EXT_INT_PARAMS_API_U_VER_1 */
|
||||
__le32 offset;
|
||||
__le32 start_addr[];
|
||||
} __packed; /* FW_DEBUG_TLV_REGION_CONFIG_S */
|
||||
} __packed; /* FW_DEBUG_TLV_REGION_CONFIG_API_S_VER_1 */
|
||||
|
||||
/**
|
||||
* struct iwl_fw_ini_region_tlv - (IWL_FW_INI_TLV_TYPE_REGION_CFG)
|
||||
* DUMP sections define IDs and triggers that use those IDs TLV
|
||||
* struct iwl_fw_ini_region_tlv - (IWL_UCODE_TLV_TYPE_REGIONS)
|
||||
* defines memory regions to dump
|
||||
*
|
||||
* @header: header
|
||||
* @num_regions: how many different region section and IDs are coming next
|
||||
* @region_config: list of dump configurations
|
||||
@@ -199,13 +241,12 @@ struct iwl_fw_ini_region_tlv {
|
||||
struct iwl_fw_ini_header header;
|
||||
__le32 num_regions;
|
||||
struct iwl_fw_ini_region_cfg region_config[];
|
||||
} __packed; /* FW_DEBUG_TLV_REGIONS_S_VER_1 */
|
||||
} __packed; /* FW_DEBUG_TLV_REGIONS_API_S_VER_1 */
|
||||
|
||||
/**
|
||||
* struct iwl_fw_ini_trigger - (IWL_FW_INI_TLV_TYPE_DUMP_CFG)
|
||||
* Region sections define IDs and triggers that use those IDs TLV
|
||||
* struct iwl_fw_ini_trigger
|
||||
*
|
||||
* @trigger_id: enum &iwl_fw_ini_tigger_id
|
||||
* @trigger_id: &enum iwl_fw_ini_trigger_id
|
||||
* @override_trig: determines how apply trigger in case a trigger with the
|
||||
* same id is already in use. Using the first 2 bytes:
|
||||
* Byte 0: if 0, override trigger configuration, otherwise use the
|
||||
@@ -214,6 +255,7 @@ struct iwl_fw_ini_region_tlv {
|
||||
* existing trigger.
|
||||
* @dump_delay: delay from trigger fire to dump, in usec
|
||||
* @occurrences: max amount of times to be fired
|
||||
* @reserved: to align to FW struct
|
||||
* @ignore_consec: ignore consecutive triggers, in usec
|
||||
* @force_restart: force FW restart
|
||||
* @multi_dut: initiate debug dump data on several DUTs
|
||||
@@ -226,17 +268,18 @@ struct iwl_fw_ini_trigger {
|
||||
__le32 override_trig;
|
||||
__le32 dump_delay;
|
||||
__le32 occurrences;
|
||||
__le32 reserved;
|
||||
__le32 ignore_consec;
|
||||
__le32 force_restart;
|
||||
__le32 multi_dut;
|
||||
__le32 trigger_data;
|
||||
__le32 num_regions;
|
||||
__le32 data[];
|
||||
} __packed; /* FW_TLV_DEBUG_TRIGGER_CONFIG_S */
|
||||
} __packed; /* FW_TLV_DEBUG_TRIGGER_CONFIG_API_S_VER_1 */
|
||||
|
||||
/**
|
||||
* struct iwl_fw_ini_trigger_tlv - (IWL_FW_INI_TLV_TYPE_TRIGGERS_CFG)
|
||||
* DUMP sections define IDs and triggers that use those IDs TLV
|
||||
* struct iwl_fw_ini_trigger_tlv - (IWL_UCODE_TLV_TYPE_TRIGGERS)
|
||||
* Triggers that hold memory regions to dump in case a trigger fires
|
||||
*
|
||||
* @header: header
|
||||
* @num_triggers: how many different triggers section and IDs are coming next
|
||||
@@ -246,16 +289,18 @@ struct iwl_fw_ini_trigger_tlv {
|
||||
struct iwl_fw_ini_header header;
|
||||
__le32 num_triggers;
|
||||
struct iwl_fw_ini_trigger trigger_config[];
|
||||
} __packed; /* FW_TLV_DEBUG_TRIGGERS_S_VER_1 */
|
||||
} __packed; /* FW_TLV_DEBUG_TRIGGERS_API_S_VER_1 */
|
||||
|
||||
/**
|
||||
* enum iwl_fw_ini_trigger_id
|
||||
*
|
||||
* @IWL_FW_TRIGGER_ID_FW_ASSERT: FW assert
|
||||
* @IWL_FW_TRIGGER_ID_FW_HW_ERROR: HW assert
|
||||
* @IWL_FW_TRIGGER_ID_FW_TFD_Q_HANG: TFD queue hang
|
||||
* @IWL_FW_TRIGGER_ID_FW_DEBUG_HOST_TRIGGER: FW debug notification
|
||||
* @IWL_FW_TRIGGER_ID_FW_GENERIC_NOTIFOCATION: FW generic notification
|
||||
* @IWL_FW_TRIGGER_ID_FW_GENERIC_NOTIFICATION: FW generic notification
|
||||
* @IWL_FW_TRIGGER_ID_USER_TRIGGER: User trigger
|
||||
* @IWL_FW_TRIGGER_ID_PERIODIC_TRIGGER: triggers periodically
|
||||
* @IWL_FW_TRIGGER_ID_HOST_PEER_CLIENT_INACTIVITY: peer inactivity
|
||||
* @IWL_FW_TRIGGER_ID_HOST_TX_LATENCY_THRESHOLD_CROSSED: TX latency
|
||||
* threshold was crossed
|
||||
@@ -299,47 +344,51 @@ enum iwl_fw_ini_trigger_id {
|
||||
|
||||
/* FW triggers */
|
||||
IWL_FW_TRIGGER_ID_FW_DEBUG_HOST_TRIGGER = 4,
|
||||
IWL_FW_TRIGGER_ID_FW_GENERIC_NOTIFOCATION = 5,
|
||||
IWL_FW_TRIGGER_ID_FW_GENERIC_NOTIFICATION = 5,
|
||||
|
||||
/* User trigger */
|
||||
IWL_FW_TRIGGER_ID_USER_TRIGGER = 6,
|
||||
|
||||
/* periodic uses the data field for the interval time */
|
||||
IWL_FW_TRIGGER_ID_PERIODIC_TRIGGER = 7,
|
||||
|
||||
/* Host triggers */
|
||||
IWL_FW_TRIGGER_ID_HOST_PEER_CLIENT_INACTIVITY = 7,
|
||||
IWL_FW_TRIGGER_ID_HOST_TX_LATENCY_THRESHOLD_CROSSED = 8,
|
||||
IWL_FW_TRIGGER_ID_HOST_TX_RESPONSE_STATUS_FAILED = 9,
|
||||
IWL_FW_TRIGGER_ID_HOST_OS_REQ_DEAUTH_PEER = 10,
|
||||
IWL_FW_TRIGGER_ID_HOST_STOP_GO_REQUEST = 11,
|
||||
IWL_FW_TRIGGER_ID_HOST_START_GO_REQUEST = 12,
|
||||
IWL_FW_TRIGGER_ID_HOST_JOIN_GROUP_REQUEST = 13,
|
||||
IWL_FW_TRIGGER_ID_HOST_SCAN_START = 14,
|
||||
IWL_FW_TRIGGER_ID_HOST_SCAN_SUBMITTED = 15,
|
||||
IWL_FW_TRIGGER_ID_HOST_SCAN_PARAMS = 16,
|
||||
IWL_FW_TRIGGER_ID_HOST_CHECK_FOR_HANG = 17,
|
||||
IWL_FW_TRIGGER_ID_HOST_BAR_RECEIVED = 18,
|
||||
IWL_FW_TRIGGER_ID_HOST_AGG_TX_RESPONSE_STATUS_FAILED = 19,
|
||||
IWL_FW_TRIGGER_ID_HOST_EAPOL_TX_RESPONSE_FAILED = 20,
|
||||
IWL_FW_TRIGGER_ID_HOST_FAKE_TX_RESPONSE_SUSPECTED = 21,
|
||||
IWL_FW_TRIGGER_ID_HOST_AUTH_REQ_FROM_ASSOC_CLIENT = 22,
|
||||
IWL_FW_TRIGGER_ID_HOST_ROAM_COMPLETE = 23,
|
||||
IWL_FW_TRIGGER_ID_HOST_AUTH_ASSOC_FAST_FAILED = 24,
|
||||
IWL_FW_TRIGGER_ID_HOST_D3_START = 25,
|
||||
IWL_FW_TRIGGER_ID_HOST_D3_END = 26,
|
||||
IWL_FW_TRIGGER_ID_HOST_BSS_MISSED_BEACONS = 27,
|
||||
IWL_FW_TRIGGER_ID_HOST_P2P_CLIENT_MISSED_BEACONS = 28,
|
||||
IWL_FW_TRIGGER_ID_HOST_PEER_CLIENT_TX_FAILURES = 29,
|
||||
IWL_FW_TRIGGER_ID_HOST_TX_WFD_ACTION_FRAME_FAILED = 30,
|
||||
IWL_FW_TRIGGER_ID_HOST_AUTH_ASSOC_FAILED = 31,
|
||||
IWL_FW_TRIGGER_ID_HOST_SCAN_COMPLETE = 32,
|
||||
IWL_FW_TRIGGER_ID_HOST_SCAN_ABORT = 33,
|
||||
IWL_FW_TRIGGER_ID_HOST_NIC_ALIVE = 34,
|
||||
IWL_FW_TRIGGER_ID_HOST_CHANNEL_SWITCH_COMPLETE = 35,
|
||||
IWL_FW_TRIGGER_ID_HOST_PEER_CLIENT_INACTIVITY = 8,
|
||||
IWL_FW_TRIGGER_ID_HOST_TX_LATENCY_THRESHOLD_CROSSED = 9,
|
||||
IWL_FW_TRIGGER_ID_HOST_TX_RESPONSE_STATUS_FAILED = 10,
|
||||
IWL_FW_TRIGGER_ID_HOST_OS_REQ_DEAUTH_PEER = 11,
|
||||
IWL_FW_TRIGGER_ID_HOST_STOP_GO_REQUEST = 12,
|
||||
IWL_FW_TRIGGER_ID_HOST_START_GO_REQUEST = 13,
|
||||
IWL_FW_TRIGGER_ID_HOST_JOIN_GROUP_REQUEST = 14,
|
||||
IWL_FW_TRIGGER_ID_HOST_SCAN_START = 15,
|
||||
IWL_FW_TRIGGER_ID_HOST_SCAN_SUBMITTED = 16,
|
||||
IWL_FW_TRIGGER_ID_HOST_SCAN_PARAMS = 17,
|
||||
IWL_FW_TRIGGER_ID_HOST_CHECK_FOR_HANG = 18,
|
||||
IWL_FW_TRIGGER_ID_HOST_BAR_RECEIVED = 19,
|
||||
IWL_FW_TRIGGER_ID_HOST_AGG_TX_RESPONSE_STATUS_FAILED = 20,
|
||||
IWL_FW_TRIGGER_ID_HOST_EAPOL_TX_RESPONSE_FAILED = 21,
|
||||
IWL_FW_TRIGGER_ID_HOST_FAKE_TX_RESPONSE_SUSPECTED = 22,
|
||||
IWL_FW_TRIGGER_ID_HOST_AUTH_REQ_FROM_ASSOC_CLIENT = 23,
|
||||
IWL_FW_TRIGGER_ID_HOST_ROAM_COMPLETE = 24,
|
||||
IWL_FW_TRIGGER_ID_HOST_AUTH_ASSOC_FAST_FAILED = 25,
|
||||
IWL_FW_TRIGGER_ID_HOST_D3_START = 26,
|
||||
IWL_FW_TRIGGER_ID_HOST_D3_END = 27,
|
||||
IWL_FW_TRIGGER_ID_HOST_BSS_MISSED_BEACONS = 28,
|
||||
IWL_FW_TRIGGER_ID_HOST_P2P_CLIENT_MISSED_BEACONS = 29,
|
||||
IWL_FW_TRIGGER_ID_HOST_PEER_CLIENT_TX_FAILURES = 30,
|
||||
IWL_FW_TRIGGER_ID_HOST_TX_WFD_ACTION_FRAME_FAILED = 31,
|
||||
IWL_FW_TRIGGER_ID_HOST_AUTH_ASSOC_FAILED = 32,
|
||||
IWL_FW_TRIGGER_ID_HOST_SCAN_COMPLETE = 33,
|
||||
IWL_FW_TRIGGER_ID_HOST_SCAN_ABORT = 34,
|
||||
IWL_FW_TRIGGER_ID_HOST_NIC_ALIVE = 35,
|
||||
IWL_FW_TRIGGER_ID_HOST_CHANNEL_SWITCH_COMPLETE = 36,
|
||||
|
||||
IWL_FW_TRIGGER_ID_NUM,
|
||||
}; /* FW_DEBUG_TLV_TRIGGER_ID_E_VER_1 */
|
||||
|
||||
/**
|
||||
* enum iwl_fw_ini_apply_point
|
||||
*
|
||||
* @IWL_FW_INI_APPLY_INVALID: invalid
|
||||
* @IWL_FW_INI_APPLY_EARLY: pre loading FW
|
||||
* @IWL_FW_INI_APPLY_AFTER_ALIVE: first cmd from host after alive
|
||||
@@ -360,6 +409,7 @@ enum iwl_fw_ini_apply_point {
|
||||
|
||||
/**
|
||||
* enum iwl_fw_ini_allocation_id
|
||||
*
|
||||
* @IWL_FW_INI_ALLOCATION_INVALID: invalid
|
||||
* @IWL_FW_INI_ALLOCATION_ID_DBGC1: allocation meant for DBGC1 configuration
|
||||
* @IWL_FW_INI_ALLOCATION_ID_DBGC2: allocation meant for DBGC2 configuration
|
||||
@@ -380,18 +430,22 @@ enum iwl_fw_ini_allocation_id {
|
||||
|
||||
/**
|
||||
* enum iwl_fw_ini_buffer_location
|
||||
*
|
||||
* @IWL_FW_INI_LOCATION_INVALID: invalid
|
||||
* @IWL_FW_INI_LOCATION_SRAM_PATH: SRAM location
|
||||
* @IWL_FW_INI_LOCATION_DRAM_PATH: DRAM location
|
||||
* @IWL_FW_INI_LOCATION_NPK_PATH: NPK location
|
||||
*/
|
||||
enum iwl_fw_ini_buffer_location {
|
||||
IWL_FW_INI_LOCATION_INVALID,
|
||||
IWL_FW_INI_LOCATION_SRAM_PATH,
|
||||
IWL_FW_INI_LOCATION_DRAM_PATH,
|
||||
IWL_FW_INI_LOCATION_NPK_PATH,
|
||||
}; /* FW_DEBUG_TLV_BUFFER_LOCATION_E_VER_1 */
|
||||
|
||||
/**
|
||||
* enum iwl_fw_ini_debug_flow
|
||||
*
|
||||
* @IWL_FW_INI_DEBUG_INVALID: invalid
|
||||
* @IWL_FW_INI_DEBUG_DBTR_FLOW: undefined
|
||||
* @IWL_FW_INI_DEBUG_TB2DTF_FLOW: undefined
|
||||
@@ -404,6 +458,7 @@ enum iwl_fw_ini_debug_flow {
|
||||
|
||||
/**
|
||||
* enum iwl_fw_ini_region_type
|
||||
*
|
||||
* @IWL_FW_INI_REGION_INVALID: invalid
|
||||
* @IWL_FW_INI_REGION_DEVICE_MEMORY: device internal memory
|
||||
* @IWL_FW_INI_REGION_PERIPHERY_MAC: periphery registers of MAC
|
||||
@@ -416,6 +471,8 @@ enum iwl_fw_ini_debug_flow {
|
||||
* @IWL_FW_INI_REGION_RXF: RX fifo
|
||||
* @IWL_FW_INI_REGION_PAGING: paging memory
|
||||
* @IWL_FW_INI_REGION_CSR: CSR registers
|
||||
* @IWL_FW_INI_REGION_NOTIFICATION: FW notification data
|
||||
* @IWL_FW_INI_REGION_DHC: dhc response to dump
|
||||
* @IWL_FW_INI_REGION_NUM: number of region types
|
||||
*/
|
||||
enum iwl_fw_ini_region_type {
|
||||
@@ -431,6 +488,8 @@ enum iwl_fw_ini_region_type {
|
||||
IWL_FW_INI_REGION_RXF,
|
||||
IWL_FW_INI_REGION_PAGING,
|
||||
IWL_FW_INI_REGION_CSR,
|
||||
IWL_FW_INI_REGION_NOTIFICATION,
|
||||
IWL_FW_INI_REGION_DHC,
|
||||
IWL_FW_INI_REGION_NUM
|
||||
}; /* FW_DEBUG_TLV_REGION_TYPE_E_VER_1 */
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user