Module Name: src Committed By: nonaka Date: Fri Feb 13 17:14:06 UTC 2015
Modified Files: src/sys/dev/pci: if_iwm.c if_iwmvar.h Log Message: Sync with OpenBSD if_iwm.c rev.1.18. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/dev/pci/if_iwm.c src/sys/dev/pci/if_iwmvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_iwm.c diff -u src/sys/dev/pci/if_iwm.c:1.1 src/sys/dev/pci/if_iwm.c:1.2 --- src/sys/dev/pci/if_iwm.c:1.1 Sat Feb 7 13:20:00 2015 +++ src/sys/dev/pci/if_iwm.c Fri Feb 13 17:14:06 2015 @@ -1,5 +1,5 @@ -/* $NetBSD: if_iwm.c,v 1.1 2015/02/07 13:20:00 pooka Exp $ */ -/* OpenBSD: if_iwm.c,v 1.3 2015/02/07 07:10:44 phessler Exp */ +/* $NetBSD: if_iwm.c,v 1.2 2015/02/13 17:14:06 nonaka Exp $ */ +/* OpenBSD: if_iwm.c,v 1.18 2015/02/11 01:12:42 brad Exp */ /* * Copyright (c) 2014 genua mbh <i...@genua.de> @@ -105,7 +105,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_iwm.c,v 1.1 2015/02/07 13:20:00 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_iwm.c,v 1.2 2015/02/13 17:14:06 nonaka Exp $"); #include <sys/param.h> #include <sys/conf.h> @@ -173,6 +173,7 @@ const uint8_t iwm_nvm_channels[] = { }; #define IWM_NUM_2GHZ_CHANNELS 14 +/* It looks like 11a TX is broken, unfortunately. */ #define IWM_NO_5GHZ 1 const struct iwm_rate { @@ -198,18 +199,6 @@ const struct iwm_rate { #define IWM_RIDX_IS_CCK(_i_) ((_i_) < IWM_RIDX_OFDM) #define IWM_RIDX_IS_OFDM(_i_) ((_i_) >= IWM_RIDX_OFDM) -/* - * Supported rates for 802.11a/b/g modes (in 500Kbps unit). - */ -const struct ieee80211_rateset iwm_rateset_11a = - { 8, { 12, 18, 24, 36, 48, 72, 96, 108 } }; - -const struct ieee80211_rateset iwm_rateset_11b = - { 4, { 2, 4, 11, 22 } }; - -const struct ieee80211_rateset iwm_rateset_11g = - { 12, { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 } }; - struct iwm_newstate_state { struct work ns_wk; struct ieee80211com *ns_ic; @@ -409,7 +398,9 @@ void iwm_stop(struct ifnet *, int); void iwm_watchdog(struct ifnet *); int iwm_ioctl(struct ifnet *, u_long, void *); const char *iwm_desc_lookup(uint32_t); +#ifdef IWM_DEBUG void iwm_nic_error(struct iwm_softc *); +#endif void iwm_notif_intr(struct iwm_softc *); int iwm_intr(void *); int iwm_preinit(struct iwm_softc *); @@ -579,8 +570,8 @@ iwm_set_default_calib(struct iwm_softc * uint32_t ucode_type = le32toh(def_calib->ucode_type); if (ucode_type >= IWM_UCODE_TYPE_MAX) { - printf("%s: Wrong ucode_type %u for default " - "calibration.\n", DEVNAME(sc), ucode_type); + DPRINTF(("%s: Wrong ucode_type %u for default " + "calibration.\n", DEVNAME(sc), ucode_type)); return EINVAL; } @@ -600,7 +591,8 @@ iwm_read_firmware(struct iwm_softc *sc) struct iwm_ucode_tlv tlv; enum iwm_ucode_tlv_type tlv_type; uint8_t *data; - int error, status, len; + int error, status; + size_t len; if (fw->fw_status == IWM_FW_STATUS_NONE) { fw->fw_status = IWM_FW_STATUS_INPROGRESS; @@ -612,10 +604,6 @@ iwm_read_firmware(struct iwm_softc *sc) if (status == IWM_FW_STATUS_DONE) return 0; - else if (status < 0) - return -status; - - KASSERT(status == IWM_FW_STATUS_INPROGRESS); /* * Load firmware into driver memory. @@ -623,8 +611,8 @@ iwm_read_firmware(struct iwm_softc *sc) */ error = iwm_firmload(sc); if (error != 0) { - printf("%s: could not read firmware %s\n", - DEVNAME(sc), sc->sc_fwname); + printf("%s: could not read firmware %s (error %d)\n", + DEVNAME(sc), sc->sc_fwname, error); goto out; } @@ -646,7 +634,7 @@ iwm_read_firmware(struct iwm_softc *sc) len = fw->fw_rawsize - sizeof(*uhdr); while (len >= sizeof(tlv)) { - uint32_t tlv_len; + size_t tlv_len; void *tlv_data; memcpy(&tlv, data, sizeof(tlv)); @@ -658,7 +646,8 @@ iwm_read_firmware(struct iwm_softc *sc) tlv_data = data; if (len < tlv_len) { - printf("%s: firmware image invalid length\n", DEVNAME(sc)); + printf("%s: firmware too short: %zu bytes\n", + DEVNAME(sc), len); error = EINVAL; goto parse_out; } @@ -673,8 +662,8 @@ iwm_read_firmware(struct iwm_softc *sc) = le32toh(*(uint32_t *)tlv_data); /* limit it to something sensible */ if (sc->sc_capa_max_probe_len > (1<<16)) { - printf("%s: IWM_UCODE_TLV_PROBE_MAX_LEN " - "ridiculous\n", DEVNAME(sc)); + DPRINTF(("%s: IWM_UCODE_TLV_PROBE_MAX_LEN " + "ridiculous\n", DEVNAME(sc))); error = EINVAL; goto parse_out; } @@ -715,8 +704,8 @@ iwm_read_firmware(struct iwm_softc *sc) goto parse_out; } if (le32toh(*(uint32_t*)tlv_data) != 1) { - printf("%s: driver supports " - "only TLV_NUM_OF_CPU == 1", DEVNAME(sc)); + DPRINTF(("%s: driver supports " + "only TLV_NUM_OF_CPU == 1", DEVNAME(sc))); error = EINVAL; goto parse_out; } @@ -758,8 +747,8 @@ iwm_read_firmware(struct iwm_softc *sc) break; default: - printf("%s: unknown firmware section %d, abort\n", - DEVNAME(sc), tlv_type); + DPRINTF(("%s: unknown firmware section %d, abort\n", + DEVNAME(sc), tlv_type)); error = EINVAL; goto parse_out; } @@ -782,12 +771,10 @@ iwm_read_firmware(struct iwm_softc *sc) } out: - if (error) { - KASSERT(error > 0); - fw->fw_status = -error; - } else { + if (error) + fw->fw_status = IWM_FW_STATUS_NONE; + else fw->fw_status = IWM_FW_STATUS_DONE; - } wakeup(&sc->sc_fw); if (error) { @@ -841,7 +828,7 @@ iwm_read_mem(struct iwm_softc *sc, uint3 int iwm_write_mem(struct iwm_softc *sc, uint32_t addr, const void *buf, int dwords) { - int offs, ret = 0; + int offs; const uint32_t *vals = buf; if (iwm_nic_lock(sc)) { @@ -853,11 +840,10 @@ iwm_write_mem(struct iwm_softc *sc, uint } iwm_nic_unlock(sc); } else { - /* let's just say that it's good to notice this failure */ - printf("%s: WARNING: write_mem failed\n", DEVNAME(sc)); - ret = EBUSY; + DPRINTF(("%s: write_mem failed\n", DEVNAME(sc))); + return EBUSY; } - return ret; + return 0; } int @@ -1104,7 +1090,6 @@ iwm_alloc_rx_ring(struct iwm_softc *sc, } if ((error = iwm_rx_addbuf(sc, IWM_RBUF_SIZE, i)) != 0) { - printf("%s: could not add mbuf to ring", DEVNAME(sc)); goto fail; } } @@ -1127,10 +1112,6 @@ iwm_reset_rx_ring(struct iwm_softc *sc, break; DELAY(10); } - if (ntries == 1000) { - printf("%s: unable to detect idle rx chan after " - "reset\n", DEVNAME(sc)); - } iwm_nic_unlock(sc); } ring->cur = 0; @@ -1468,7 +1449,8 @@ iwm_apm_init(struct iwm_softc *sc) if (!iwm_poll_bit(sc, IWM_CSR_GP_CNTRL, IWM_CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, IWM_CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000)) { - printf("%s: Failed to init the card\n", DEVNAME(sc)); + printf("%s: timeout waiting for clock stabilization\n", + DEVNAME(sc)); goto out; } @@ -1527,7 +1509,7 @@ iwm_apm_stop(struct iwm_softc *sc) if (!iwm_poll_bit(sc, IWM_CSR_RESET, IWM_CSR_RESET_REG_FLAG_MASTER_DISABLED, IWM_CSR_RESET_REG_FLAG_MASTER_DISABLED, 100)) - printf("%s: Master Disable Timed Out, 100 usec\n", DEVNAME(sc)); + printf("%s: timeout waiting for master\n", DEVNAME(sc)); DPRINTF(("iwm apm stop\n")); } @@ -1587,10 +1569,6 @@ iwm_stop_device(struct iwm_softc *sc) break; DELAY(20); } - if (ntries == 200) { - printf("%s: unable to detect idle tx " - "chan after reset\n", DEVNAME(sc)); - } } iwm_nic_unlock(sc); } @@ -1807,8 +1785,8 @@ void iwm_enable_txq(struct iwm_softc *sc, int qid, int fifo) { if (!iwm_nic_lock(sc)) { - printf("%s: cannot enable txq %d\n", DEVNAME(sc), qid); - return; + DPRINTF(("%s: cannot enable txq %d\n", DEVNAME(sc), qid)); + return; /* XXX return EBUSY */ } /* unactivate before configuration */ @@ -1856,7 +1834,7 @@ iwm_post_alive(struct iwm_softc *sc) return EBUSY; if (sc->sched_base != iwm_read_prph(sc, IWM_SCD_SRAM_BASE_ADDR)) { - printf("%s: sched addr mismatch", DEVNAME(sc)); + DPRINTF(("%s: sched addr mismatch", DEVNAME(sc))); error = EINVAL; goto out; } @@ -2150,8 +2128,8 @@ iwm_phy_db_send_all_channel_groups(struc /* Send the requested PHY DB section */ err = iwm_send_phy_db_cmd(sc, type, entry->size, entry->data); if (err) { - printf("%s: Can't SEND phy_db section %d (%d), err %d", - DEVNAME(sc), type, i, err); + DPRINTF(("%s: Can't SEND phy_db section %d (%d), " + "err %d\n", DEVNAME(sc), type, i, err)); return err; } @@ -2173,29 +2151,30 @@ iwm_send_phy_db_data(struct iwm_softc *s /* Send PHY DB CFG section */ err = iwm_phy_db_get_section_data(sc, IWM_PHY_DB_CFG, &data, &size, 0); if (err) { - printf("%s: Cannot get Phy DB cfg section\n", DEVNAME(sc)); + DPRINTF(("%s: Cannot get Phy DB cfg section, %d\n", + DEVNAME(sc), err)); return err; } err = iwm_send_phy_db_cmd(sc, IWM_PHY_DB_CFG, size, data); if (err) { - printf("%s: Cannot send HCMD of Phy DB cfg section\n", - DEVNAME(sc)); + DPRINTF(("%s: Cannot send HCMD of Phy DB cfg section, %d\n", + DEVNAME(sc), err)); return err; } err = iwm_phy_db_get_section_data(sc, IWM_PHY_DB_CALIB_NCH, &data, &size, 0); if (err) { - printf("%s: Cannot get Phy DB non specific channel section\n", - DEVNAME(sc)); + DPRINTF(("%s: Cannot get Phy DB non specific channel section, " + "%d\n", DEVNAME(sc), err)); return err; } err = iwm_send_phy_db_cmd(sc, IWM_PHY_DB_CALIB_NCH, size, data); if (err) { - printf("%s: Cannot send HCMD of Phy DB non specific channel " - "sect, %d\n", DEVNAME(sc), err); + DPRINTF(("%s: Cannot send HCMD of Phy DB non specific channel " + "sect, %d\n", DEVNAME(sc), err)); return err; } @@ -2203,8 +2182,8 @@ iwm_send_phy_db_data(struct iwm_softc *s err = iwm_phy_db_send_all_channel_groups(sc, IWM_PHY_DB_CALIB_CHG_PAPD, IWM_NUM_PAPD_CH_GROUPS); if (err) { - printf("%s: Cannot send channel specific PAPD groups", - DEVNAME(sc)); + DPRINTF(("%s: Cannot send channel specific PAPD groups, %d\n", + DEVNAME(sc), err)); return err; } @@ -2212,8 +2191,8 @@ iwm_send_phy_db_data(struct iwm_softc *s err = iwm_phy_db_send_all_channel_groups(sc, IWM_PHY_DB_CALIB_CHG_TXP, IWM_NUM_TXP_CH_GROUPS); if (err) { - printf("%s: Cannot send channel specific TX power groups", - DEVNAME(sc)); + DPRINTF(("%s: Cannot send channel specific TX power groups, " + "%d\n", DEVNAME(sc), err)); return err; } @@ -2307,8 +2286,8 @@ iwm_mvm_time_event_send_add(struct iwm_s ret = iwm_mvm_send_time_event_cmd(sc, te_cmd); if (ret) { - printf("%s: Couldn't send IWM_TIME_EVENT_CMD: %d\n", - DEVNAME(sc), ret); + DPRINTF(("%s: Couldn't send IWM_TIME_EVENT_CMD: %d\n", + DEVNAME(sc), ret)); } return ret; @@ -2398,8 +2377,8 @@ iwm_nvm_read_chunk(struct iwm_softc *sc, pkt = cmd.resp_pkt; if (pkt->hdr.flags & IWM_CMD_FAILED_MSK) { - printf("%s: Bad return from IWM_NVM_ACCES_COMMAND (0x%08X)\n", - DEVNAME(sc), pkt->hdr.flags); + DPRINTF(("%s: Bad return from IWM_NVM_ACCES_COMMAND (0x%08X)\n", + DEVNAME(sc), pkt->hdr.flags)); ret = EIO; goto exit; } @@ -2412,15 +2391,15 @@ iwm_nvm_read_chunk(struct iwm_softc *sc, offset_read = le16toh(nvm_resp->offset); resp_data = nvm_resp->data; if (ret) { - printf("%s: NVM access command failed with status %d\n", - DEVNAME(sc), ret); + DPRINTF(("%s: NVM access command failed with status %d\n", + DEVNAME(sc), ret)); ret = EINVAL; goto exit; } if (offset_read != offset) { - printf("%s: NVM ACCESS response with invalid offset %d\n", - DEVNAME(sc), offset_read); + DPRINTF(("%s: NVM ACCESS response with invalid offset %d\n", + DEVNAME(sc), offset_read)); ret = EINVAL; goto exit; } @@ -2608,13 +2587,17 @@ iwm_parse_nvm_data(struct iwm_softc *sc, sku = le16_to_cpup(nvm_sw + IWM_SKU); data->sku_cap_band_24GHz_enable = sku & IWM_NVM_SKU_CAP_BAND_24GHZ; +#ifndef IWM_NO_5GHZ data->sku_cap_band_52GHz_enable = sku & IWM_NVM_SKU_CAP_BAND_52GHZ; +#else + data->sku_cap_band_52GHz_enable = 0; +#endif data->sku_cap_11n_enable = 0; if (!data->valid_tx_ant || !data->valid_rx_ant) { - printf("%s: invalid antennas (0x%x, 0x%x)\n", + DPRINTF(("%s: invalid antennas (0x%x, 0x%x)\n", DEVNAME(sc), data->valid_tx_ant, - data->valid_rx_ant); + data->valid_rx_ant)); return EINVAL; } @@ -2666,7 +2649,7 @@ iwm_parse_nvm_sections(struct iwm_softc /* Checking for required sections */ if (!sections[IWM_NVM_SECTION_TYPE_SW].data || !sections[IWM_NVM_SECTION_TYPE_HW].data) { - printf("%s: Can't parse empty NVM sections\n", DEVNAME(sc)); + DPRINTF(("%s: Can't parse empty NVM sections\n", DEVNAME(sc))); return ENOENT; } @@ -2804,7 +2787,7 @@ iwm_start_fw(struct iwm_softc *sc, enum IWM_WRITE(sc, IWM_CSR_INT, ~0); if ((error = iwm_nic_init(sc)) != 0) { - printf("%s: Unable to init nic\n", DEVNAME(sc)); + printf("%s: unable to init nic\n", DEVNAME(sc)); return error; } @@ -2896,7 +2879,8 @@ iwm_run_init_mvm_ucode(struct iwm_softc /* do not operate with rfkill switch turned on */ if ((sc->sc_flags & IWM_FLAG_RFKILL) && !justnvm) { - printf("%s: rfkill active, no go\n", DEVNAME(sc)); + printf("%s: radio is disabled by hardware switch\n", + DEVNAME(sc)); return EPERM; } @@ -2931,8 +2915,8 @@ iwm_run_init_mvm_ucode(struct iwm_softc * to start the 16.0 uCode init image internal calibrations. */ if ((error = iwm_send_phy_cfg_cmd(sc)) != 0 ) { - printf("%s: Failed to run INIT " - "calibrations: %d\n", DEVNAME(sc), error); + DPRINTF(("%s: failed to run internal calibration: %d\n", + DEVNAME(sc), error)); return error; } @@ -3248,8 +3232,8 @@ iwm_mvm_rx_tx_cmd(struct iwm_softc *sc, struct iwm_node *in = txd->in; if (txd->done) { - printf("%s: got tx interrupt that's already been handled!\n", - DEVNAME(sc)); + DPRINTF(("%s: got tx interrupt that's already been handled!\n", + DEVNAME(sc))); return; } @@ -3316,13 +3300,14 @@ iwm_mvm_binding_cmd(struct iwm_softc *sc ret = iwm_mvm_send_cmd_pdu_status(sc, IWM_BINDING_CONTEXT_CMD, sizeof(cmd), &cmd, &status); if (ret) { - printf("%s: Failed to send binding (action:%d): %d\n", - DEVNAME(sc), action, ret); + DPRINTF(("%s: Failed to send binding (action:%d): %d\n", + DEVNAME(sc), action, ret)); return ret; } if (status) { - printf("%s: Binding command failed: %u\n", DEVNAME(sc), status); + DPRINTF(("%s: Binding command failed: %u\n", DEVNAME(sc), + status)); ret = EIO; } @@ -3584,7 +3569,7 @@ iwm_send_cmd(struct iwm_softc *sc, struc IWM_CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN, (IWM_CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY | IWM_CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP), 15000)) { - printf("%s: acquiring device failed\n", DEVNAME(sc)); + DPRINTF(("%s: acquiring device failed\n", DEVNAME(sc))); error = EBUSY; goto out; } @@ -3838,8 +3823,8 @@ iwm_tx(struct iwm_softc *sc, struct mbuf sizeof (struct ieee80211_frame); if (hdrlen != hdrlen2) - printf("%s: hdrlen error (%d != %d)\n", - DEVNAME(sc), hdrlen, hdrlen2); + DPRINTF(("%s: hdrlen error (%d != %d)\n", + DEVNAME(sc), hdrlen, hdrlen2)); tid = 0; @@ -4403,8 +4388,8 @@ iwm_mvm_add_int_sta_common(struct iwm_so DPRINTF(("Internal station added.\n")); return 0; default: - printf("%s: Add internal station failed, status=0x%x\n", - DEVNAME(sc), status); + DPRINTF(("%s: Add internal station failed, status=0x%x\n", + DEVNAME(sc), status)); ret = EIO; break; } @@ -4564,7 +4549,7 @@ iwm_mvm_scan_fill_channels(struct iwm_so nchan++; } if (nchan == 0) - printf("%s: NO CHANNEL!\n", DEVNAME(sc)); + DPRINTF(("%s: NO CHANNEL!\n", DEVNAME(sc))); return nchan; } @@ -4715,8 +4700,6 @@ iwm_mvm_scan_request(struct iwm_softc *s * to allocate the time events. Warn on it, but maybe we * should try to send the command again with different params. */ - printf("%s: Scan failed! status 0x%x ret %d\n", DEVNAME(sc), - status, ret); sc->sc_scanband = 0; ret = EIO; } @@ -4864,8 +4847,8 @@ iwm_mvm_mac_ctxt_send_cmd(struct iwm_sof int ret = iwm_mvm_send_cmd_pdu(sc, IWM_MAC_CONTEXT_CMD, IWM_CMD_SYNC, sizeof(*cmd), cmd); if (ret) - printf("%s: Failed to send MAC context (action:%d): %d\n", - DEVNAME(sc), le32toh(cmd->action), ret); + DPRINTF(("%s: Failed to send MAC context (action:%d): %d\n", + DEVNAME(sc), le32toh(cmd->action), ret)); return ret; } @@ -5102,7 +5085,7 @@ iwm_mvm_update_quotas(struct iwm_softc * ret = iwm_mvm_send_cmd_pdu(sc, IWM_TIME_QUOTA_CMD, IWM_CMD_SYNC, sizeof(cmd), &cmd); if (ret) - printf("%s: Failed to send quota: %d\n", DEVNAME(sc), ret); + DPRINTF(("%s: Failed to send quota: %d\n", DEVNAME(sc), ret)); return ret; } @@ -5129,24 +5112,24 @@ iwm_auth(struct iwm_softc *sc) in->in_assoc = 0; if ((error = iwm_mvm_mac_ctxt_add(sc, in)) != 0) { - printf("%s: failed to add MAC\n", DEVNAME(sc)); + DPRINTF(("%s: failed to add MAC\n", DEVNAME(sc))); return error; } if ((error = iwm_mvm_phy_ctxt_changed(sc, &sc->sc_phyctxt[0], in->in_ni.ni_chan, 1, 1)) != 0) { - printf("%s: failed add phy ctxt\n", DEVNAME(sc)); + DPRINTF(("%s: failed add phy ctxt\n", DEVNAME(sc))); return error; } in->in_phyctxt = &sc->sc_phyctxt[0]; if ((error = iwm_mvm_binding_add_vif(sc, in)) != 0) { - printf("%s: binding cmd\n", DEVNAME(sc)); + DPRINTF(("%s: binding cmd\n", DEVNAME(sc))); return error; } if ((error = iwm_mvm_add_sta(sc, in)) != 0) { - printf("%s: failed to add MAC\n", DEVNAME(sc)); + DPRINTF(("%s: failed to add MAC\n", DEVNAME(sc))); return error; } @@ -5167,10 +5150,10 @@ iwm_auth(struct iwm_softc *sc) * second, we have bigger problems */ if (sc->sc_auth_prot == 0) { - printf("%s: missed auth window!\n", DEVNAME(sc)); + DPRINTF(("%s: missed auth window!\n", DEVNAME(sc))); return ETIMEDOUT; } else if (sc->sc_auth_prot == -1) { - printf("%s: no time event, denied!\n", DEVNAME(sc)); + DPRINTF(("%s: no time event, denied!\n", DEVNAME(sc))); sc->sc_auth_prot = 0; return EAUTH; } @@ -5188,13 +5171,13 @@ iwm_assoc(struct iwm_softc *sc) int error; if ((error = iwm_mvm_update_sta(sc, in)) != 0) { - printf("%s: failed to update STA\n", DEVNAME(sc)); + DPRINTF(("%s: failed to update STA\n", DEVNAME(sc))); return error; } in->in_assoc = 1; if ((error = iwm_mvm_mac_ctxt_changed(sc, in)) != 0) { - printf("%s: failed to update MAC\n", DEVNAME(sc)); + DPRINTF(("%s: failed to update MAC\n", DEVNAME(sc))); return error; } @@ -5298,8 +5281,8 @@ iwm_setrates(struct iwm_node *in) int txant = 0; if (nrates > __arraycount(lq->rs_table)) { - printf("%s: node supports %d rates, driver handles only %zu\n", - DEVNAME(sc), nrates, __arraycount(lq->rs_table)); + DPRINTF(("%s: node supports %d rates, driver handles only " + "%zu\n", DEVNAME(sc), nrates, __arraycount(lq->rs_table))); return; } @@ -5313,7 +5296,8 @@ iwm_setrates(struct iwm_node *in) if (iwm_rates[ridx].rate == rate) break; if (ridx > IWM_RIDX_MAX) - printf("%s: WARNING: device rate for %d not found!\n", DEVNAME(sc), rate); + DPRINTF(("%s: WARNING: device rate for %d not found!\n", + DEVNAME(sc), rate)); else in->in_ridx[i] = ridx; } @@ -5456,14 +5440,8 @@ iwm_newstate_cb(void *wk) break; case IEEE80211_S_SCAN: - if (sc->sc_scanband) { - /* how does this print match the clause? */ - if (ic->ic_state != nstate) - printf("%s: scan request(%d) " - "while scanning(%d) ignored\n", - DEVNAME(sc), nstate, ic->ic_state); + if (sc->sc_scanband) break; - } if ((error = iwm_mvm_scan_request(sc, IEEE80211_CHAN_2GHZ, ic->ic_des_esslen != 0, @@ -5476,8 +5454,8 @@ iwm_newstate_cb(void *wk) case IEEE80211_S_AUTH: if ((error = iwm_auth(sc)) != 0) { - printf("%s: could not move to auth state: %d\n", - DEVNAME(sc), error); + DPRINTF(("%s: could not move to auth state: %d\n", + DEVNAME(sc), error)); return; } @@ -5485,8 +5463,8 @@ iwm_newstate_cb(void *wk) case IEEE80211_S_ASSOC: if ((error = iwm_assoc(sc)) != 0) { - printf("%s: failed to associate: %d\n", DEVNAME(sc), - error); + DPRINTF(("%s: failed to associate: %d\n", DEVNAME(sc), + error)); return; } break; @@ -5506,7 +5484,7 @@ iwm_newstate_cb(void *wk) cmd.data[0] = &in->in_lq; if ((error = iwm_send_cmd(sc, &cmd)) != 0) { - printf("%s: IWM_LQ_CMD failed\n", DEVNAME(sc)); + DPRINTF(("%s: IWM_LQ_CMD failed\n", DEVNAME(sc))); } callout_schedule(&sc->sc_calib_to, hz/2); @@ -5514,7 +5492,7 @@ iwm_newstate_cb(void *wk) break; } default: - panic("unsupported state %d\n", nstate); + break; } sc->sc_newstate(ic, nstate, arg); @@ -5531,7 +5509,7 @@ iwm_newstate(struct ieee80211com *ic, en iwmns = kmem_alloc(sizeof(*iwmns), KM_NOSLEEP); if (!iwmns) { - printf("%s: allocating state cb mem failed\n", DEVNAME(sc)); + DPRINTF(("%s: allocating state cb mem failed\n", DEVNAME(sc))); return ENOMEM; } @@ -5555,14 +5533,13 @@ iwm_endscan_cb(void *arg) DPRINTF(("scan ended\n")); if (sc->sc_scanband == IEEE80211_CHAN_2GHZ) { -#ifndef IWM_NO_5GHZ /* for quick testing, makes scan few sec faster */ +#ifndef IWM_NO_5GHZ int error; done = 0; if ((error = iwm_mvm_scan_request(sc, IEEE80211_CHAN_5GHZ, ic->ic_des_esslen != 0, ic->ic_des_essid, ic->ic_des_esslen)) != 0) { - printf("%s: could not initiate 5ghz scan\n", - DEVNAME(sc)); + printf("%s: could not initiate scan\n", DEVNAME(sc)); done = 1; } #else @@ -5588,7 +5565,7 @@ iwm_init_hw(struct iwm_softc *sc) struct ieee80211com *ic = &sc->sc_ic; int error, i, qid; - if ((error = iwm_prepare_card_hw(sc)) != 0) + if ((error = iwm_preinit(sc)) != 0) return error; if ((error = iwm_start_hw(sc)) != 0) @@ -5603,14 +5580,15 @@ iwm_init_hw(struct iwm_softc *sc) * image just loaded */ iwm_stop_device(sc); - if ((error = iwm_start_hw(sc)) != 0) + if ((error = iwm_start_hw(sc)) != 0) { + printf("%s: could not initialize hardware\n", DEVNAME(sc)); return error; + } /* omstart, this time with the regular firmware */ error = iwm_mvm_load_ucode_wait_alive(sc, IWM_UCODE_TYPE_REGULAR); if (error) { - printf("%s: Failed to start RT ucode: %d\n", DEVNAME(sc), - error); + printf("%s: could not load firmware\n", DEVNAME(sc)); goto error; } @@ -5807,7 +5785,9 @@ iwm_watchdog(struct ifnet *ifp) if (sc->sc_tx_timer > 0) { if (--sc->sc_tx_timer == 0) { printf("%s: device timeout\n", DEVNAME(sc)); +#ifdef IWM_DEBUG iwm_nic_error(sc); +#endif ifp->if_flags &= ~IFF_UP; iwm_stop(ifp, 1); ifp->if_oerrors++; @@ -5974,6 +5954,7 @@ iwm_desc_lookup(uint32_t num) return advanced_lookup[i].name; } +#ifdef IWM_DEBUG /* * Support for dumping the error log seemed like a good idea ... * but it's mostly hex junk and the only sensible thing is the @@ -6046,6 +6027,7 @@ iwm_nic_error(struct iwm_softc *sc) printf("%s: %08X | timestamp\n", DEVNAME(sc), table.u_timestamp); printf("%s: %08X | flow_handler\n", DEVNAME(sc), table.flow_handler); } +#endif #define SYNC_RESP_STRUCT(_var_, _pkt_) \ do { \ @@ -6203,7 +6185,7 @@ iwm_notif_intr(struct iwm_softc *sc) struct iwm_error_resp *resp; SYNC_RESP_STRUCT(resp, pkt); - printf("%s: Firmware error 0x%x, cmd 0x%x\n", + printf("%s: firmware error 0x%x, cmd 0x%x\n", DEVNAME(sc), le32toh(resp->error_type), resp->cmd_id); break; } @@ -6336,7 +6318,7 @@ iwm_intr(void *arg) DPRINTF((" 802.11 state %d\n", sc->sc_ic.ic_state)); #endif - printf("%s: firmware error, stopping device\n", DEVNAME(sc)); + printf("%s: fatal firmware error\n", DEVNAME(sc)); ifp->if_flags &= ~IFF_UP; iwm_stop(ifp, 1); rv = 1; @@ -6365,8 +6347,8 @@ iwm_intr(void *arg) if (r1 & IWM_CSR_INT_BIT_RF_KILL) { handled |= IWM_CSR_INT_BIT_RF_KILL; if (iwm_check_rfkill(sc) && (ifp->if_flags & IFF_UP)) { - printf("%s: rfkill switch, disabling interface\n", - DEVNAME(sc)); + DPRINTF(("%s: rfkill switch, disabling interface\n", + DEVNAME(sc))); ifp->if_flags &= ~IFF_UP; iwm_stop(ifp, 1); } @@ -6398,7 +6380,7 @@ iwm_intr(void *arg) } if (__predict_false(r1 & ~handled)) - printf("%s: unhandled interrupts: %x\n", DEVNAME(sc), r1); + DPRINTF(("%s: unhandled interrupts: %x\n", DEVNAME(sc), r1)); rv = 1; out_ena: @@ -6440,18 +6422,22 @@ iwm_preinit(struct iwm_softc *sc) { int error; - if ((error = iwm_prepare_card_hw(sc)) != 0) + if ((error = iwm_prepare_card_hw(sc)) != 0) { + printf("%s: could not initialize hardware\n", DEVNAME(sc)); return error; + } - if ((error = iwm_start_hw(sc)) != 0) - return error; + if (sc->sc_flags & IWM_FLAG_ATTACHED) + return 0; - if ((error = iwm_run_init_mvm_ucode(sc, 1)) != 0) { + if ((error = iwm_start_hw(sc)) != 0) { + printf("%s: could not initialize hardware\n", DEVNAME(sc)); return error; } + error = iwm_run_init_mvm_ucode(sc, 1); iwm_stop_device(sc); - return 0; + return error; } void @@ -6460,80 +6446,15 @@ iwm_attach_hook(struct device *dev) struct iwm_softc *sc = device_private(dev); struct ieee80211com *ic = &sc->sc_ic; struct ifnet *ifp = &sc->sc_ec.ec_if; - int error; - int txq_i, i; KASSERT(!cold); sc->sc_wantresp = -1; - /* only one firmware possibility for now */ - sc->sc_fwname = IWM_FWNAME; - sc->sc_fwdmasegsz = IWM_FWDMASEGSZ; - - /* - * We now start fiddling with the hardware - */ - - sc->sc_hw_rev = IWM_READ(sc, IWM_CSR_HW_REV); - if (iwm_prepare_card_hw(sc) != 0) { - printf("%s: failed to init hw\n", DEVNAME(sc)); + if (iwm_preinit(sc) != 0) return; - } - - /* Allocate DMA memory for firmware transfers. */ - if ((error = iwm_alloc_fwmem(sc)) != 0) { - printf("%s: could not allocate memory for firmware\n", - DEVNAME(sc)); - return; - } - - /* Allocate "Keep Warm" page. */ - if ((error = iwm_alloc_kw(sc)) != 0) { - printf("%s: could not allocate keep warm page\n", DEVNAME(sc)); - goto fail1; - } - - /* We use ICT interrupts */ - if ((error = iwm_alloc_ict(sc)) != 0) { - printf("%s: could not allocate ICT table\n", DEVNAME(sc)); - goto fail2; - } - - /* Allocate TX scheduler "rings". */ - if ((error = iwm_alloc_sched(sc)) != 0) { - printf("%s: could not allocate TX scheduler rings\n", - DEVNAME(sc)); - goto fail3; - } - - /* Allocate TX rings */ - for (txq_i = 0; txq_i < __arraycount(sc->txq); txq_i++) { - if ((error = iwm_alloc_tx_ring(sc, - &sc->txq[txq_i], txq_i)) != 0) { - printf("%s: could not allocate TX ring %d\n", - DEVNAME(sc), txq_i); - goto fail4; - } - } - - /* Allocate RX ring. */ - if ((error = iwm_alloc_rx_ring(sc, &sc->rxq)) != 0) { - printf("%s: could not allocate RX ring\n", DEVNAME(sc)); - goto fail4; - } - workqueue_create(&sc->sc_eswq, "iwmes", - (void *)iwm_endscan_cb, sc, PRI_NONE, IPL_NET, 0); - workqueue_create(&sc->sc_nswq, "iwmns", - (void *)iwm_newstate_cb, sc, PRI_NONE, IPL_NET, 0); - - /* Clear pending interrupts. */ - IWM_WRITE(sc, IWM_CSR_INT, 0xffffffff); - - if ((error = iwm_preinit(sc)) != 0) { - goto fail4; - } + sc->sc_flags |= IWM_FLAG_ATTACHED; ic->ic_ifp = ifp; printf("%s: hw rev: 0x%x, fw ver %d.%d (API ver %d), address %s\n", @@ -6549,15 +6470,18 @@ iwm_attach_hook(struct device *dev) /* Set device capabilities. */ ic->ic_caps = + IEEE80211_C_WEP | /* WEP */ IEEE80211_C_WPA | /* 802.11i */ IEEE80211_C_SHSLOT | /* short slot time supported */ IEEE80211_C_SHPREAMBLE; /* short preamble supported */ - ic->ic_sup_rates[IEEE80211_MODE_11A] = iwm_rateset_11a; - ic->ic_sup_rates[IEEE80211_MODE_11B] = iwm_rateset_11b; - ic->ic_sup_rates[IEEE80211_MODE_11G] = iwm_rateset_11g; +#ifndef IWM_NO_5GHZ + ic->ic_sup_rates[IEEE80211_MODE_11A] = ieee80211_std_rateset_11a; +#endif + ic->ic_sup_rates[IEEE80211_MODE_11B] = ieee80211_std_rateset_11b; + ic->ic_sup_rates[IEEE80211_MODE_11G] = ieee80211_std_rateset_11g; - for (i = 0; i < __arraycount(sc->sc_phyctxt); i++) { + for (int i = 0; i < __arraycount(sc->sc_phyctxt); i++) { sc->sc_phyctxt[i].id = i; } @@ -6600,18 +6524,6 @@ iwm_attach_hook(struct device *dev) iwm_radiotap_attach(sc); //task_set(&sc->init_task, iwm_init_task, sc); - - return; - - /* Free allocated memory if something failed during attachment. */ -fail4: while (--txq_i >= 0) - iwm_free_tx_ring(sc, &sc->txq[txq_i]); - iwm_free_sched(sc); -fail3: if (sc->ict_dma.vaddr != NULL) - iwm_free_ict(sc); -fail2: iwm_free_kw(sc); -fail1: iwm_free_fwmem(sc); - return; } void @@ -6624,6 +6536,7 @@ iwm_attach(struct device *parent, struct pcireg_t reg, memtype; const char *intrstr; int error; + int txq_i; sc->sc_pct = pa->pa_pc; sc->sc_pcitag = pa->pa_tag; @@ -6684,6 +6597,70 @@ iwm_attach(struct device *parent, struct } printf(", %s\n", intrstr); + /* only one firmware possibility for now */ + sc->sc_fwname = IWM_FWNAME; + sc->sc_fwdmasegsz = IWM_FWDMASEGSZ; + + /* + * We now start fiddling with the hardware + */ + + sc->sc_hw_rev = IWM_READ(sc, IWM_CSR_HW_REV); + if (iwm_prepare_card_hw(sc) != 0) { + printf("%s: could not initialize hardware\n", DEVNAME(sc)); + return; + } + + /* Allocate DMA memory for firmware transfers. */ + if ((error = iwm_alloc_fwmem(sc)) != 0) { + printf("%s: could not allocate memory for firmware\n", + DEVNAME(sc)); + return; + } + + /* Allocate "Keep Warm" page. */ + if ((error = iwm_alloc_kw(sc)) != 0) { + printf("%s: could not allocate keep warm page\n", DEVNAME(sc)); + goto fail1; + } + + /* We use ICT interrupts */ + if ((error = iwm_alloc_ict(sc)) != 0) { + printf("%s: could not allocate ICT table\n", DEVNAME(sc)); + goto fail2; + } + + /* Allocate TX scheduler "rings". */ + if ((error = iwm_alloc_sched(sc)) != 0) { + printf("%s: could not allocate TX scheduler rings\n", + DEVNAME(sc)); + goto fail3; + } + + /* Allocate TX rings */ + for (txq_i = 0; txq_i < __arraycount(sc->txq); txq_i++) { + if ((error = iwm_alloc_tx_ring(sc, + &sc->txq[txq_i], txq_i)) != 0) { + printf("%s: could not allocate TX ring %d\n", + DEVNAME(sc), txq_i); + goto fail4; + } + } + + /* Allocate RX ring. */ + if ((error = iwm_alloc_rx_ring(sc, &sc->rxq)) != 0) { + printf("%s: could not allocate RX ring\n", DEVNAME(sc)); + goto fail4; + } + + workqueue_create(&sc->sc_eswq, "iwmes", + (void *)iwm_endscan_cb, sc, PRI_NONE, IPL_NET, 0); + workqueue_create(&sc->sc_nswq, "iwmns", + (void *)iwm_newstate_cb, sc, PRI_NONE, IPL_NET, 0); + + /* Clear pending interrupts. */ + IWM_WRITE(sc, IWM_CSR_INT, 0xffffffff); + /* * We can't do normal attach before the file system is mounted * because we cannot read the MAC address without loading the @@ -6693,6 +6670,17 @@ iwm_attach(struct device *parent, struct * hook runs. */ config_mountroot(self, iwm_attach_hook); + + return; + + /* Free allocated memory if something failed during attachment. */ +fail4: while (--txq_i >= 0) + iwm_free_tx_ring(sc, &sc->txq[txq_i]); + iwm_free_sched(sc); +fail3: if (sc->ict_dma.vaddr != NULL) + iwm_free_ict(sc); +fail2: iwm_free_kw(sc); +fail1: iwm_free_fwmem(sc); } /* Index: src/sys/dev/pci/if_iwmvar.h diff -u src/sys/dev/pci/if_iwmvar.h:1.1 src/sys/dev/pci/if_iwmvar.h:1.2 --- src/sys/dev/pci/if_iwmvar.h:1.1 Sat Feb 7 13:20:00 2015 +++ src/sys/dev/pci/if_iwmvar.h Fri Feb 13 17:14:06 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: if_iwmvar.h,v 1.1 2015/02/07 13:20:00 pooka Exp $ */ +/* $NetBSD: if_iwmvar.h,v 1.2 2015/02/13 17:14:06 nonaka Exp $ */ /* OpenBSD: if_iwmvar.h,v 1.3 2015/02/07 07:10:44 phessler Exp */ /* @@ -293,6 +293,7 @@ struct iwm_rx_ring { #define IWM_FLAG_STOPPED 0x04 #define IWM_FLAG_RFKILL 0x08 #define IWM_FLAG_BUSY 0x10 +#define IWM_FLAG_ATTACHED 0x20 struct iwm_ucode_status { uint32_t uc_error_event_table;