diff options
217 files changed, 2092 insertions, 13713 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 2316278d9db9..b87c91203c52 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -20378,14 +20378,6 @@ F: drivers/cdrom/cdrom.c F: include/linux/cdrom.h F: include/uapi/linux/cdrom.h -UNISYS S-PAR DRIVERS -M: David Kershner <david.kershner@unisys.com> -L: sparmaintainer@unisys.com (Unisys internal) -S: Supported -F: drivers/staging/unisys/ -F: drivers/visorbus/ -F: include/linux/visorbus.h - UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER R: Alim Akhtar <alim.akhtar@samsung.com> R: Avri Altman <avri.altman@wdc.com> @@ -21204,7 +21196,7 @@ L: linux-kernel@vger.kernel.org S: Maintained T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git F: Documentation/driver-api/vme.rst -F: drivers/staging/vme/ +F: drivers/staging/vme_user/ F: drivers/vme/ F: include/linux/vme* diff --git a/drivers/Kconfig b/drivers/Kconfig index 8d6cd5d08722..0cbbe2c58648 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -225,8 +225,6 @@ source "drivers/mux/Kconfig" source "drivers/opp/Kconfig" -source "drivers/visorbus/Kconfig" - source "drivers/siox/Kconfig" source "drivers/slimbus/Kconfig" diff --git a/drivers/Makefile b/drivers/Makefile index f735c4955143..f7f6cb748481 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -181,7 +181,6 @@ obj-$(CONFIG_FPGA) += fpga/ obj-$(CONFIG_FSI) += fsi/ obj-$(CONFIG_TEE) += tee/ obj-$(CONFIG_MULTIPLEXER) += mux/ -obj-$(CONFIG_UNISYS_VISORBUS) += visorbus/ obj-$(CONFIG_SIOX) += siox/ obj-$(CONFIG_GNSS) += gnss/ obj-$(CONFIG_INTERCONNECT) += interconnect/ diff --git a/drivers/net/wireless/silabs/wfx/hif_tx.c b/drivers/net/wireless/silabs/wfx/hif_tx.c index 2b92c227efbc..d35dd940d968 100644 --- a/drivers/net/wireless/silabs/wfx/hif_tx.c +++ b/drivers/net/wireless/silabs/wfx/hif_tx.c @@ -280,7 +280,7 @@ int wfx_hif_stop_scan(struct wfx_vif *wvif) } int wfx_hif_join(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf, - struct ieee80211_channel *channel, const u8 *ssid, int ssidlen) + struct ieee80211_channel *channel, const u8 *ssid, int ssid_len) { int ret; struct wfx_hif_msg *hif; @@ -288,8 +288,8 @@ int wfx_hif_join(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf, WARN_ON(!conf->beacon_int); WARN_ON(!conf->basic_rates); - WARN_ON(sizeof(body->ssid) < ssidlen); - WARN(!conf->ibss_joined && !ssidlen, "joining an unknown BSS"); + WARN_ON(sizeof(body->ssid) < ssid_len); + WARN(!conf->ibss_joined && !ssid_len, "joining an unknown BSS"); if (!hif) return -ENOMEM; body->infrastructure_bss_mode = !conf->ibss_joined; @@ -300,8 +300,8 @@ int wfx_hif_join(struct wfx_vif *wvif, const struct ieee80211_bss_conf *conf, body->basic_rate_set = cpu_to_le32(wfx_rate_mask_to_hw(wvif->wdev, conf->basic_rates)); memcpy(body->bssid, conf->bssid, sizeof(body->bssid)); if (ssid) { - body->ssid_length = cpu_to_le32(ssidlen); - memcpy(body->ssid, ssid, ssidlen); + body->ssid_length = cpu_to_le32(ssid_len); + memcpy(body->ssid, ssid, ssid_len); } wfx_fill_header(hif, wvif->id, HIF_REQ_ID_JOIN, sizeof(*body)); ret = wfx_cmd_send(wvif->wdev, hif, NULL, 0, false); diff --git a/drivers/net/wireless/silabs/wfx/main.c b/drivers/net/wireless/silabs/wfx/main.c index bbfd3fa51921..e015bfb8d221 100644 --- a/drivers/net/wireless/silabs/wfx/main.c +++ b/drivers/net/wireless/silabs/wfx/main.c @@ -170,7 +170,7 @@ bool wfx_api_older_than(struct wfx_dev *wdev, int major, int minor) * * The PDS file is an array of Time-Length-Value structs. */ - int wfx_send_pds(struct wfx_dev *wdev, u8 *buf, size_t len) +int wfx_send_pds(struct wfx_dev *wdev, u8 *buf, size_t len) { int ret, chunk_type, chunk_len, chunk_num = 0; diff --git a/drivers/net/wireless/silabs/wfx/sta.c b/drivers/net/wireless/silabs/wfx/sta.c index e551fa284a43..329d7f4a2b2e 100644 --- a/drivers/net/wireless/silabs/wfx/sta.c +++ b/drivers/net/wireless/silabs/wfx/sta.c @@ -409,8 +409,8 @@ static void wfx_join(struct wfx_vif *wvif) struct ieee80211_bss_conf *conf = &vif->bss_conf; struct cfg80211_bss *bss = NULL; u8 ssid[IEEE80211_MAX_SSID_LEN]; - const u8 *ssidie = NULL; - int ssidlen = 0; + const u8 *ssid_ie = NULL; + int ssid_len = 0; int ret; wfx_tx_lock_flush(wvif->wdev); @@ -422,21 +422,21 @@ static void wfx_join(struct wfx_vif *wvif) return; } - rcu_read_lock(); /* protect ssidie */ + rcu_read_lock(); /* protect ssid_ie */ if (bss) - ssidie = ieee80211_bss_get_ie(bss, WLAN_EID_SSID); - if (ssidie) { - ssidlen = ssidie[1]; - if (ssidlen > IEEE80211_MAX_SSID_LEN) - ssidlen = IEEE80211_MAX_SSID_LEN; - memcpy(ssid, &ssidie[2], ssidlen); + ssid_ie = ieee80211_bss_get_ie(bss, WLAN_EID_SSID); + if (ssid_ie) { + ssid_len = ssid_ie[1]; + if (ssid_len > IEEE80211_MAX_SSID_LEN) + ssid_len = IEEE80211_MAX_SSID_LEN; + memcpy(ssid, &ssid_ie[2], ssid_len); } rcu_read_unlock(); cfg80211_put_bss(wvif->wdev->hw->wiphy, bss); wvif->join_in_progress = true; - ret = wfx_hif_join(wvif, conf, wvif->channel, ssid, ssidlen); + ret = wfx_hif_join(wvif, conf, wvif->channel, ssid, ssid_len); if (ret) { ieee80211_connection_loss(vif); wfx_reset(wvif); diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index fc274737053d..0a993c47273e 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig @@ -64,8 +64,6 @@ source "drivers/staging/gdm724x/Kconfig" source "drivers/staging/fwserial/Kconfig" -source "drivers/staging/unisys/Kconfig" - source "drivers/staging/clocking-wizard/Kconfig" source "drivers/staging/fbtft/Kconfig" @@ -86,5 +84,6 @@ source "drivers/staging/fieldbus/Kconfig" source "drivers/staging/qlge/Kconfig" +source "drivers/staging/vme_user/Kconfig" endif # STAGING diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index 65e317922e3f..2800ab9b2d1d 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile @@ -14,7 +14,7 @@ obj-$(CONFIG_OCTEON_ETHERNET) += octeon/ obj-$(CONFIG_OCTEON_USB) += octeon-usb/ obj-$(CONFIG_VT6655) += vt6655/ obj-$(CONFIG_VT6656) += vt6656/ -obj-$(CONFIG_VME_BUS) += vme/ +obj-$(CONFIG_VME_BUS) += vme_user/ obj-$(CONFIG_IIO) += iio/ obj-$(CONFIG_FB_SM750) += sm750fb/ obj-$(CONFIG_USB_EMXX) += emxx_udc/ @@ -22,7 +22,6 @@ obj-$(CONFIG_MFD_NVEC) += nvec/ obj-$(CONFIG_STAGING_BOARD) += board/ obj-$(CONFIG_LTE_GDM724X) += gdm724x/ obj-$(CONFIG_FIREWIRE_SERIAL) += fwserial/ -obj-$(CONFIG_UNISYSSPAR) += unisys/ obj-$(CONFIG_COMMON_CLK_XLNX_CLKWZRD) += clocking-wizard/ obj-$(CONFIG_FB_TFT) += fbtft/ obj-$(CONFIG_MOST) += most/ diff --git a/drivers/staging/fieldbus/anybuss/host.c b/drivers/staging/fieldbus/anybuss/host.c index a344410e48fe..cd86b9c9e345 100644 --- a/drivers/staging/fieldbus/anybuss/host.c +++ b/drivers/staging/fieldbus/anybuss/host.c @@ -1384,7 +1384,7 @@ anybuss_host_common_probe(struct device *dev, goto err_device; return cd; err_device: - device_unregister(&cd->client->dev); + put_device(&cd->client->dev); err_kthread: kthread_stop(cd->qthread); err_reset: diff --git a/drivers/staging/greybus/arche-apb-ctrl.c b/drivers/staging/greybus/arche-apb-ctrl.c index bbf3ba744fc4..45afa208d004 100644 --- a/drivers/staging/greybus/arche-apb-ctrl.c +++ b/drivers/staging/greybus/arche-apb-ctrl.c @@ -445,7 +445,7 @@ static int __maybe_unused arche_apb_ctrl_suspend(struct device *dev) static int __maybe_unused arche_apb_ctrl_resume(struct device *dev) { /* - * Atleast for ES2 we have to meet the delay requirement between + * At least for ES2 we have to meet the delay requirement between * unipro switch and AP bridge init, depending on whether bridge is in * OFF state or standby state. * diff --git a/drivers/staging/greybus/arche-platform.c b/drivers/staging/greybus/arche-platform.c index e374dfc0c92f..fcbd5f71eff2 100644 --- a/drivers/staging/greybus/arche-platform.c +++ b/drivers/staging/greybus/arche-platform.c @@ -591,7 +591,7 @@ static __maybe_unused int arche_platform_suspend(struct device *dev) static __maybe_unused int arche_platform_resume(struct device *dev) { /* - * Atleast for ES2 we have to meet the delay requirement between + * At least for ES2 we have to meet the delay requirement between * unipro switch and AP bridge init, depending on whether bridge is in * OFF state or standby state. * diff --git a/drivers/staging/greybus/audio_codec.c b/drivers/staging/greybus/audio_codec.c index db0b600ee5d1..0ad8aeabccbf 100644 --- a/drivers/staging/greybus/audio_codec.c +++ b/drivers/staging/greybus/audio_codec.c @@ -497,7 +497,7 @@ static int gbcodec_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { int ret; - struct gbaudio_module_info *module; + struct gbaudio_module_info *module = NULL, *iter; struct gbaudio_data_connection *data; struct gb_bundle *bundle; struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev); @@ -511,11 +511,13 @@ static int gbcodec_prepare(struct snd_pcm_substream *substream, return -ENODEV; } - list_for_each_entry(module, &codec->module_list, list) { + list_for_each_entry(iter, &codec->module_list, list) { /* find the dai */ - data = find_data(module, dai->id); - if (data) + data = find_data(iter, dai->id); + if (data) { + module = iter; break; + } } if (!data) { dev_err(dai->dev, "DATA connection missing\n"); @@ -563,7 +565,7 @@ static int gbcodec_mute_stream(struct snd_soc_dai *dai, int mute, int stream) { int ret; struct gbaudio_data_connection *data; - struct gbaudio_module_info *module; + struct gbaudio_module_info *module = NULL, *iter; struct gb_bundle *bundle; struct gbaudio_codec_info *codec = dev_get_drvdata(dai->dev); struct gbaudio_stream_params *params; @@ -592,15 +594,17 @@ static int gbcodec_mute_stream(struct snd_soc_dai *dai, int mute, int stream) return ret; } - list_for_each_entry(module, &codec->module_list, list) { + list_for_each_entry(iter, &codec->module_list, list) { /* find the dai */ - data = find_data(module, dai->id); - if (data) + data = find_data(iter, dai->id); + if (data) { + module = iter; break; + } } if (!data) { - dev_err(dai->dev, "%s:%s DATA connection missing\n", - dai->name, module->name); + dev_err(dai->dev, "%s DATA connection missing\n", + dai->name); mutex_unlock(&codec->lock); return -ENODEV; } @@ -1027,12 +1031,6 @@ static int gbcodec_probe(struct snd_soc_component *comp) return 0; } -static void gbcodec_remove(struct snd_soc_component *comp) -{ - /* Empty function for now */ - return; -} - static int gbcodec_write(struct snd_soc_component *comp, unsigned int reg, unsigned int value) { @@ -1047,8 +1045,6 @@ static unsigned int gbcodec_read(struct snd_soc_component *comp, static const struct snd_soc_component_driver soc_codec_dev_gbaudio = { .probe = gbcodec_probe, - .remove = gbcodec_remove, - .read = gbcodec_read, .write = gbcodec_write, }; diff --git a/drivers/staging/greybus/pwm.c b/drivers/staging/greybus/pwm.c index ad20ec24031e..3fda172239d2 100644 --- a/drivers/staging/greybus/pwm.c +++ b/drivers/staging/greybus/pwm.c @@ -297,7 +297,6 @@ static int gb_pwm_probe(struct gbphy_device *gbphy_dev, pwm->dev = &gbphy_dev->dev; pwm->ops = &gb_pwm_ops; - pwm->base = -1; /* Allocate base dynamically */ pwm->npwm = pwmc->pwm_max + 1; ret = pwmchip_add(pwm); diff --git a/drivers/staging/greybus/tools/loopback_test.c b/drivers/staging/greybus/tools/loopback_test.c index 867bf289df2e..4c42e393cd3d 100644 --- a/drivers/staging/greybus/tools/loopback_test.c +++ b/drivers/staging/greybus/tools/loopback_test.c @@ -533,7 +533,7 @@ static int log_results(struct loopback_test *t) fd = open(file_name, O_WRONLY | O_CREAT | O_APPEND, 0644); if (fd < 0) { - fprintf(stderr, "unable to open %s for appendation\n", file_name); + fprintf(stderr, "unable to open %s for appending\n", file_name); abort(); } diff --git a/drivers/staging/iio/resolver/ad2s1210.c b/drivers/staging/iio/resolver/ad2s1210.c index 74adb82f37c3..c0b2716d0511 100644 --- a/drivers/staging/iio/resolver/ad2s1210.c +++ b/drivers/staging/iio/resolver/ad2s1210.c @@ -499,7 +499,6 @@ static int ad2s1210_read_raw(struct iio_dev *indio_dev, ret = IIO_VAL_INT; break; case IIO_ANGL_VEL: - negative = st->rx[0] & 0x80; vel = be16_to_cpup((__be16 *)st->rx); vel >>= 16 - st->resolution; if (vel & 0x8000) { diff --git a/drivers/staging/ks7010/ks_hostif.c b/drivers/staging/ks7010/ks_hostif.c index 1c63d595313d..9429ee155910 100644 --- a/drivers/staging/ks7010/ks_hostif.c +++ b/drivers/staging/ks7010/ks_hostif.c @@ -84,10 +84,6 @@ static void ks_wlan_hw_wakeup_task(struct work_struct *work) return; } } - - /* power save */ - if (atomic_read(&priv->sme_task.count) > 0) - tasklet_enable(&priv->sme_task); } static void ks_wlan_do_power_save(struct ks_wlan_private *priv) @@ -2200,10 +2196,11 @@ static void hostif_sme_execute(struct ks_wlan_private *priv, int event) } } -static -void hostif_sme_task(struct tasklet_struct *t) +static void hostif_sme_work(struct work_struct *work) { - struct ks_wlan_private *priv = from_tasklet(priv, t, sme_task); + struct ks_wlan_private *priv; + + priv = container_of(work, struct ks_wlan_private, sme_work); if (priv->dev_state < DEVICE_STATE_BOOT) return; @@ -2214,7 +2211,7 @@ void hostif_sme_task(struct tasklet_struct *t) hostif_sme_execute(priv, priv->sme_i.event_buff[priv->sme_i.qhead]); inc_smeqhead(priv); if (cnt_smeqbody(priv) > 0) - tasklet_schedule(&priv->sme_task); + schedule_work(&priv->sme_work); } /* send to Station Management Entity module */ @@ -2229,7 +2226,7 @@ void hostif_sme_enqueue(struct ks_wlan_private *priv, u16 event) netdev_err(priv->net_dev, "sme queue buffer overflow\n"); } - tasklet_schedule(&priv->sme_task); + schedule_work(&priv->sme_work); } static inline void hostif_aplist_init(struct ks_wlan_private *priv) @@ -2254,7 +2251,7 @@ static inline void hostif_sme_init(struct ks_wlan_private *priv) priv->sme_i.qtail = 0; spin_lock_init(&priv->sme_i.sme_spin); priv->sme_i.sme_flag = 0; - tasklet_setup(&priv->sme_task, hostif_sme_task); + INIT_WORK(&priv->sme_work, hostif_sme_work); } static inline void hostif_wpa_init(struct ks_wlan_private *priv) @@ -2312,5 +2309,5 @@ int hostif_init(struct ks_wlan_private *priv) void hostif_exit(struct ks_wlan_private *priv) { - tasklet_kill(&priv->sme_task); + cancel_work_sync(&priv->sme_work); } diff --git a/drivers/staging/ks7010/ks_wlan.h b/drivers/staging/ks7010/ks_wlan.h index 7aaf8d780939..3e9a91b5131c 100644 --- a/drivers/staging/ks7010/ks_wlan.h +++ b/drivers/staging/ks7010/ks_wlan.h @@ -449,7 +449,7 @@ struct ks_wlan_private { struct sme_info sme_i; u8 *rxp; unsigned int rx_size; - struct tasklet_struct sme_task; + struct work_struct sme_work; struct work_struct wakeup_work; int scan_ind_count; diff --git a/drivers/staging/most/dim2/dim2.c b/drivers/staging/most/dim2/dim2.c index 29f8ce2a47f5..97dff82b7a5f 100644 --- a/drivers/staging/most/dim2/dim2.c +++ b/drivers/staging/most/dim2/dim2.c @@ -45,9 +45,6 @@ MODULE_PARM_DESC(fcnt, "Num of frames per sub-buffer for sync channels as a powe static DEFINE_SPINLOCK(dim_lock); -static void dim2_tasklet_fn(unsigned long data); -static DECLARE_TASKLET_OLD(dim2_tasklet, dim2_tasklet_fn); - /** * struct hdm_channel - private structure to keep channel specific data * @name: channel name @@ -361,15 +358,9 @@ static irqreturn_t dim2_mlb_isr(int irq, void *_dev) return IRQ_HANDLED; } -/** - * dim2_tasklet_fn - tasklet function - * @data: private data - * - * Service each initialized channel, if needed - */ -static void dim2_tasklet_fn(unsigned long data) +static irqreturn_t dim2_task_irq(int irq, void *_dev) { - struct dim2_hdm *dev = (struct dim2_hdm *)data; + struct dim2_hdm *dev = _dev; unsigned long flags; int ch_idx; @@ -385,6 +376,8 @@ static void dim2_tasklet_fn(unsigned long data) while (!try_start_dim_transfer(dev->hch + ch_idx)) continue; } + + return IRQ_HANDLED; } /** @@ -392,8 +385,8 @@ static void dim2_tasklet_fn(unsigned long data) * @irq: irq number * @_dev: private data * - * Acknowledge the interrupt and schedule a tasklet to service channels. - * Return IRQ_HANDLED. + * Acknowledge the interrupt and service each initialized channel, + * if needed, in task context. */ static irqreturn_t dim2_ahb_isr(int irq, void *_dev) { @@ -405,9 +398,7 @@ static irqreturn_t dim2_ahb_isr(int irq, void *_dev) dim_service_ahb_int_irq(get_active_channels(dev, buffer)); spin_unlock_irqrestore(&dim_lock, flags); - dim2_tasklet.data = (unsigned long)dev; - tasklet_schedule(&dim2_tasklet); - return IRQ_HANDLED; + return IRQ_WAKE_THREAD; } /** @@ -654,14 +645,12 @@ static int poison_channel(struct most_interface *most_iface, int ch_idx) if (!hdm_ch->is_initialized) return -EPERM; - tasklet_disable(&dim2_tasklet); spin_lock_irqsave(&dim_lock, flags); hal_ret = dim_destroy_channel(&hdm_ch->ch); hdm_ch->is_initialized = false; if (ch_idx == dev->atx_idx) dev->atx_idx = -1; spin_unlock_irqrestore(&dim_lock, flags); - tasklet_enable(&dim2_tasklet); if (hal_ret != DIM_NO_ERROR) { pr_err("HAL Failed to close channel %s\n", hdm_ch->name); ret = -EFAULT; @@ -821,8 +810,8 @@ static int dim2_probe(struct platform_device *pdev) goto err_shutdown_dim; } - ret = devm_request_irq(&pdev->dev, irq, dim2_ahb_isr, 0, - "dim2_ahb0_int", dev); + ret = devm_request_threaded_irq(&pdev->dev, irq, dim2_ahb_isr, + dim2_task_irq, 0, "dim2_ahb0_int", dev); if (ret) { dev_err(&pdev->dev, "failed to request ahb0_int irq %d\n", irq); goto err_shutdown_dim; diff --git a/drivers/staging/qlge/qlge.h b/drivers/staging/qlge/qlge.h index 55e0ad759250..d0dd659834ee 100644 --- a/drivers/staging/qlge/qlge.h +++ b/drivers/staging/qlge/qlge.h @@ -2072,6 +2072,7 @@ struct qlge_adapter *netdev_to_qdev(struct net_device *ndev) return ndev_priv->qdev; } + /* * The main Adapter structure definition. * This structure has all fields relevant to the hardware. diff --git a/drivers/staging/r8188eu/core/rtw_ap.c b/drivers/staging/r8188eu/core/rtw_ap.c index 2ff78ed1faab..ac6effbecf6d 100644 --- a/drivers/staging/r8188eu/core/rtw_ap.c +++ b/drivers/staging/r8188eu/core/rtw_ap.c @@ -188,7 +188,6 @@ void expire_timeout_chk(struct adapter *padapter) spin_lock_bh(&pstapriv->auth_list_lock); } } - } spin_unlock_bh(&pstapriv->auth_list_lock); @@ -381,7 +380,6 @@ void add_RATid(struct adapter *padapter, struct sta_info *psta, u8 rssi_level) /* set ra_id, init_rate */ psta->raid = raid; psta->init_rate = init_rate; - } } @@ -455,7 +453,6 @@ void update_bmc_sta(struct adapter *padapter) spin_lock_bh(&psta->lock); psta->state = _FW_LINKED; spin_unlock_bh(&psta->lock); - } } diff --git a/drivers/staging/r8188eu/core/rtw_br_ext.c b/drivers/staging/r8188eu/core/rtw_br_ext.c index f056204c0fdb..bca20fe5c983 100644 --- a/drivers/staging/r8188eu/core/rtw_br_ext.c +++ b/drivers/staging/r8188eu/core/rtw_br_ext.c @@ -53,7 +53,8 @@ static unsigned char *__nat25_find_pppoe_tag(struct pppoe_hdr *ph, unsigned shor unsigned char *cur_ptr, *start_ptr; unsigned short tagLen, tagType; - start_ptr = cur_ptr = (unsigned char *)ph->tag; + start_ptr = (unsigned char *)ph->tag; + cur_ptr = (unsigned char *)ph->tag; while ((cur_ptr - start_ptr) < ntohs(ph->length)) { /* prevent un-alignment access */ tagType = (unsigned short)((cur_ptr[0] << 8) + cur_ptr[1]); @@ -87,19 +88,19 @@ static int skb_pull_and_merge(struct sk_buff *skb, unsigned char *src, int len) int tail_len; unsigned long end, tail; - if ((src+len) > skb_tail_pointer(skb) || skb->len < len) + if ((src + len) > skb_tail_pointer(skb) || skb->len < len) return -1; tail = (unsigned long)skb_tail_pointer(skb); - end = (unsigned long)src+len; + end = (unsigned long)src + len; if (tail < end) return -1; - tail_len = (int)(tail-end); + tail_len = (int)(tail - end); if (tail_len > 0) - memmove(src, src+len, tail_len); + memmove(src, src + len, tail_len); - skb_trim(skb, skb->len-len); + skb_trim(skb, skb->len - len); return 0; } @@ -117,7 +118,7 @@ static void __nat25_generate_ipv4_network_addr(unsigned char *networkAddr, memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN); networkAddr[0] = NAT25_IPV4; - memcpy(networkAddr+7, (unsigned char *)ipAddr, 4); + memcpy(networkAddr + 7, (unsigned char *)ipAddr, 4); } static void __nat25_generate_pppoe_network_addr(unsigned char *networkAddr, @@ -126,8 +127,8 @@ static void __nat25_generate_pppoe_network_addr(unsigned char *networkAddr, memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN); networkAddr[0] = NAT25_PPPOE; - memcpy(networkAddr+1, (unsigned char *)sid, 2); - memcpy(networkAddr+3, (unsigned char *)ac_mac, 6); + memcpy(networkAddr + 1, (unsigned char *)sid, 2); + memcpy(networkAddr + 3, (unsigned char *)ac_mac, 6); } static void __nat25_generate_ipv6_network_addr(unsigned char *networkAddr, @@ -136,17 +137,17 @@ static void __nat25_generate_ipv6_network_addr(unsigned char *networkAddr, memset(networkAddr, 0, MAX_NETWORK_ADDR_LEN); networkAddr[0] = NAT25_IPV6; - memcpy(networkAddr+1, (unsigned char *)ipAddr, 16); + memcpy(networkAddr + 1, (unsigned char *)ipAddr, 16); } static unsigned char *scan_tlv(unsigned char *data, int len, unsigned char tag, unsigned char len8b) { while (len > 0) { - if (*data == tag && *(data+1) == len8b && len >= len8b*8) - return data+2; + if (*data == tag && *(data + 1) == len8b && len >= len8b * 8) + return data + 2; - len -= (*(data+1))*8; - data += (*(data+1))*8; + len -= (*(data + 1)) * 8; + data += (*(data + 1)) * 8; } return NULL; } @@ -158,7 +159,7 @@ static int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char if (icmphdr->icmp6_type == NDISC_ROUTER_SOLICITATION) { if (len >= 8) { - mac = scan_tlv(&data[8], len-8, 1, 1); + mac = scan_tlv(&data[8], len - 8, 1, 1); if (mac) { memcpy(mac, replace_mac, 6); return 1; @@ -166,7 +167,7 @@ static int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char } } else if (icmphdr->icmp6_type == NDISC_ROUTER_ADVERTISEMENT) { if (len >= 16) { - mac = scan_tlv(&data[16], len-16, 1, 1); + mac = scan_tlv(&data[16], len - 16, 1, 1); if (mac) { memcpy(mac, replace_mac, 6); return 1; @@ -174,7 +175,7 @@ static int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char } } else if (icmphdr->icmp6_type == NDISC_NEIGHBOUR_SOLICITATION) { if (len >= 24) { - mac = scan_tlv(&data[24], len-24, 1, 1); + mac = scan_tlv(&data[24], len - 24, 1, 1); if (mac) { memcpy(mac, replace_mac, 6); return 1; @@ -182,7 +183,7 @@ static int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char } } else if (icmphdr->icmp6_type == NDISC_NEIGHBOUR_ADVERTISEMENT) { if (len >= 24) { - mac = scan_tlv(&data[24], len-24, 2, 1); + mac = scan_tlv(&data[24], len - 24, 2, 1); if (mac) { memcpy(mac, replace_mac, 6); return 1; @@ -190,7 +191,7 @@ static int update_nd_link_layer_addr(unsigned char *data, int len, unsigned char } } else if (icmphdr->icmp6_type == NDISC_REDIRECT) { if (len >= 40) { - mac = scan_tlv(&data[40], len-40, 2, 1); + mac = scan_tlv(&data[40], len - 40, 2, 1); if (mac) { memcpy(mac, replace_mac, 6); return 1; @@ -313,6 +314,7 @@ void nat25_db_cleanup(struct adapter *priv) for (i = 0; i < NAT25_HASH_SIZE; i++) { struct nat25_network_db_entry *f; + f = priv->nethash[i]; while (f) { struct nat25_network_db_entry *g; @@ -339,12 +341,12 @@ void nat25_db_expire(struct adapter *priv) for (i = 0; i < NAT25_HASH_SIZE; i++) { struct nat25_network_db_entry *f; - f = priv->nethash[i]; + f = priv->nethash[i]; while (f) { struct nat25_network_db_entry *g; - g = f->next_hash; + g = f->next_hash; if (__nat25_has_expired(f)) { if (atomic_dec_and_test(&f->use_count)) { if (priv->scdb_entry == f) { @@ -396,7 +398,7 @@ int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method) tmp = be32_to_cpu(iph->saddr); __nat25_generate_ipv4_network_addr(networkAddr, &tmp); /* record source IP address and , source mac address into db */ - __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr); + __nat25_db_network_insert(priv, skb->data + ETH_ALEN, networkAddr); return 0; default: return -1; @@ -421,7 +423,7 @@ int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method) arp_ptr += arp->ar_hln; sender = (unsigned int *)arp_ptr; __nat25_generate_ipv4_network_addr(networkAddr, sender); - __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr); + __nat25_db_network_insert(priv, skb->data + ETH_ALEN, networkAddr); return 0; default: return -1; @@ -432,7 +434,7 @@ int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method) /* Handle PPPoE frame */ /*---------------------------------------------------*/ struct pppoe_hdr *ph = (struct pppoe_hdr *)(skb->data + ETH_HLEN); - unsigned short *pMagic; + __be16 *pMagic; switch (method) { case NAT25_CHECK: @@ -458,22 +460,22 @@ int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method) sizeof(tag_buf)) return -1; - memcpy(tag->tag_data+MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN, + memcpy(tag->tag_data + MAGIC_CODE_LEN + RTL_RELAY_TAG_LEN, pOldTag->tag_data, old_tag_len); - if (skb_pull_and_merge(skb, (unsigned char *)pOldTag, TAG_HDR_LEN+old_tag_len) < 0) + if (skb_pull_and_merge(skb, (unsigned char *)pOldTag, TAG_HDR_LEN + old_tag_len) < 0) return -1; - ph->length = htons(ntohs(ph->length)-TAG_HDR_LEN-old_tag_len); + ph->length = htons(ntohs(ph->length) - TAG_HDR_LEN - old_tag_len); } tag->tag_type = PTT_RELAY_SID; - tag->tag_len = htons(MAGIC_CODE_LEN+RTL_RELAY_TAG_LEN+old_tag_len); + tag->tag_len = htons(MAGIC_CODE_LEN + RTL_RELAY_TAG_LEN + old_tag_len); /* insert the magic_code+client mac in relay tag */ - pMagic = (unsigned short *)tag->tag_data; + pMagic = (__be16 *)tag->tag_data; *pMagic = htons(MAGIC_CODE); - memcpy(tag->tag_data+MAGIC_CODE_LEN, skb->data+ETH_ALEN, ETH_ALEN); + memcpy(tag->tag_data + MAGIC_CODE_LEN, skb->data + ETH_ALEN, ETH_ALEN); /* Add relay tag */ if (__nat25_add_pppoe_tag(skb, tag) < 0) @@ -486,7 +488,7 @@ int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method) return -2; if (priv->pppoe_connection_in_progress == 0) - memcpy(priv->pppoe_addr, skb->data+ETH_ALEN, ETH_ALEN); + memcpy(priv->pppoe_addr, skb->data + ETH_ALEN, ETH_ALEN); priv->pppoe_connection_in_progress = WAIT_TIME_PPPOE; } @@ -496,11 +498,11 @@ int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method) } else { /* session phase */ __nat25_generate_pppoe_network_addr(networkAddr, skb->data, &ph->sid); - __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr); + __nat25_db_network_insert(priv, skb->data + ETH_ALEN, networkAddr); if (!priv->ethBrExtInfo.addPPPoETag && priv->pppoe_connection_in_progress && - !memcmp(skb->data+ETH_ALEN, priv->pppoe_addr, ETH_ALEN)) + !memcmp(skb->data + ETH_ALEN, priv->pppoe_addr, ETH_ALEN)) priv->pppoe_connection_in_progress = 0; } return 0; @@ -548,7 +550,7 @@ int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method) case NAT25_INSERT: if (memcmp(&iph->saddr, "\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0", 16)) { __nat25_generate_ipv6_network_addr(networkAddr, (unsigned int *)&iph->saddr); - __nat25_db_network_insert(priv, skb->data+ETH_ALEN, networkAddr); + __nat25_db_network_insert(priv, skb->data + ETH_ALEN, networkAddr); if (iph->nexthdr == IPPROTO_ICMPV6 && skb->len > (ETH_HLEN + sizeof(*iph) + 4)) { @@ -557,9 +559,11 @@ int nat25_db_handle(struct adapter *priv, struct sk_buff *skb, int method) struct icmp6hdr *hdr = (struct icmp6hdr *)(skb->data + ETH_HLEN + sizeof(*iph)); hdr->icmp6_cksum = 0; hdr->icmp6_cksum = csum_ipv6_magic(&iph->saddr, &iph->daddr, - iph->payload_len, + be16_to_cpu(iph->payload_len), IPPROTO_ICMPV6, - csum_partial((__u8 *)hdr, iph->payload_len, 0)); + csum_partial((__u8 *)hdr, + be16_to_cpu(iph->payload_len), + 0)); } } } diff --git a/drivers/staging/r8188eu/core/rtw_cmd.c b/drivers/staging/r8188eu/core/rtw_cmd.c index 6eca30124ee8..06523d91939a 100644 --- a/drivers/staging/r8188eu/core/rtw_cmd.c +++ b/drivers/staging/r8188eu/core/rtw_cmd.c @@ -11,14 +11,54 @@ #include "../include/rtw_mlme_ext.h" #include "../include/rtl8188e_dm.h" -/* -Caller and the rtw_cmd_thread can protect cmd_q by spin_lock. -No irqsave is necessary. -*/ +/* Caller and the rtw_cmd_thread can protect cmd_q by spin_lock. + * No irqsave is necessary. + */ -static int _rtw_init_cmd_priv(struct cmd_priv *pcmdpriv) +static void c2h_wk_callback(struct work_struct *work); + +void rtw_free_evt_priv(struct evt_priv *pevtpriv) { - int res = _SUCCESS; + cancel_work_sync(&pevtpriv->c2h_wk); + while (pevtpriv->c2h_wk_alive) + msleep(10); + + while (!rtw_cbuf_empty(pevtpriv->c2h_queue)) { + void *c2h = rtw_cbuf_pop(pevtpriv->c2h_queue); + if (c2h && c2h != (void *)pevtpriv) + kfree(c2h); + } +} + +/* Calling Context: + * + * rtw_enqueue_cmd can only be called between kernel thread, + * since only spin_lock is used. + * + * ISR/Call-Back functions can't call this sub-function. + */ + +static int _rtw_enqueue_cmd(struct __queue *queue, struct cmd_obj *obj) +{ + unsigned long flags; + + if (!obj) + goto exit; + + spin_lock_irqsave(&queue->lock, flags); + + list_add_tail(&obj->list, &queue->queue); + + spin_unlock_irqrestore(&queue->lock, flags); + +exit: + + return _SUCCESS; +} + +u32 rtw_init_cmd_priv(struct cmd_priv *pcmdpriv) +{ + u32 res = _SUCCESS; init_completion(&pcmdpriv->enqueue_cmd); /* sema_init(&(pcmdpriv->cmd_done_sema), 0); */ @@ -57,11 +97,9 @@ exit: return res; } -static void c2h_wk_callback(struct work_struct *work); - -static int _rtw_init_evt_priv(struct evt_priv *pevtpriv) +u32 rtw_init_evt_priv(struct evt_priv *pevtpriv) { - int res = _SUCCESS; + u32 res = _SUCCESS; /* allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf */ atomic_set(&pevtpriv->event_seq, 0); @@ -69,24 +107,13 @@ static int _rtw_init_evt_priv(struct evt_priv *pevtpriv) INIT_WORK(&pevtpriv->c2h_wk, c2h_wk_callback); pevtpriv->c2h_wk_alive = false; pevtpriv->c2h_queue = rtw_cbuf_alloc(C2H_QUEUE_MAX_LEN + 1); + if (!pevtpriv->c2h_queue) + res = _FAIL; return res; } -void rtw_free_evt_priv(struct evt_priv *pevtpriv) -{ - cancel_work_sync(&pevtpriv->c2h_wk); - while (pevtpriv->c2h_wk_alive) - msleep(10); - - while (!rtw_cbuf_empty(pevtpriv->c2h_queue)) { - void *c2h = rtw_cbuf_pop(pevtpriv->c2h_queue); - if (c2h && c2h != (void *)pevtpriv) - kfree(c2h); - } -} - -static void _rtw_free_cmd_priv(struct cmd_priv *pcmdpriv) +void rtw_free_cmd_priv(struct cmd_priv *pcmdpriv) { if (pcmdpriv) { kfree(pcmdpriv->cmd_allocated_buf); @@ -94,75 +121,6 @@ static void _rtw_free_cmd_priv(struct cmd_priv *pcmdpriv) } } -/* -Calling Context: - -rtw_enqueue_cmd can only be called between kernel thread, -since only spin_lock is used. - -ISR/Call-Back functions can't call this sub-function. - -*/ - -static int _rtw_enqueue_cmd(struct __queue *queue, struct cmd_obj *obj) -{ - unsigned long flags; - - if (!obj) - goto exit; - - spin_lock_irqsave(&queue->lock, flags); - - list_add_tail(&obj->list, &queue->queue); - - spin_unlock_irqrestore(&queue->lock, flags); - -exit: - - return _SUCCESS; -} - -static struct cmd_obj *_rtw_dequeue_cmd(struct __queue *queue) -{ - struct cmd_obj *obj; - unsigned long flags; - - spin_lock_irqsave(&queue->lock, flags); - if (list_empty(&queue->queue)) { - obj = NULL; - } else { - obj = container_of((&queue->queue)->next, struct cmd_obj, list); - list_del_init(&obj->list); - } - - spin_unlock_irqrestore(&queue->lock, flags); - - return obj; -} - -u32 rtw_init_cmd_priv(struct cmd_priv *pcmdpriv) -{ - u32 res; - - res = _rtw_init_cmd_priv(pcmdpriv); - - return res; -} - -u32 rtw_init_evt_priv(struct evt_priv *pevtpriv) -{ - int res; - - res = _rtw_init_evt_priv(pevtpriv); - - return res; -} - -void rtw_free_cmd_priv(struct cmd_priv *pcmdpriv) -{ - _rtw_free_cmd_priv(pcmdpriv); -} - static int rtw_cmd_filter(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj) { u8 bAllow = false; /* set to true to allow enqueuing cmd when hw_init_completed is false */ @@ -187,7 +145,7 @@ u32 rtw_enqueue_cmd(struct cmd_priv *pcmdpriv, struct cmd_obj *cmd_obj) cmd_obj->padapter = padapter; res = rtw_cmd_filter(pcmdpriv, cmd_obj); - if (_FAIL == res) { + if (res == _FAIL) { rtw_free_cmd_obj(cmd_obj); goto exit; } @@ -204,11 +162,21 @@ exit: struct cmd_obj *rtw_dequeue_cmd(struct cmd_priv *pcmdpriv) { - struct cmd_obj *cmd_obj; + struct cmd_obj *obj; + struct __queue *queue = &pcmdpriv->cmd_queue; + unsigned long flags; + + spin_lock_irqsave(&queue->lock, flags); + if (list_empty(&queue->queue)) { + obj = NULL; + } else { + obj = container_of((&queue->queue)->next, struct cmd_obj, list); + list_del_init(&obj->list); + } - cmd_obj = _rtw_dequeue_cmd(&pcmdpriv->cmd_queue); + spin_unlock_irqrestore(&queue->lock, flags); - return cmd_obj; + return obj; } void rtw_free_cmd_obj(struct cmd_obj *pcmd) @@ -258,12 +226,12 @@ _next: if (!pcmd) continue; - if (_FAIL == rtw_cmd_filter(pcmdpriv, pcmd)) { + if (rtw_cmd_filter(pcmdpriv, pcmd) == _FAIL) { pcmd->res = H2C_DROPPED; goto post_process; } - pcmd->cmdsz = _RND4((pcmd->cmdsz));/* _RND4 */ + pcmd->cmdsz = round_up(pcmd->cmdsz, 4); memcpy(pcmdbuf, pcmd->parmbuf, pcmd->cmdsz); @@ -291,7 +259,7 @@ post_process: rtw_free_cmd_obj(pcmd); else /* todo: !!! fill rsp_buf to pcmd->rsp if (pcmd->rsp!= NULL) */ - pcmd_callback(pcmd->padapter, pcmd);/* need conider that free cmd_obj in rtw_cmd_callback */ + pcmd_callback(pcmd->padapter, pcmd);/* need consider that free cmd_obj in rtw_cmd_callback */ } else { rtw_free_cmd_obj(pcmd); } @@ -316,11 +284,10 @@ post_process: return 0; } -/* -rtw_sitesurvey_cmd(~) - ### NOTE:#### (!!!!) - MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock -*/ +/* rtw_sitesurvey_cmd(~) + * ### NOTE:#### (!!!!) + * MUST TAKE CARE THAT BEFORE CALLING THIS FUNC, YOU SHOULD HAVE LOCKED pmlmepriv->lock + */ u8 rtw_sitesurvey_cmd(struct adapter *padapter, struct ndis_802_11_ssid *ssid, int ssid_num, struct rtw_ieee80211_channel *ch, int ch_num) { @@ -330,19 +297,17 @@ u8 rtw_sitesurvey_cmd(struct adapter *padapter, struct ndis_802_11_ssid *ssid, struct cmd_priv *pcmdpriv = &padapter->cmdpriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - if (check_fwstate(pmlmepriv, _FW_LINKED)) { + if (check_fwstate(pmlmepriv, _FW_LINKED)) rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SCAN, 1); - } - if (check_fwstate(pmlmepriv, _FW_LINKED)) { + if (check_fwstate(pmlmepriv, _FW_LINKED)) p2p_ps_wk_cmd(padapter, P2P_PS_SCAN, 1); - } - ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); + ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC); if (!ph2c) return _FAIL; - psurveyPara = kzalloc(sizeof(struct sitesurvey_parm), GFP_ATOMIC); + psurveyPara = kzalloc(sizeof(*psurveyPara), GFP_ATOMIC); if (!psurveyPara) { kfree(ph2c); return _FAIL; @@ -403,13 +368,13 @@ u8 rtw_setdatarate_cmd(struct adapter *padapter, u8 *rateset) struct cmd_priv *pcmdpriv = &padapter->cmdpriv; u8 res = _SUCCESS; - ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); + ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC); if (!ph2c) { res = _FAIL; goto exit; } - pbsetdataratepara = kzalloc(sizeof(struct setdatarate_parm), GFP_ATOMIC); + pbsetdataratepara = kzalloc(sizeof(*pbsetdataratepara), GFP_ATOMIC); if (!pbsetdataratepara) { kfree(ph2c); res = _FAIL; @@ -442,7 +407,7 @@ u8 rtw_createbss_cmd(struct adapter *padapter) rtw_led_control(padapter, LED_CTL_START_TO_LINK); - pcmd = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); + pcmd = kzalloc(sizeof(*pcmd), GFP_ATOMIC); if (!pcmd) { res = _FAIL; goto exit; @@ -479,7 +444,7 @@ u8 rtw_joinbss_cmd(struct adapter *padapter, struct wlan_network *pnetwork) rtw_led_control(padapter, LED_CTL_START_TO_LINK); - pcmd = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); + pcmd = kzalloc(sizeof(*pcmd), GFP_ATOMIC); if (!pcmd) { res = _FAIL; goto exit; @@ -516,15 +481,14 @@ u8 rtw_joinbss_cmd(struct adapter *padapter, struct wlan_network *pnetwork) psecuritypriv->authenticator_ie[0] = (unsigned char)psecnetwork->IELength; - if (psecnetwork->IELength - 12 < 255) { + if (psecnetwork->IELength - 12 < 255) memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], psecnetwork->IELength - 12); - } else { + else memcpy(&psecuritypriv->authenticator_ie[1], &psecnetwork->IEs[12], 255); - } psecnetwork->IELength = 0; /* Added by Albert 2009/02/18 */ - /* If the the driver wants to use the bssid to create the connection. */ + /* If the driver wants to use the bssid to create the connection. */ /* If not, we have to copy the connecting AP's MAC address to it so that */ /* the driver just has the bssid information for PMKIDList searching. */ @@ -550,9 +514,9 @@ u8 rtw_joinbss_cmd(struct adapter *padapter, struct wlan_network *pnetwork) phtpriv->ht_option = false; if (pregistrypriv->ht_enable) { - /* Added by Albert 2010/06/23 */ - /* For the WEP mode, we will use the bg mode to do the connection to avoid some IOT issue. */ - /* Especially for Realtek 8192u SoftAP. */ + /* Added by Albert 2010/06/23 */ + /* For the WEP mode, we will use the bg mode to do the connection to avoid some IOT issue. */ + /* Especially for Realtek 8192u SoftAP. */ if ((padapter->securitypriv.dot11PrivacyAlgrthm != _WEP40_) && (padapter->securitypriv.dot11PrivacyAlgrthm != _WEP104_) && (padapter->securitypriv.dot11PrivacyAlgrthm != _TKIP_)) { @@ -611,7 +575,7 @@ u8 rtw_disassoc_cmd(struct adapter *padapter, u32 deauth_timeout_ms, bool enqueu res = rtw_enqueue_cmd(cmdpriv, cmdobj); } else { /* no need to enqueue, do the cmd hdl directly and free cmd parameter */ - if (H2C_SUCCESS != disconnect_hdl(padapter, (u8 *)param)) + if (disconnect_hdl(padapter, (u8 *)param) != H2C_SUCCESS) res = _FAIL; kfree(param); } @@ -629,12 +593,12 @@ u8 rtw_setopmode_cmd(struct adapter *padapter, enum ndis_802_11_network_infra n struct cmd_priv *pcmdpriv = &padapter->cmdpriv; u8 res = _SUCCESS; - ph2c = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); + ph2c = kzalloc(sizeof(*ph2c), GFP_KERNEL); if (!ph2c) { res = false; goto exit; } - psetop = kzalloc(sizeof(struct setopmode_parm), GFP_KERNEL); + psetop = kzalloc(sizeof(*psetop), GFP_KERNEL); if (!psetop) { kfree(ph2c); @@ -664,20 +628,20 @@ u8 rtw_setstakey_cmd(struct adapter *padapter, u8 *psta, u8 unicast_key) struct sta_info *sta = (struct sta_info *)psta; u8 res = _SUCCESS; - ph2c = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); + ph2c = kzalloc(sizeof(*ph2c), GFP_KERNEL); if (!ph2c) { res = _FAIL; goto exit; } - psetstakey_para = kzalloc(sizeof(struct set_stakey_parm), GFP_KERNEL); + psetstakey_para = kzalloc(sizeof(*psetstakey_para), GFP_KERNEL); if (!psetstakey_para) { kfree(ph2c); res = _FAIL; goto exit; } - psetstakey_rsp = kzalloc(sizeof(struct set_stakey_rsp), GFP_KERNEL); + psetstakey_rsp = kzalloc(sizeof(*psetstakey_rsp), GFP_KERNEL); if (!psetstakey_rsp) { kfree(ph2c); kfree(psetstakey_para); @@ -723,13 +687,13 @@ u8 rtw_clearstakey_cmd(struct adapter *padapter, u8 *psta, u8 entry, u8 enqueue) if (!enqueue) { clear_cam_entry(padapter, entry); } else { - ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); + ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC); if (!ph2c) { res = _FAIL; goto exit; } - psetstakey_para = kzalloc(sizeof(struct set_stakey_parm), + psetstakey_para = kzalloc(sizeof(*psetstakey_para), GFP_ATOMIC); if (!psetstakey_para) { kfree(ph2c); @@ -737,7 +701,7 @@ u8 rtw_clearstakey_cmd(struct adapter *padapter, u8 *psta, u8 entry, u8 enqueue) goto exit; } - psetstakey_rsp = kzalloc(sizeof(struct set_stakey_rsp), + psetstakey_rsp = kzalloc(sizeof(*psetstakey_rsp), GFP_ATOMIC); if (!psetstakey_rsp) { kfree(ph2c); @@ -770,13 +734,13 @@ u8 rtw_addbareq_cmd(struct adapter *padapter, u8 tid, u8 *addr) struct addBaReq_parm *paddbareq_parm; u8 res = _SUCCESS; - ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); + ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC); if (!ph2c) { res = _FAIL; goto exit; } - paddbareq_parm = kzalloc(sizeof(struct addBaReq_parm), GFP_ATOMIC); + paddbareq_parm = kzalloc(sizeof(*paddbareq_parm), GFP_ATOMIC); if (!paddbareq_parm) { kfree(ph2c); res = _FAIL; @@ -803,13 +767,13 @@ u8 rtw_dynamic_chk_wk_cmd(struct adapter *padapter) struct cmd_priv *pcmdpriv = &padapter->cmdpriv; u8 res = _SUCCESS; - ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); + ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC); if (!ph2c) { res = _FAIL; goto exit; } - pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), GFP_ATOMIC); + pdrvextra_cmd_parm = kzalloc(sizeof(*pdrvextra_cmd_parm), GFP_ATOMIC); if (!pdrvextra_cmd_parm) { kfree(ph2c); res = _FAIL; @@ -844,7 +808,7 @@ u8 rtw_set_chplan_cmd(struct adapter *padapter, u8 chplan) } /* prepare cmd parameter */ - setChannelPlan_param = kzalloc(sizeof(struct SetChannelPlan_param), + setChannelPlan_param = kzalloc(sizeof(*setChannelPlan_param), GFP_KERNEL); if (!setChannelPlan_param) { res = _FAIL; @@ -853,7 +817,7 @@ u8 rtw_set_chplan_cmd(struct adapter *padapter, u8 chplan) setChannelPlan_param->channel_plan = chplan; /* need enqueue, prepare cmd_obj and enqueue */ - pcmdobj = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); + pcmdobj = kzalloc(sizeof(*pcmdobj), GFP_KERNEL); if (!pcmdobj) { kfree(setChannelPlan_param); res = _FAIL; @@ -983,12 +947,12 @@ static void lps_ctrl_wk_hdl(struct adapter *padapter, u8 lps_ctrl_type) mstatus = 1;/* connect */ /* Reset LPS Setting */ padapter->pwrctrlpriv.LpsIdleCount = 0; - SetHwReg8188EU(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus)); + rtl8188e_set_FwJoinBssReport_cmd(padapter, mstatus); break; case LPS_CTRL_DISCONNECT: mstatus = 0;/* disconnect */ LPS_Leave(padapter); - SetHwReg8188EU(padapter, HW_VAR_H2C_FW_JOINBSSRPT, (u8 *)(&mstatus)); + rtl8188e_set_FwJoinBssReport_cmd(padapter, mstatus); break; case LPS_CTRL_SPECIAL_PACKET: pwrpriv->DelayLPSLastTimeStamp = jiffies; @@ -1012,16 +976,16 @@ u8 rtw_lps_ctrl_wk_cmd(struct adapter *padapter, u8 lps_ctrl_type, u8 enqueue) u8 res = _SUCCESS; /* if (!pwrctrlpriv->bLeisurePs) */ - /* return res; */ + /* return res; */ if (enqueue) { - ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); + ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC); if (!ph2c) { res = _FAIL; goto exit; } - pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), + pdrvextra_cmd_parm = kzalloc(sizeof(*pdrvextra_cmd_parm), GFP_ATOMIC); if (!pdrvextra_cmd_parm) { kfree(ph2c); @@ -1047,7 +1011,10 @@ exit: static void rpt_timer_setting_wk_hdl(struct adapter *padapter, u16 min_time) { - SetHwReg8188EU(padapter, HW_VAR_RPT_TIMER_SETTING, (u8 *)(&min_time)); + struct hal_data_8188e *haldata = &padapter->haldata; + struct odm_dm_struct *odmpriv = &haldata->odmpriv; + + ODM_RA_Set_TxRPT_Time(odmpriv, min_time); } u8 rtw_rpt_timer_cfg_cmd(struct adapter *padapter, u16 min_time) @@ -1058,13 +1025,13 @@ u8 rtw_rpt_timer_cfg_cmd(struct adapter *padapter, u16 min_time) u8 res = _SUCCESS; - ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); + ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC); if (!ph2c) { res = _FAIL; goto exit; } - pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), + pdrvextra_cmd_parm = kzalloc(sizeof(*pdrvextra_cmd_parm), GFP_ATOMIC); if (!pdrvextra_cmd_parm) { kfree(ph2c); @@ -1084,7 +1051,20 @@ exit: static void antenna_select_wk_hdl(struct adapter *padapter, u8 antenna) { - SetHwReg8188EU(padapter, HW_VAR_ANTENNA_DIVERSITY_SELECT, (u8 *)(&antenna)); + struct hal_data_8188e *haldata = &padapter->haldata; + + /* switch current antenna to optimum antenna */ + if (haldata->CurAntenna != antenna) { + ODM_UpdateRxIdleAnt_88E(&haldata->odmpriv, antenna == 2 ? MAIN_ANT : AUX_ANT); + haldata->CurAntenna = antenna; + } +} + +static bool rtw_antenna_diversity(struct adapter *adapter) +{ + struct hal_data_8188e *haldata = &adapter->haldata; + + return haldata->AntDivCfg != 0; } u8 rtw_antenna_select_cmd(struct adapter *padapter, u8 antenna, u8 enqueue) @@ -1092,21 +1072,19 @@ u8 rtw_antenna_select_cmd(struct adapter *padapter, u8 antenna, u8 enqueue) struct cmd_obj *ph2c; struct drvextra_cmd_parm *pdrvextra_cmd_parm; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - u8 support_ant_div; u8 res = _SUCCESS; - GetHalDefVar8188EUsb(padapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &support_ant_div); - if (!support_ant_div) + if (!rtw_antenna_diversity(padapter)) return res; if (enqueue) { - ph2c = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); + ph2c = kzalloc(sizeof(*ph2c), GFP_KERNEL); if (!ph2c) { res = _FAIL; goto exit; } - pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), + pdrvextra_cmd_parm = kzalloc(sizeof(*pdrvextra_cmd_parm), GFP_KERNEL); if (!pdrvextra_cmd_parm) { kfree(ph2c); @@ -1139,13 +1117,13 @@ u8 p2p_protocol_wk_cmd(struct adapter *padapter, int intCmdType) if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) return res; - ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); + ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC); if (!ph2c) { res = _FAIL; goto exit; } - pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), GFP_ATOMIC); + pdrvextra_cmd_parm = kzalloc(sizeof(*pdrvextra_cmd_parm), GFP_ATOMIC); if (!pdrvextra_cmd_parm) { kfree(ph2c); res = _FAIL; @@ -1153,8 +1131,8 @@ u8 p2p_protocol_wk_cmd(struct adapter *padapter, int intCmdType) } pdrvextra_cmd_parm->ec_id = P2P_PROTO_WK_CID; - pdrvextra_cmd_parm->type_size = intCmdType; /* As the command tppe. */ - pdrvextra_cmd_parm->pbuf = NULL; /* Must be NULL here */ + pdrvextra_cmd_parm->type_size = intCmdType; /* As the command type. */ + pdrvextra_cmd_parm->pbuf = NULL; /* Must be NULL here */ init_h2fwcmd_w_parm_no_rsp(ph2c, pdrvextra_cmd_parm, GEN_CMD_CODE(_Set_Drv_Extra)); @@ -1173,13 +1151,13 @@ u8 rtw_ps_cmd(struct adapter *padapter) u8 res = _SUCCESS; - ppscmd = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); + ppscmd = kzalloc(sizeof(*ppscmd), GFP_ATOMIC); if (!ppscmd) { res = _FAIL; goto exit; } - pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), GFP_ATOMIC); + pdrvextra_cmd_parm = kzalloc(sizeof(*pdrvextra_cmd_parm), GFP_ATOMIC); if (!pdrvextra_cmd_parm) { kfree(ppscmd); res = _FAIL; @@ -1197,6 +1175,11 @@ exit: return res; } +static bool rtw_is_hi_queue_empty(struct adapter *adapter) +{ + return (rtw_read32(adapter, REG_HGQ_INFORMATION) & 0x0000ff00) == 0; +} + static void rtw_chk_hi_queue_hdl(struct adapter *padapter) { int cnt = 0; @@ -1208,12 +1191,7 @@ static void rtw_chk_hi_queue_hdl(struct adapter *padapter) return; if (psta_bmc->sleepq_len == 0) { - u8 val = 0; - - /* while ((rtw_read32(padapter, 0x414)&0x00ffff00)!= 0) */ - /* while ((rtw_read32(padapter, 0x414)&0x0000ff00)!= 0) */ - - GetHwReg8188EU(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &val); + bool val = rtw_is_hi_queue_empty(padapter); while (!val) { msleep(100); @@ -1223,7 +1201,7 @@ static void rtw_chk_hi_queue_hdl(struct adapter *padapter) if (cnt > 10) break; - GetHwReg8188EU(padapter, HW_VAR_CHK_HI_QUEUE_EMPTY, &val); + val = rtw_is_hi_queue_empty(padapter); } if (cnt <= 10) { @@ -1244,13 +1222,13 @@ u8 rtw_chk_hi_queue_cmd(struct adapter *padapter) struct cmd_priv *pcmdpriv = &padapter->cmdpriv; u8 res = _SUCCESS; - ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); + ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC); if (!ph2c) { res = _FAIL; goto exit; } - pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), GFP_ATOMIC); + pdrvextra_cmd_parm = kzalloc(sizeof(*pdrvextra_cmd_parm), GFP_ATOMIC); if (!pdrvextra_cmd_parm) { kfree(ph2c); res = _FAIL; @@ -1275,13 +1253,13 @@ u8 rtw_c2h_wk_cmd(struct adapter *padapter, u8 *c2h_evt) struct cmd_priv *pcmdpriv = &padapter->cmdpriv; u8 res = _SUCCESS; - ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); + ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC); if (!ph2c) { res = _FAIL; goto exit; } - pdrvextra_cmd_parm = kzalloc(sizeof(struct drvextra_cmd_parm), GFP_ATOMIC); + pdrvextra_cmd_parm = kzalloc(sizeof(*pdrvextra_cmd_parm), GFP_ATOMIC); if (!pdrvextra_cmd_parm) { kfree(ph2c); res = _FAIL; @@ -1380,8 +1358,8 @@ u8 rtw_drvextra_cmd_hdl(struct adapter *padapter, unsigned char *pbuf) p2p_ps_wk_hdl(padapter, pdrvextra_cmd->type_size); break; case P2P_PROTO_WK_CID: - /* Commented by Albert 2011/07/01 */ - /* I used the type_size as the type command */ + /* Commented by Albert 2011/07/01 */ + /* I used the type_size as the type command */ p2p_protocol_wk_hdl(padapter, pdrvextra_cmd->type_size); break; case CHECK_HIQ_WK_CID: @@ -1404,11 +1382,8 @@ void rtw_survey_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd) { struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - if (pcmd->res == H2C_DROPPED) { + if (pcmd->res != H2C_SUCCESS) { /* TODO: cancel timer and do timeout handler directly... */ - /* need to make timeout handlerOS independent */ - _set_timer(&pmlmepriv->scan_to_timer, 1); - } else if (pcmd->res != H2C_SUCCESS) { _set_timer(&pmlmepriv->scan_to_timer, 1); } @@ -1416,6 +1391,7 @@ void rtw_survey_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd) rtw_free_cmd_obj(pcmd); } + void rtw_disassoc_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd) { struct mlme_priv *pmlmepriv = &padapter->mlmepriv; @@ -1426,8 +1402,10 @@ void rtw_disassoc_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd) spin_unlock_bh(&pmlmepriv->lock); return; - } else /* clear bridge database */ - nat25_db_cleanup(padapter); + } + + /* clear bridge database */ + nat25_db_cleanup(padapter); /* free cmd */ rtw_free_cmd_obj(pcmd); @@ -1437,11 +1415,8 @@ void rtw_joinbss_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd) { struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - if (pcmd->res == H2C_DROPPED) { + if (pcmd->res != H2C_SUCCESS) { /* TODO: cancel timer and do timeout handler directly... */ - /* need to make timeout handlerOS independent */ - _set_timer(&pmlmepriv->assoc_timer, 1); - } else if (pcmd->res != H2C_SUCCESS) { _set_timer(&pmlmepriv->assoc_timer, 1); } @@ -1474,7 +1449,7 @@ void rtw_createbss_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd) rtw_indicate_connect(padapter); } else { - pwlan = _rtw_alloc_network(pmlmepriv); + pwlan = rtw_alloc_network(pmlmepriv); spin_lock_bh(&pmlmepriv->scanned_queue.lock); if (!pwlan) { pwlan = rtw_get_oldest_wlan_network(&pmlmepriv->scanned_queue); diff --git a/drivers/staging/r8188eu/core/rtw_fw.c b/drivers/staging/r8188eu/core/rtw_fw.c index 625d186c3647..0451e5177644 100644 --- a/drivers/staging/r8188eu/core/rtw_fw.c +++ b/drivers/staging/r8188eu/core/rtw_fw.c @@ -4,51 +4,43 @@ #include <linux/firmware.h> #include "../include/rtw_fw.h" -#define MAX_REG_BOLCK_SIZE 196 +#define MAX_REG_BLOCK_SIZE 196 #define FW_8188E_START_ADDRESS 0x1000 #define MAX_PAGE_SIZE 4096 #define IS_FW_HEADER_EXIST(_fwhdr) \ - ((le16_to_cpu(_fwhdr->Signature) & 0xFFF0) == 0x92C0 || \ - (le16_to_cpu(_fwhdr->Signature) & 0xFFF0) == 0x88C0 || \ - (le16_to_cpu(_fwhdr->Signature) & 0xFFF0) == 0x2300 || \ - (le16_to_cpu(_fwhdr->Signature) & 0xFFF0) == 0x88E0) - -/* This structure must be careful with byte-ordering */ + ((le16_to_cpu(_fwhdr->signature) & 0xFFF0) == 0x92C0 || \ + (le16_to_cpu(_fwhdr->signature) & 0xFFF0) == 0x88C0 || \ + (le16_to_cpu(_fwhdr->signature) & 0xFFF0) == 0x2300 || \ + (le16_to_cpu(_fwhdr->signature) & 0xFFF0) == 0x88E0) struct rt_firmware_hdr { - /* 8-byte alinment required */ - /* LONG WORD 0 ---- */ - __le16 Signature; /* 92C0: test chip; 92C, - * 88C0: test chip; 88C1: MP A-cut; - * 92C1: MP A-cut */ - u8 Category; /* AP/NIC and USB/PCI */ - u8 Function; /* Reserved for different FW function - * indcation, for further use when - * driver needs to download different - * FW for different conditions */ - __le16 Version; /* FW Version */ - u8 Subversion; /* FW Subversion, default 0x00 */ - u16 Rsvd1; - - /* LONG WORD 1 ---- */ - u8 Month; /* Release time Month field */ - u8 Date; /* Release time Date field */ - u8 Hour; /* Release time Hour field */ - u8 Minute; /* Release time Minute field */ - __le16 RamCodeSize; /* The size of RAM code */ - u8 Foundry; - u8 Rsvd2; - - /* LONG WORD 2 ---- */ - __le32 SvnIdx; /* The SVN entry index */ - u32 Rsvd3; - - /* LONG WORD 3 ---- */ - u32 Rsvd4; - u32 Rsvd5; + __le16 signature; /* 92C0: test chip; 92C, + * 88C0: test chip; 88C1: MP A-cut; + * 92C1: MP A-cut */ + u8 category; /* AP/NIC and USB/PCI */ + u8 function; /* Reserved for different FW function + * indcation, for further use when + * driver needs to download different + * FW for different conditions */ + __le16 version; /* FW Version */ + u8 subversion; /* FW Subversion, default 0x00 */ + u8 rsvd1; + u8 month; /* Release time Month field */ + u8 date; /* Release time Date field */ + u8 hour; /* Release time Hour field */ + u8 minute; /* Release time Minute field */ + __le16 ramcodesize; /* The size of RAM code */ + u8 foundry; + u8 rsvd2; + __le32 svnidx; /* The SVN entry index */ + __le32 rsvd3; + __le32 rsvd4; + __le32 rsvd5; }; +static_assert(sizeof(struct rt_firmware_hdr) == 32); + static void fw_download_enable(struct adapter *padapter, bool enable) { u8 tmp; @@ -71,53 +63,55 @@ static void fw_download_enable(struct adapter *padapter, bool enable) } } -static int block_write(struct adapter *padapter, void *buffer, u32 buffSize) +static int block_write(struct adapter *padapter, u8 *buffer, u32 size) { int ret = _SUCCESS; - u32 blockSize_p1 = 4; /* (Default) Phase #1 : PCI muse use 4-byte write to download FW */ - u32 blockSize_p2 = 8; /* Phase #2 : Use 8-byte, if Phase#1 use big size to write FW. */ - u32 blockSize_p3 = 1; /* Phase #3 : Use 1-byte, the remnant of FW image. */ - u32 blockCount_p1 = 0, blockCount_p2 = 0, blockCount_p3 = 0; - u32 remainSize_p1 = 0, remainSize_p2 = 0; - u8 *bufferPtr = (u8 *)buffer; - u32 i = 0, offset = 0; - - blockSize_p1 = MAX_REG_BOLCK_SIZE; - - /* 3 Phase #1 */ - blockCount_p1 = buffSize / blockSize_p1; - remainSize_p1 = buffSize % blockSize_p1; - - for (i = 0; i < blockCount_p1; i++) { - ret = rtw_writeN(padapter, (FW_8188E_START_ADDRESS + i * blockSize_p1), blockSize_p1, (bufferPtr + i * blockSize_p1)); + u32 blocks, block_size, remain; + u32 i, offset, addr; + u8 *data; + + block_size = MAX_REG_BLOCK_SIZE; + + blocks = size / block_size; + remain = size % block_size; + + for (i = 0; i < blocks; i++) { + addr = FW_8188E_START_ADDRESS + i * block_size; + data = buffer + i * block_size; + + ret = rtw_writeN(padapter, addr, block_size, data); if (ret == _FAIL) goto exit; } - /* 3 Phase #2 */ - if (remainSize_p1) { - offset = blockCount_p1 * blockSize_p1; + if (remain) { + offset = blocks * block_size; + block_size = 8; - blockCount_p2 = remainSize_p1 / blockSize_p2; - remainSize_p2 = remainSize_p1 % blockSize_p2; + blocks = remain / block_size; + remain = remain % block_size; - for (i = 0; i < blockCount_p2; i++) { - ret = rtw_writeN(padapter, (FW_8188E_START_ADDRESS + offset + i * blockSize_p2), blockSize_p2, (bufferPtr + offset + i * blockSize_p2)); + for (i = 0; i < blocks; i++) { + addr = FW_8188E_START_ADDRESS + offset + i * block_size; + data = buffer + offset + i * block_size; + ret = rtw_writeN(padapter, addr, block_size, data); if (ret == _FAIL) goto exit; } } - /* 3 Phase #3 */ - if (remainSize_p2) { - offset = (blockCount_p1 * blockSize_p1) + (blockCount_p2 * blockSize_p2); + if (remain) { + offset += blocks * block_size; - blockCount_p3 = remainSize_p2 / blockSize_p3; + /* block size 1 */ + blocks = remain; - for (i = 0; i < blockCount_p3; i++) { - ret = rtw_write8(padapter, (FW_8188E_START_ADDRESS + offset + i), *(bufferPtr + offset + i)); + for (i = 0; i < blocks; i++) { + addr = FW_8188E_START_ADDRESS + offset + i; + data = buffer + offset + i; + ret = rtw_write8(padapter, addr, *data); if (ret == _FAIL) goto exit; } @@ -127,7 +121,7 @@ exit: return ret; } -static int page_write(struct adapter *padapter, u32 page, void *buffer, u32 size) +static int page_write(struct adapter *padapter, u32 page, u8 *buffer, u32 size) { u8 value8; u8 u8Page = (u8)(page & 0x07); @@ -138,21 +132,20 @@ static int page_write(struct adapter *padapter, u32 page, void *buffer, u32 size return block_write(padapter, buffer, size); } -static int write_fw(struct adapter *padapter, void *buffer, u32 size) +static int write_fw(struct adapter *padapter, u8 *buffer, u32 size) { /* Since we need dynamic decide method of dwonload fw, so we call this function to get chip version. */ /* We can remove _ReadChipVersion from ReadpadapterInfo8192C later. */ int ret = _SUCCESS; u32 pageNums, remainSize; u32 page, offset; - u8 *bufferPtr = (u8 *)buffer; pageNums = size / MAX_PAGE_SIZE; remainSize = size % MAX_PAGE_SIZE; for (page = 0; page < pageNums; page++) { offset = page * MAX_PAGE_SIZE; - ret = page_write(padapter, page, bufferPtr + offset, MAX_PAGE_SIZE); + ret = page_write(padapter, page, buffer + offset, MAX_PAGE_SIZE); if (ret == _FAIL) goto exit; @@ -160,7 +153,7 @@ static int write_fw(struct adapter *padapter, void *buffer, u32 size) if (remainSize) { offset = pageNums * MAX_PAGE_SIZE; page = pageNums; - ret = page_write(padapter, page, bufferPtr + offset, remainSize); + ret = page_write(padapter, page, buffer + offset, remainSize); if (ret == _FAIL) goto exit; @@ -247,14 +240,12 @@ int rtl8188e_firmware_download(struct adapter *padapter) { int ret = _SUCCESS; u8 write_fw_retry = 0; - u32 fwdl_start_time; + unsigned long fwdl_timeout; struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); struct device *device = dvobj_to_dev(dvobj); struct rt_firmware_hdr *fwhdr = NULL; - u16 fw_version, fw_subversion, fw_signature; u8 *fw_data; u32 fw_size; - static int log_version; if (!dvobj->firmware.data) ret = load_firmware(&dvobj->firmware, device); @@ -265,21 +256,15 @@ int rtl8188e_firmware_download(struct adapter *padapter) fw_data = dvobj->firmware.data; fw_size = dvobj->firmware.size; - /* To Check Fw header. Added by tynli. 2009.12.04. */ fwhdr = (struct rt_firmware_hdr *)dvobj->firmware.data; - fw_version = le16_to_cpu(fwhdr->Version); - fw_subversion = fwhdr->Subversion; - fw_signature = le16_to_cpu(fwhdr->Signature); - - if (!log_version++) - pr_info("%sFirmware Version %d, SubVersion %d, Signature 0x%x\n", - DRIVER_PREFIX, fw_version, fw_subversion, fw_signature); - if (IS_FW_HEADER_EXIST(fwhdr)) { - /* Shift 32 bytes for FW header */ - fw_data = fw_data + 32; - fw_size = fw_size - 32; + pr_info_once("R8188EU: Firmware Version %d, SubVersion %d, Signature 0x%x\n", + le16_to_cpu(fwhdr->version), fwhdr->subversion, + le16_to_cpu(fwhdr->signature)); + + fw_data = fw_data + sizeof(struct rt_firmware_hdr); + fw_size = fw_size - sizeof(struct rt_firmware_hdr); } /* Suggested by Filen. If 8051 is running in RAM code, driver should inform Fw to reset by itself, */ @@ -290,7 +275,7 @@ int rtl8188e_firmware_download(struct adapter *padapter) } fw_download_enable(padapter, true); - fwdl_start_time = jiffies; + fwdl_timeout = jiffies + msecs_to_jiffies(500); while (1) { /* reset the FWDL chksum */ rtw_write8(padapter, REG_MCUFWDL, rtw_read8(padapter, REG_MCUFWDL) | FWDL_CHKSUM_RPT); @@ -298,7 +283,7 @@ int rtl8188e_firmware_download(struct adapter *padapter) ret = write_fw(padapter, fw_data, fw_size); if (ret == _SUCCESS || - (rtw_get_passing_time_ms(fwdl_start_time) > 500 && write_fw_retry++ >= 3)) + (time_after(jiffies, fwdl_timeout) && write_fw_retry++ >= 3)) break; } fw_download_enable(padapter, false); diff --git a/drivers/staging/r8188eu/core/rtw_ieee80211.c b/drivers/staging/r8188eu/core/rtw_ieee80211.c index 5a0e42ed4a47..385a9ed8eff7 100644 --- a/drivers/staging/r8188eu/core/rtw_ieee80211.c +++ b/drivers/staging/r8188eu/core/rtw_ieee80211.c @@ -97,16 +97,15 @@ bool rtw_is_cckratesonly_included(u8 *rate) int rtw_check_network_type(unsigned char *rate, int ratelen, int channel) { - if (channel > 14) { + if (channel > 14) return WIRELESS_INVALID; - } else { /* could be pure B, pure G, or B/G */ - if (rtw_is_cckratesonly_included(rate)) - return WIRELESS_11B; - else if (rtw_is_cckrates_included(rate)) - return WIRELESS_11BG; - else - return WIRELESS_11G; - } + /* could be pure B, pure G, or B/G */ + if (rtw_is_cckratesonly_included(rate)) + return WIRELESS_11B; + else if (rtw_is_cckrates_included(rate)) + return WIRELESS_11BG; + else + return WIRELESS_11G; } u8 *rtw_set_fixed_ie(unsigned char *pbuf, unsigned int len, unsigned char *source, @@ -160,11 +159,10 @@ u8 *rtw_get_ie(u8 *pbuf, int index, int *len, int limit) if (*p == index) { *len = *(p + 1); return p; - } else { - tmp = *(p + 1); - p += (tmp + 2); - i += (tmp + 2); } + tmp = *(p + 1); + p += (tmp + 2); + i += (tmp + 2); if (i >= limit) break; } @@ -295,10 +293,9 @@ unsigned char *rtw_get_wpa_ie(unsigned char *pie, int *wpa_ie_len, int limit) goto check_next_ie; *wpa_ie_len = *(pbuf + 1); return pbuf; - } else { - *wpa_ie_len = 0; - return NULL; } + *wpa_ie_len = 0; + return NULL; check_next_ie: limit_new = limit - (pbuf - pie) - 2 - len; @@ -558,9 +555,8 @@ u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen) cnt += in_ie[cnt + 1] + 2; break; - } else { - cnt += in_ie[cnt + 1] + 2; /* goto next */ } + cnt += in_ie[cnt + 1] + 2; /* goto next */ } return wpsie_ptr; } @@ -604,9 +600,8 @@ u8 *rtw_get_wps_attr(u8 *wps_ie, uint wps_ielen, u16 target_attr_id, u8 *buf_att if (len_attr) *len_attr = attr_len; break; - } else { - attr_ptr += attr_len; /* goto next */ } + attr_ptr += attr_len; /* goto next */ } return target_attr_ptr; } @@ -901,9 +896,8 @@ u8 *rtw_get_p2p_ie(u8 *in_ie, int in_len, u8 *p2p_ie, uint *p2p_ielen) if (p2p_ielen) *p2p_ielen = in_ie[cnt + 1] + 2; return p2p_ie_ptr; - } else { - cnt += in_ie[cnt + 1] + 2; /* goto next */ } + cnt += in_ie[cnt + 1] + 2; /* goto next */ } return NULL; } @@ -948,9 +942,8 @@ u8 *rtw_get_p2p_attr(u8 *p2p_ie, uint p2p_ielen, u8 target_attr_id, u8 *buf_attr if (len_attr) *len_attr = attr_len; break; - } else { - attr_ptr += attr_len; /* goto next */ } + attr_ptr += attr_len; /* goto next */ } return target_attr_ptr; } @@ -1058,7 +1051,7 @@ static int rtw_get_cipher_info(struct wlan_network *pnetwork) pbuf = rtw_get_wpa_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength - 12); if (pbuf && (wpa_ielen > 0)) { - if (_SUCCESS == rtw_parse_wpa_ie(pbuf, wpa_ielen + 2, &group_cipher, &pairwise_cipher, &is8021x)) { + if (rtw_parse_wpa_ie(pbuf, wpa_ielen + 2, &group_cipher, &pairwise_cipher, &is8021x) == _SUCCESS) { pnetwork->BcnInfo.pairwise_cipher = pairwise_cipher; pnetwork->BcnInfo.group_cipher = group_cipher; pnetwork->BcnInfo.is_8021x = is8021x; @@ -1068,7 +1061,7 @@ static int rtw_get_cipher_info(struct wlan_network *pnetwork) pbuf = rtw_get_wpa2_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength - 12); if (pbuf && (wpa_ielen > 0)) { - if (_SUCCESS == rtw_parse_wpa2_ie(pbuf, wpa_ielen + 2, &group_cipher, &pairwise_cipher, &is8021x)) { + if (rtw_parse_wpa2_ie(pbuf, wpa_ielen + 2, &group_cipher, &pairwise_cipher, &is8021x) == _SUCCESS) { pnetwork->BcnInfo.pairwise_cipher = pairwise_cipher; pnetwork->BcnInfo.group_cipher = group_cipher; pnetwork->BcnInfo.is_8021x = is8021x; diff --git a/drivers/staging/r8188eu/core/rtw_ioctl_set.c b/drivers/staging/r8188eu/core/rtw_ioctl_set.c index 4b78e42d180d..7ba75f73e47e 100644 --- a/drivers/staging/r8188eu/core/rtw_ioctl_set.c +++ b/drivers/staging/r8188eu/core/rtw_ioctl_set.c @@ -44,7 +44,7 @@ u8 rtw_do_join(struct adapter *padapter) pmlmepriv->to_roaming > 0) { /* submit site_survey_cmd */ ret = rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0); - if (_SUCCESS != ret) + if (ret != _SUCCESS) pmlmepriv->to_join = false; } else { pmlmepriv->to_join = false; @@ -91,7 +91,7 @@ u8 rtw_do_join(struct adapter *padapter) if (!pmlmepriv->LinkDetectInfo.bBusyTraffic || pmlmepriv->to_roaming > 0) { ret = rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0); - if (_SUCCESS != ret) + if (ret != _SUCCESS) pmlmepriv->to_join = false; } else { ret = _FAIL; diff --git a/drivers/staging/r8188eu/core/rtw_iol.c b/drivers/staging/r8188eu/core/rtw_iol.c index e14e3746efdd..af8e84a41b85 100644 --- a/drivers/staging/r8188eu/core/rtw_iol.c +++ b/drivers/staging/r8188eu/core/rtw_iol.c @@ -57,10 +57,10 @@ int rtw_IOL_append_cmds(struct xmit_frame *xmit_frame, u8 *IOL_cmds, u32 cmd_len bool rtw_IOL_applied(struct adapter *adapter) { - if (1 == adapter->registrypriv.fw_iol) + if (adapter->registrypriv.fw_iol == 1) return true; - if ((2 == adapter->registrypriv.fw_iol) && + if ((adapter->registrypriv.fw_iol == 2) && (adapter_to_dvobj(adapter)->pusbdev->speed != USB_SPEED_HIGH)) return true; diff --git a/drivers/staging/r8188eu/core/rtw_led.c b/drivers/staging/r8188eu/core/rtw_led.c index ccd43accb7dc..2f3000428af7 100644 --- a/drivers/staging/r8188eu/core/rtw_led.c +++ b/drivers/staging/r8188eu/core/rtw_led.c @@ -110,7 +110,7 @@ static void blink_work(struct work_struct *work) pLed->bLedLinkBlinkInProgress = true; pLed->CurrLedState = LED_BLINK_NORMAL; schedule_delayed_work(&pLed->blink_work, LED_BLINK_LINK_INTVL); - } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) { + } else { pLed->bLedNoLinkBlinkInProgress = true; pLed->CurrLedState = LED_BLINK_SLOWLY; schedule_delayed_work(&pLed->blink_work, LED_BLINK_NO_LINK_INTVL); @@ -131,7 +131,7 @@ static void blink_work(struct work_struct *work) pLed->bLedLinkBlinkInProgress = true; pLed->CurrLedState = LED_BLINK_NORMAL; schedule_delayed_work(&pLed->blink_work, LED_BLINK_LINK_INTVL); - } else if (!check_fwstate(pmlmepriv, _FW_LINKED)) { + } else { pLed->bLedNoLinkBlinkInProgress = true; pLed->CurrLedState = LED_BLINK_SLOWLY; schedule_delayed_work(&pLed->blink_work, LED_BLINK_NO_LINK_INTVL); @@ -278,7 +278,7 @@ void rtw_led_control(struct adapter *padapter, enum LED_CTL_MODE LedAction) else pLed->BlinkingLedState = RTW_LED_ON; schedule_delayed_work(&pLed->blink_work, LED_BLINK_SCAN_INTVL); - } + } break; case LED_CTL_TX: case LED_CTL_RX: @@ -304,7 +304,7 @@ void rtw_led_control(struct adapter *padapter, enum LED_CTL_MODE LedAction) } break; case LED_CTL_START_WPS: /* wait until xinpin finish */ - if (!pLed->bLedWPSBlinkInProgress) { + if (!pLed->bLedWPSBlinkInProgress) { if (pLed->bLedNoLinkBlinkInProgress) { cancel_delayed_work(&pLed->blink_work); pLed->bLedNoLinkBlinkInProgress = false; @@ -328,7 +328,7 @@ void rtw_led_control(struct adapter *padapter, enum LED_CTL_MODE LedAction) else pLed->BlinkingLedState = RTW_LED_ON; schedule_delayed_work(&pLed->blink_work, LED_BLINK_SCAN_INTVL); - } + } break; case LED_CTL_STOP_WPS: if (pLed->bLedNoLinkBlinkInProgress) { diff --git a/drivers/staging/r8188eu/core/rtw_mlme.c b/drivers/staging/r8188eu/core/rtw_mlme.c index 6f0bff186477..5a815642c3f6 100644 --- a/drivers/staging/r8188eu/core/rtw_mlme.c +++ b/drivers/staging/r8188eu/core/rtw_mlme.c @@ -16,7 +16,6 @@ #include "../include/usb_osintf.h" #include "../include/rtl8188e_dm.h" -extern unsigned char MCS_rate_2R[16]; extern unsigned char MCS_rate_1R[16]; void rtw_set_roaming(struct adapter *adapter, u8 to_roaming) @@ -31,60 +30,6 @@ u8 rtw_to_roaming(struct adapter *adapter) return adapter->mlmepriv.to_roaming; } -int _rtw_init_mlme_priv(struct adapter *padapter) -{ - int i; - u8 *pbuf; - struct wlan_network *pnetwork; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - int res = _SUCCESS; - - /* We don't need to memset padapter->XXX to zero, because adapter is allocated by vzalloc(). */ - - pmlmepriv->nic_hdl = (u8 *)padapter; - - pmlmepriv->pscanned = NULL; - pmlmepriv->fw_state = 0; - pmlmepriv->cur_network.network.InfrastructureMode = Ndis802_11AutoUnknown; - pmlmepriv->scan_mode = SCAN_ACTIVE;/* 1: active, 0: pasive. Maybe someday we should rename this varable to "active_mode" (Jeff) */ - - spin_lock_init(&pmlmepriv->lock); - rtw_init_queue(&pmlmepriv->free_bss_pool); - rtw_init_queue(&pmlmepriv->scanned_queue); - - set_scanned_network_val(pmlmepriv, 0); - - memset(&pmlmepriv->assoc_ssid, 0, sizeof(struct ndis_802_11_ssid)); - - pbuf = vzalloc(MAX_BSS_CNT * (sizeof(struct wlan_network))); - - if (!pbuf) { - res = _FAIL; - goto exit; - } - pmlmepriv->free_bss_buf = pbuf; - - pnetwork = (struct wlan_network *)pbuf; - - for (i = 0; i < MAX_BSS_CNT; i++) { - INIT_LIST_HEAD(&pnetwork->list); - - list_add_tail(&pnetwork->list, &pmlmepriv->free_bss_pool.queue); - - pnetwork++; - } - - /* allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf */ - - rtw_clear_scan_deny(padapter); - - rtw_init_mlme_timer(padapter); - -exit: - - return res; -} - static void rtw_free_mlme_ie_data(u8 **ppie, u32 *plen) { kfree(*ppie); @@ -95,7 +40,6 @@ static void rtw_free_mlme_ie_data(u8 **ppie, u32 *plen) void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv) { kfree(pmlmepriv->assoc_req); - kfree(pmlmepriv->assoc_rsp); rtw_free_mlme_ie_data(&pmlmepriv->wps_beacon_ie, &pmlmepriv->wps_beacon_ie_len); rtw_free_mlme_ie_data(&pmlmepriv->wps_probe_req_ie, &pmlmepriv->wps_probe_req_ie_len); rtw_free_mlme_ie_data(&pmlmepriv->wps_probe_resp_ie, &pmlmepriv->wps_probe_resp_ie_len); @@ -108,49 +52,6 @@ void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv) rtw_free_mlme_ie_data(&pmlmepriv->p2p_assoc_req_ie, &pmlmepriv->p2p_assoc_req_ie_len); } -void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv) -{ - - rtw_free_mlme_priv_ie_data(pmlmepriv); - - if (pmlmepriv) { - vfree(pmlmepriv->free_bss_buf); - } - -} - -struct wlan_network *_rtw_alloc_network(struct mlme_priv *pmlmepriv)/* _queue *free_queue) */ -{ - struct wlan_network *pnetwork; - struct __queue *free_queue = &pmlmepriv->free_bss_pool; - struct list_head *plist = NULL; - - spin_lock_bh(&free_queue->lock); - - if (list_empty(&free_queue->queue)) { - pnetwork = NULL; - goto exit; - } - plist = (&free_queue->queue)->next; - - pnetwork = container_of(plist, struct wlan_network, list); - - list_del_init(&pnetwork->list); - - pnetwork->network_type = 0; - pnetwork->fixed = false; - pnetwork->last_scanned = jiffies; - pnetwork->aid = 0; - pnetwork->join_res = 0; - - pmlmepriv->num_of_scanned++; - -exit: - spin_unlock_bh(&free_queue->lock); - - return pnetwork; -} - void _rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 isfreeall) { u32 curr_time, delta_time; @@ -194,7 +95,7 @@ void _rtw_free_network_nolock(struct mlme_priv *pmlmepriv, struct wlan_network * /* return the wlan_network with the matching addr - Shall be calle under atomic context... to avoid possible racing condition... + Shall be called under atomic context... to avoid possible racing condition... */ struct wlan_network *_rtw_find_network(struct __queue *scanned_queue, u8 *addr) { @@ -291,23 +192,92 @@ u8 *rtw_get_beacon_interval_from_ie(u8 *ie) int rtw_init_mlme_priv(struct adapter *padapter)/* struct mlme_priv *pmlmepriv) */ { - int res; + int i; + u8 *pbuf; + struct wlan_network *pnetwork; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + int res = _SUCCESS; - res = _rtw_init_mlme_priv(padapter);/* (pmlmepriv); */ + /* We don't need to memset padapter->XXX to zero, because adapter is allocated by vzalloc(). */ + + pmlmepriv->nic_hdl = (u8 *)padapter; + + pmlmepriv->pscanned = NULL; + pmlmepriv->fw_state = 0; + pmlmepriv->cur_network.network.InfrastructureMode = Ndis802_11AutoUnknown; + pmlmepriv->scan_mode = SCAN_ACTIVE;/* 1: active, 0: pasive. Maybe someday we should rename this varable to "active_mode" (Jeff) */ + + spin_lock_init(&pmlmepriv->lock); + rtw_init_queue(&pmlmepriv->free_bss_pool); + rtw_init_queue(&pmlmepriv->scanned_queue); + + set_scanned_network_val(pmlmepriv, 0); + + memset(&pmlmepriv->assoc_ssid, 0, sizeof(struct ndis_802_11_ssid)); + + pbuf = vzalloc(MAX_BSS_CNT * (sizeof(struct wlan_network))); + + if (!pbuf) { + res = _FAIL; + goto exit; + } + pmlmepriv->free_bss_buf = pbuf; + + pnetwork = (struct wlan_network *)pbuf; + + for (i = 0; i < MAX_BSS_CNT; i++) { + INIT_LIST_HEAD(&pnetwork->list); + + list_add_tail(&pnetwork->list, &pmlmepriv->free_bss_pool.queue); + + pnetwork++; + } + + /* allocate DMA-able/Non-Page memory for cmd_buf and rsp_buf */ + + rtw_clear_scan_deny(padapter); + + rtw_init_mlme_timer(padapter); + +exit: return res; } void rtw_free_mlme_priv(struct mlme_priv *pmlmepriv) { - _rtw_free_mlme_priv(pmlmepriv); + rtw_free_mlme_priv_ie_data(pmlmepriv); + vfree(pmlmepriv->free_bss_buf); } -static struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv) +struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv) { struct wlan_network *pnetwork; + struct __queue *free_queue = &pmlmepriv->free_bss_pool; + struct list_head *plist = NULL; + + spin_lock_bh(&free_queue->lock); + + if (list_empty(&free_queue->queue)) { + pnetwork = NULL; + goto exit; + } + plist = (&free_queue->queue)->next; + + pnetwork = container_of(plist, struct wlan_network, list); + + list_del_init(&pnetwork->list); - pnetwork = _rtw_alloc_network(pmlmepriv); + pnetwork->network_type = 0; + pnetwork->fixed = false; + pnetwork->last_scanned = jiffies; + pnetwork->aid = 0; + pnetwork->join_res = 0; + + pmlmepriv->num_of_scanned++; + +exit: + spin_unlock_bh(&free_queue->lock); return pnetwork; } @@ -330,7 +300,7 @@ void rtw_free_network_queue(struct adapter *dev, u8 isfreeall) /* return the wlan_network with the matching addr - Shall be calle under atomic context... to avoid possible racing condition... + Shall be called under atomic context... to avoid possible racing condition... */ struct wlan_network *rtw_find_network(struct __queue *scanned_queue, u8 *addr) { @@ -465,6 +435,13 @@ static void update_current_network(struct adapter *adapter, struct wlan_bssid_ex } +u8 rtw_current_antenna(struct adapter *adapter) +{ + struct hal_data_8188e *haldata = &adapter->haldata; + + return haldata->CurAntenna; +} + /* Caller must hold pmlmepriv->lock first. */ @@ -498,7 +475,8 @@ void rtw_update_scanned_network(struct adapter *adapter, struct wlan_bssid_ex *t /* If there are no more slots, expire the oldest */ pnetwork = oldest; - GetHalDefVar8188EUsb(adapter, HAL_DEF_CURRENT_ANTENNA, &target->PhyInfo.Optimum_antenna); + target->PhyInfo.Optimum_antenna = rtw_current_antenna(adapter); + memcpy(&pnetwork->network, target, get_wlan_bssid_ex_sz(target)); /* variable initialize */ pnetwork->fixed = false; @@ -521,7 +499,7 @@ void rtw_update_scanned_network(struct adapter *adapter, struct wlan_bssid_ex *t bssid_ex_sz = get_wlan_bssid_ex_sz(target); target->Length = bssid_ex_sz; - GetHalDefVar8188EUsb(adapter, HAL_DEF_CURRENT_ANTENNA, &target->PhyInfo.Optimum_antenna); + target->PhyInfo.Optimum_antenna = rtw_current_antenna(adapter); memcpy(&pnetwork->network, target, bssid_ex_sz); pnetwork->last_scanned = jiffies; @@ -567,8 +545,8 @@ static void rtw_add_network(struct adapter *adapter, /* select the desired network based on the capability of the (i)bss. */ /* check items: (1) security */ -/* (2) network_type */ -/* (3) WMM */ +/* (2) network_type */ +/* (3) WMM */ /* (4) HT */ /* (5) others */ static bool rtw_is_desired_network(struct adapter *adapter, struct wlan_network *pnetwork) @@ -715,15 +693,12 @@ void rtw_surveydone_event_callback(struct adapter *adapter, u8 *pbuf) set_fwstate(pmlmepriv, _FW_UNDER_LINKING); pmlmepriv->to_join = false; s_ret = rtw_select_and_join_from_scanned_queue(pmlmepriv); - if (_SUCCESS == s_ret) { - _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); - } else if (s_ret == 2) { /* there is no need to wait for join */ - _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); - rtw_indicate_connect(adapter); + if (s_ret == _SUCCESS) { + _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); } else { if (rtw_to_roaming(adapter) != 0) { if (--pmlmepriv->to_roaming == 0 || - _SUCCESS != rtw_sitesurvey_cmd(adapter, &pmlmepriv->assoc_ssid, 1, NULL, 0)) { + rtw_sitesurvey_cmd(adapter, &pmlmepriv->assoc_ssid, 1, NULL, 0) != _SUCCESS) { rtw_set_roaming(adapter, 0); rtw_free_assoc_resources(adapter, 1); rtw_indicate_disconnect(adapter); @@ -748,14 +723,6 @@ void rtw_surveydone_event_callback(struct adapter *adapter, u8 *pbuf) rtw_os_xmit_schedule(adapter); } -void rtw_dummy_event_callback(struct adapter *adapter, u8 *pbuf) -{ -} - -void rtw_fwdbg_event_callback(struct adapter *adapter, u8 *pbuf) -{ -} - static void free_scanqueue(struct mlme_priv *pmlmepriv) { struct __queue *free_queue = &pmlmepriv->free_bss_pool; @@ -911,9 +878,8 @@ static struct sta_info *rtw_joinbss_update_stainfo(struct adapter *padapter, str memset((u8 *)&psta->dot11txpn, 0, sizeof(union pn48)); memset((u8 *)&psta->dot11rxpn, 0, sizeof(union pn48)); } - /* Commented by Albert 2012/07/21 */ - /* When doing the WPS, the wps_ie_len won't equal to 0 */ - /* And the Wi-Fi driver shouldn't allow the data packet to be tramsmitted. */ + /* When doing the WPS, the wps_ie_len won't equal to 0 */ + /* And the Wi-Fi driver shouldn't allow the data packet to be transmitted. */ if (padapter->securitypriv.wps_ie_len != 0) { psta->ieee8021x_blocked = true; padapter->securitypriv.wps_ie_len = 0; @@ -1071,8 +1037,10 @@ void rtw_joinbss_event_prehandle(struct adapter *adapter, u8 *pbuf) rtw_indicate_connect(adapter); } + spin_unlock_bh(&pmlmepriv->lock); /* s5. Cancel assoc_timer */ del_timer_sync(&pmlmepriv->assoc_timer); + spin_lock_bh(&pmlmepriv->lock); } else { spin_unlock_bh(&pmlmepriv->scanned_queue.lock); goto ignore_joinbss_callback; @@ -1105,6 +1073,11 @@ void rtw_joinbss_event_callback(struct adapter *adapter, u8 *pbuf) } +void rtw_set_max_rpt_macid(struct adapter *adapter, u8 macid) +{ + rtw_write8(adapter, REG_TX_RPT_CTRL + 1, macid + 1); +} + static u8 search_max_mac_id(struct adapter *padapter) { u8 mac_id; @@ -1141,7 +1114,8 @@ void rtw_sta_media_status_rpt(struct adapter *adapter, struct sta_info *psta, return; macid = search_max_mac_id(adapter); - SetHwReg8188EU(adapter, HW_VAR_TX_RPT_MAX_MACID, (u8 *)&macid); + rtw_set_max_rpt_macid(adapter, macid); + /* MACID|OPMODE:1 connect */ media_status_rpt = (u16)((psta->mac_id << 8) | mstatus); SetHwReg8188EU(adapter, HW_VAR_H2C_MEDIA_STATUS_RPT, (u8 *)&media_status_rpt); @@ -1299,7 +1273,7 @@ void rtw_stadel_event_callback(struct adapter *adapter, u8 *pbuf) } /* -* _rtw_join_timeout_handler - Timeout/faliure handler for CMD JoinBss +* _rtw_join_timeout_handler - Timeout/failure handler for CMD JoinBss * @adapter: pointer to struct adapter structure */ void _rtw_join_timeout_handler (struct adapter *adapter) @@ -1310,7 +1284,7 @@ void _rtw_join_timeout_handler (struct adapter *adapter) if (adapter->bDriverStopped || adapter->bSurpriseRemoved) return; - spin_lock_bh(&pmlmepriv->lock); + spin_lock_irq(&pmlmepriv->lock); if (rtw_to_roaming(adapter) > 0) { /* join timeout caused by roaming */ while (1) { @@ -1329,12 +1303,12 @@ void _rtw_join_timeout_handler (struct adapter *adapter) rtw_indicate_disconnect(adapter); free_scanqueue(pmlmepriv);/* */ } - spin_unlock_bh(&pmlmepriv->lock); + spin_unlock_irq(&pmlmepriv->lock); } /* -* rtw_scan_timeout_handler - Timeout/Faliure handler for CMD SiteSurvey +* rtw_scan_timeout_handler - Timeout/Failure handler for CMD SiteSurvey * @adapter: pointer to struct adapter structure */ void rtw_scan_timeout_handler (struct adapter *adapter) @@ -1414,6 +1388,7 @@ static int rtw_check_join_candidate(struct mlme_priv *pmlmepriv { int updated = false; struct adapter *adapter = container_of(pmlmepriv, struct adapter, mlmepriv); + unsigned long scan_res_expire; /* check bssid, if needed */ if (pmlmepriv->assoc_by_bssid) { @@ -1431,8 +1406,9 @@ static int rtw_check_join_candidate(struct mlme_priv *pmlmepriv if (!rtw_is_desired_network(adapter, competitor)) goto exit; + scan_res_expire = competitor->last_scanned + msecs_to_jiffies(RTW_SCAN_RESULT_EXPIRE); if (rtw_to_roaming(adapter) > 0) { - if (rtw_get_passing_time_ms((u32)competitor->last_scanned) >= RTW_SCAN_RESULT_EXPIRE || + if (time_after(jiffies, scan_res_expire) || !is_same_ess(&competitor->network, &pmlmepriv->cur_network.network)) goto exit; } @@ -1461,7 +1437,6 @@ int rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv) struct __queue *queue = &pmlmepriv->scanned_queue; struct wlan_network *pnetwork = NULL; struct wlan_network *candidate = NULL; - u8 supp_ant_div = false; spin_lock_bh(&pmlmepriv->scanned_queue.lock); phead = get_list_head(queue); @@ -1488,12 +1463,6 @@ int rtw_select_and_join_from_scanned_queue(struct mlme_priv *pmlmepriv) rtw_free_assoc_resources(adapter, 0); } - GetHalDefVar8188EUsb(adapter, HAL_DEF_IS_SUPPORT_ANT_DIV, &supp_ant_div); - if (supp_ant_div) { - u8 cur_ant; - GetHalDefVar8188EUsb(adapter, HAL_DEF_CURRENT_ANTENNA, &cur_ant); - } - ret = rtw_joinbss_cmd(adapter, candidate); exit: @@ -1509,13 +1478,13 @@ int rtw_set_auth(struct adapter *adapter, struct security_priv *psecuritypriv) struct cmd_priv *pcmdpriv = &adapter->cmdpriv; int res = _SUCCESS; - pcmd = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); + pcmd = kzalloc(sizeof(*pcmd), GFP_KERNEL); if (!pcmd) { res = _FAIL; /* try again */ goto exit; } - psetauthparm = kzalloc(sizeof(struct setauth_parm), GFP_KERNEL); + psetauthparm = kzalloc(sizeof(*psetauthparm), GFP_KERNEL); if (!psetauthparm) { kfree(pcmd); res = _FAIL; @@ -1628,38 +1597,22 @@ int rtw_restruct_wmm_ie(struct adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_ } /* */ -/* Ported from 8185: IsInPreAuthKeyList(). (Renamed from SecIsInPreAuthKeyList(), 2006-10-13.) */ -/* Added by Annie, 2006-05-07. */ -/* */ /* Search by BSSID, */ /* Return Value: */ -/* -1 :if there is no pre-auth key in the table */ -/* >= 0 :if there is pre-auth key, and return the entry id */ +/* -1 :if there is no pre-auth key in the table */ +/* >= 0 :if there is pre-auth key, and return the entry id */ /* */ /* */ static int SecIsInPMKIDList(struct adapter *Adapter, u8 *bssid) { - struct security_priv *psecuritypriv = &Adapter->securitypriv; - int i = 0; - - do { - if ((psecuritypriv->PMKIDList[i].bUsed) && - (!memcmp(psecuritypriv->PMKIDList[i].Bssid, bssid, ETH_ALEN))) { - break; - } else { - i++; - /* continue; */ - } - - } while (i < NUM_PMKID_CACHE); + struct security_priv *p = &Adapter->securitypriv; + int i; - if (i == NUM_PMKID_CACHE) { - i = -1;/* Could not find. */ - } else { - /* There is one Pre-Authentication Key for the specific BSSID. */ - } - return i; + for (i = 0; i < NUM_PMKID_CACHE; i++) + if (p->PMKIDList[i].bUsed && !memcmp(p->PMKIDList[i].Bssid, bssid, ETH_ALEN)) + return i; + return -1; } /* */ @@ -1796,10 +1749,23 @@ void rtw_update_registrypriv_dev_network(struct adapter *adapter) } +static void rtw_set_threshold(struct adapter *adapter) +{ + struct mlme_priv *mlmepriv = &adapter->mlmepriv; + struct ht_priv *htpriv = &mlmepriv->htpriv; + + if (htpriv->ht_option && adapter->registrypriv.wifi_spec != 1) { + /* validate usb rx aggregation, use init value. */ + rtw_write8(adapter, REG_RXDMA_AGG_PG_TH, USB_RXAGG_PAGE_COUNT); + } else { + /* invalidate usb rx aggregation */ + rtw_write8(adapter, REG_RXDMA_AGG_PG_TH, 1); + } +} + /* the function is at passive_level */ void rtw_joinbss_reset(struct adapter *padapter) { - u8 threshold; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct ht_priv *phtpriv = &pmlmepriv->htpriv; @@ -1810,18 +1776,7 @@ void rtw_joinbss_reset(struct adapter *padapter) phtpriv->ampdu_enable = false;/* reset to disabled */ - /* TH = 1 => means that invalidate usb rx aggregation */ - /* TH = 0 => means that validate usb rx aggregation, use init value. */ - if (phtpriv->ht_option) { - if (padapter->registrypriv.wifi_spec == 1) - threshold = 1; - else - threshold = 0; - SetHwReg8188EU(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); - } else { - threshold = 1; - SetHwReg8188EU(padapter, HW_VAR_RXDMA_AGG_PG_TH, (u8 *)(&threshold)); - } + rtw_set_threshold(padapter); } /* the function is >= passive_level */ @@ -1984,7 +1939,7 @@ void rtw_issue_addbareq_cmd(struct adapter *padapter, struct xmit_frame *pxmitfr issued = (phtpriv->agg_enable_bitmap >> priority) & 0x1; issued |= (phtpriv->candidate_tid_bitmap >> priority) & 0x1; - if (0 == issued) { + if (issued == 0) { psta->htpriv.candidate_tid_bitmap |= BIT((u8)priority); rtw_addbareq_cmd(padapter, (u8)priority, pattrib->ra); } @@ -2011,19 +1966,19 @@ void _rtw_roaming(struct adapter *padapter, struct wlan_network *tgt_network) else pnetwork = &pmlmepriv->cur_network; - if (0 < rtw_to_roaming(padapter)) { + if (rtw_to_roaming(padapter) > 0) { memcpy(&pmlmepriv->assoc_ssid, &pnetwork->network.Ssid, sizeof(struct ndis_802_11_ssid)); pmlmepriv->assoc_by_bssid = false; while (1) { do_join_r = rtw_do_join(padapter); - if (_SUCCESS == do_join_r) { + if (do_join_r == _SUCCESS) { break; } else { pmlmepriv->to_roaming--; - if (0 < pmlmepriv->to_roaming) { + if (pmlmepriv->to_roaming > 0) { continue; } else { rtw_indicate_disconnect(padapter); diff --git a/drivers/staging/r8188eu/core/rtw_mlme_ext.c b/drivers/staging/r8188eu/core/rtw_mlme_ext.c index 10d5f1222936..faf23fc950c5 100644 --- a/drivers/staging/r8188eu/core/rtw_mlme_ext.c +++ b/drivers/staging/r8188eu/core/rtw_mlme_ext.c @@ -14,39 +14,22 @@ #include "../include/rtl8188e_xmit.h" #include "../include/rtl8188e_dm.h" -static struct mlme_handler mlme_sta_tbl[] = { - {WIFI_ASSOCREQ, "OnAssocReq", &OnAssocReq}, - {WIFI_ASSOCRSP, "OnAssocRsp", &OnAssocRsp}, - {WIFI_REASSOCREQ, "OnReAssocReq", &OnAssocReq}, - {WIFI_REASSOCRSP, "OnReAssocRsp", &OnAssocRsp}, - {WIFI_PROBEREQ, "OnProbeReq", &OnProbeReq}, - {WIFI_PROBERSP, "OnProbeRsp", &OnProbeRsp}, - - /*---------------------------------------------------------- - below 2 are reserved - -----------------------------------------------------------*/ - {0, "DoReserved", &DoReserved}, - {0, "DoReserved", &DoReserved}, - {WIFI_BEACON, "OnBeacon", &OnBeacon}, - {WIFI_ATIM, "OnATIM", &OnAtim}, - {WIFI_DISASSOC, "OnDisassoc", &OnDisassoc}, - {WIFI_AUTH, "OnAuth", &OnAuthClient}, - {WIFI_DEAUTH, "OnDeAuth", &OnDeAuth}, - {WIFI_ACTION, "OnAction", &OnAction}, -}; - -static struct action_handler OnAction_tbl[] = { - {RTW_WLAN_CATEGORY_SPECTRUM_MGMT, "ACTION_SPECTRUM_MGMT", on_action_spct}, - {RTW_WLAN_CATEGORY_QOS, "ACTION_QOS", &OnAction_qos}, - {RTW_WLAN_CATEGORY_DLS, "ACTION_DLS", &OnAction_dls}, - {RTW_WLAN_CATEGORY_BACK, "ACTION_BACK", &OnAction_back}, - {RTW_WLAN_CATEGORY_PUBLIC, "ACTION_PUBLIC", on_action_public}, - {RTW_WLAN_CATEGORY_RADIO_MEASUREMENT, "ACTION_RADIO_MEASUREMENT", &DoReserved}, - {RTW_WLAN_CATEGORY_FT, "ACTION_FT", &DoReserved}, - {RTW_WLAN_CATEGORY_HT, "ACTION_HT", &OnAction_ht}, - {RTW_WLAN_CATEGORY_SA_QUERY, "ACTION_SA_QUERY", &DoReserved}, - {RTW_WLAN_CATEGORY_WMM, "ACTION_WMM", &OnAction_wmm}, - {RTW_WLAN_CATEGORY_P2P, "ACTION_P2P", &OnAction_p2p}, +/* response function for each management frame subtype, do not reorder */ +static mlme_handler mlme_sta_tbl[] = { + OnAssocReq, + OnAssocRsp, + OnAssocReq, + OnAssocRsp, + OnProbeReq, + OnProbeRsp, + NULL, + NULL, + OnBeacon, + NULL, + OnDisassoc, + OnAuthClient, + OnDeAuth, + OnAction, }; static u8 null_addr[ETH_ALEN] = {0, 0, 0, 0, 0, 0}; @@ -71,7 +54,6 @@ extern unsigned char REALTEK_96B_IE[]; /******************************************************** MCS rate definitions *********************************************************/ -unsigned char MCS_rate_2R[16] = {0xff, 0xff, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; unsigned char MCS_rate_1R[16] = {0xff, 0x00, 0x0, 0x0, 0x01, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}; /******************************************************** @@ -287,11 +269,11 @@ static void init_channel_list(struct adapter *padapter, struct rt_channel_info * continue; } - if ((0 == padapter->registrypriv.ht_enable) && (8 == o->inc)) + if ((padapter->registrypriv.ht_enable == 0) && (o->inc == 8)) continue; - if ((0 == (padapter->registrypriv.cbw40_enable & BIT(1))) && - ((BW40MINUS == o->bw) || (BW40PLUS == o->bw))) + if (((padapter->registrypriv.cbw40_enable & BIT(1)) == 0) && + ((o->bw == BW40MINUS) || (o->bw == BW40PLUS))) continue; if (!reg) { @@ -320,7 +302,7 @@ static u8 init_channel_set(struct adapter *padapter, u8 ChannelPlan, struct rt_c if (padapter->registrypriv.wireless_mode & WIRELESS_11G) { b2_4GBand = true; - if (RT_CHANNEL_DOMAIN_REALTEK_DEFINE == ChannelPlan) + if (ChannelPlan == RT_CHANNEL_DOMAIN_REALTEK_DEFINE) Index2G = RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE.Index2G; else Index2G = RTW_ChannelPlanMap[ChannelPlan].Index2G; @@ -330,14 +312,14 @@ static u8 init_channel_set(struct adapter *padapter, u8 ChannelPlan, struct rt_c for (index = 0; index < RTW_ChannelPlan2G[Index2G].Len; index++) { channel_set[chanset_size].ChannelNum = RTW_ChannelPlan2G[Index2G].Channel[index]; - if ((RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN == ChannelPlan) ||/* Channel 1~11 is active, and 12~14 is passive */ - (RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN_2G == ChannelPlan)) { + if ((ChannelPlan == RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN) ||/* Channel 1~11 is active, and 12~14 is passive */ + (ChannelPlan == RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN_2G)) { if (channel_set[chanset_size].ChannelNum >= 1 && channel_set[chanset_size].ChannelNum <= 11) channel_set[chanset_size].ScanType = SCAN_ACTIVE; else if ((channel_set[chanset_size].ChannelNum >= 12 && channel_set[chanset_size].ChannelNum <= 14)) channel_set[chanset_size].ScanType = SCAN_PASSIVE; - } else if (RT_CHANNEL_DOMAIN_WORLD_WIDE_13 == ChannelPlan || - RT_CHANNEL_DOMAIN_2G_WORLD == Index2G) {/* channel 12~13, passive scan */ + } else if (ChannelPlan == RT_CHANNEL_DOMAIN_WORLD_WIDE_13 || + Index2G == RT_CHANNEL_DOMAIN_2G_WORLD) {/* channel 12~13, passive scan */ if (channel_set[chanset_size].ChannelNum <= 11) channel_set[chanset_size].ScanType = SCAN_ACTIVE; else @@ -352,9 +334,8 @@ static u8 init_channel_set(struct adapter *padapter, u8 ChannelPlan, struct rt_c return chanset_size; } -int init_mlme_ext_priv(struct adapter *padapter) +void init_mlme_ext_priv(struct adapter *padapter) { - int res = _SUCCESS; struct registry_priv *pregistrypriv = &padapter->registrypriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; @@ -376,8 +357,6 @@ int init_mlme_ext_priv(struct adapter *padapter) pmlmeext->mlmeext_init = true; pmlmeext->active_keep_alive_check = true; - - return res; } void free_mlme_ext_priv(struct mlme_ext_priv *pmlmeext) @@ -394,45 +373,29 @@ void free_mlme_ext_priv(struct mlme_ext_priv *pmlmeext) } } -static void _mgt_dispatcher(struct adapter *padapter, struct mlme_handler *ptable, struct recv_frame *precv_frame) -{ - u8 *pframe = precv_frame->rx_data; - - if (ptable->func) { - /* receive the frames that ra(a1) is my address or ra(a1) is bc address. */ - if (memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN) && - !is_broadcast_ether_addr(GetAddr1Ptr(pframe))) - return; - ptable->func(padapter, precv_frame); - } -} - void mgt_dispatcher(struct adapter *padapter, struct recv_frame *precv_frame) { int index; - struct mlme_handler *ptable; + mlme_handler fct; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 *pframe = precv_frame->rx_data; - struct sta_info *psta = rtw_get_stainfo(&padapter->stapriv, GetAddr2Ptr(pframe)); + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)precv_frame->rx_data; + struct sta_info *psta = rtw_get_stainfo(&padapter->stapriv, hdr->addr2); - if (GetFrameType(pframe) != IEEE80211_FTYPE_MGMT) + if (!ieee80211_is_mgmt(hdr->frame_control)) return; /* receive the frames that ra(a1) is my address or ra(a1) is bc address. */ - if (memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN) && - !is_broadcast_ether_addr(GetAddr1Ptr(pframe))) + if (memcmp(hdr->addr1, myid(&padapter->eeprompriv), ETH_ALEN) && + !is_broadcast_ether_addr(hdr->addr1)) return; - ptable = mlme_sta_tbl; - - index = GetFrameSubType(pframe) >> 4; - - if (index > 13) + index = (le16_to_cpu(hdr->frame_control) & IEEE80211_FCTL_STYPE) >> 4; + if (index >= ARRAY_SIZE(mlme_sta_tbl)) return; - ptable += index; + fct = mlme_sta_tbl[index]; if (psta) { - if (GetRetry(pframe)) { + if (ieee80211_has_retry(hdr->frame_control)) { if (precv_frame->attrib.seq_num == psta->RxMgmtFrameSeqNum) /* drop the duplicate management frame */ return; @@ -440,13 +403,15 @@ void mgt_dispatcher(struct adapter *padapter, struct recv_frame *precv_frame) psta->RxMgmtFrameSeqNum = precv_frame->attrib.seq_num; } - if (GetFrameSubType(pframe) == WIFI_AUTH) { + if (ieee80211_is_auth(hdr->frame_control)) { if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) - ptable->func = &OnAuth; + fct = OnAuth; else - ptable->func = &OnAuthClient; + fct = OnAuthClient; } - _mgt_dispatcher(padapter, ptable, precv_frame); + + if (fct) + fct(padapter, precv_frame); } static u32 p2p_listen_state_process(struct adapter *padapter, unsigned char *da) @@ -482,7 +447,6 @@ unsigned int OnProbeReq(struct adapter *padapter, struct recv_frame *precv_frame u8 is_valid_p2p_probereq = false; struct wifidirect_info *pwdinfo = &padapter->wdinfo; - u8 wifi_test_chk_rate = 1; if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE) && @@ -497,25 +461,18 @@ unsigned int OnProbeReq(struct adapter *padapter, struct recv_frame *precv_frame /* Commented by Kurt 2012/10/16 */ /* IOT issue: Google Nexus7 use 1M rate to send p2p_probe_req after GO nego completed and Nexus7 is client */ - if (wifi_test_chk_rate == 1) { - is_valid_p2p_probereq = process_probe_req_p2p_ie(pwdinfo, pframe, len); - if (is_valid_p2p_probereq) { - if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE)) { - /* FIXME */ - report_survey_event(padapter, precv_frame); - p2p_listen_state_process(padapter, get_sa(pframe)); - - return _SUCCESS; - } - - if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) - goto _continue; + is_valid_p2p_probereq = process_probe_req_p2p_ie(pwdinfo, pframe, len); + if (is_valid_p2p_probereq) { + if (rtw_p2p_chk_role(pwdinfo, P2P_ROLE_DEVICE)) { + /* FIXME */ + report_survey_event(padapter, precv_frame); + p2p_listen_state_process(padapter, get_sa(pframe)); + + return _SUCCESS; } } } -_continue: - if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) return _SUCCESS; @@ -622,7 +579,7 @@ unsigned int OnBeacon(struct adapter *padapter, struct recv_frame *precv_frame) } /* check the vendor of the assoc AP */ - pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pframe + sizeof(struct rtw_ieee80211_hdr_3addr), len - sizeof(struct rtw_ieee80211_hdr_3addr)); + pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pframe + sizeof(struct ieee80211_hdr_3addr), len - sizeof(struct ieee80211_hdr_3addr)); /* update TSF Value */ update_TSF(pmlmeext, pframe, len); @@ -988,7 +945,7 @@ unsigned int OnAssocReq(struct adapter *padapter, struct recv_frame *precv_frame status = _STATS_FAILURE_; } - if (_STATS_SUCCESSFUL_ != status) + if (status != _STATS_SUCCESSFUL_) goto OnAssocReqFail; /* check if the supported rate is ok */ @@ -1077,7 +1034,7 @@ unsigned int OnAssocReq(struct adapter *padapter, struct recv_frame *precv_frame wpa_ie_len = 0; } - if (_STATS_SUCCESSFUL_ != status) + if (status != _STATS_SUCCESSFUL_) goto OnAssocReqFail; pstat->flags &= ~(WLAN_STA_WPS | WLAN_STA_MAYBE_WPS); @@ -1272,7 +1229,7 @@ unsigned int OnAssocReq(struct adapter *padapter, struct recv_frame *precv_frame spin_unlock_bh(&pstapriv->asoc_list_lock); /* now the station is qualified to join our BSS... */ - if (pstat && (pstat->state & WIFI_FW_ASSOC_SUCCESS) && (_STATS_SUCCESSFUL_ == status)) { + if (pstat && (pstat->state & WIFI_FW_ASSOC_SUCCESS) && (status == _STATS_SUCCESSFUL_)) { /* 1 bss_cap_update & sta_info_update */ bss_cap_update_on_sta_join(padapter, pstat); sta_info_update(padapter, pstat); @@ -1315,7 +1272,6 @@ unsigned int OnAssocRsp(struct adapter *padapter, struct recv_frame *precv_frame int res; unsigned short status; struct ndis_802_11_var_ie *pIE; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; /* struct wlan_bssid_ex *cur_network = &(pmlmeinfo->network); */ @@ -1386,11 +1342,6 @@ unsigned int OnAssocRsp(struct adapter *padapter, struct recv_frame *precv_frame UpdateBrateTbl(padapter, pmlmeinfo->network.SupportedRates); report_assoc_result: - if (res > 0) - rtw_buf_update(&pmlmepriv->assoc_rsp, &pmlmepriv->assoc_rsp_len, pframe, pkt_len); - else - kfree(pmlmepriv->assoc_rsp); - report_join_res(padapter, res); return _SUCCESS; @@ -1448,7 +1399,7 @@ unsigned int OnDeAuth(struct adapter *padapter, struct recv_frame *precv_frame) (pmlmeinfo->state & WIFI_FW_ASSOC_STATE)) { if (reason == WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA) { ignore_received_deauth = 1; - } else if (WLAN_REASON_PREV_AUTH_NOT_VALID == reason) { + } else if (reason == WLAN_REASON_PREV_AUTH_NOT_VALID) { // TODO: 802.11r ignore_received_deauth = 1; } @@ -1508,126 +1459,76 @@ unsigned int OnDisassoc(struct adapter *padapter, struct recv_frame *precv_frame return _SUCCESS; } -unsigned int OnAtim(struct adapter *padapter, struct recv_frame *precv_frame) -{ - return _SUCCESS; -} - -unsigned int on_action_spct(struct adapter *padapter, struct recv_frame *precv_frame) -{ - unsigned int ret = _FAIL; - struct sta_info *psta = NULL; - struct sta_priv *pstapriv = &padapter->stapriv; - u8 *pframe = precv_frame->rx_data; - u8 *frame_body = (u8 *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); - u8 category; - u8 action; - - psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); - - if (!psta) - goto exit; - - category = frame_body[0]; - if (category != RTW_WLAN_CATEGORY_SPECTRUM_MGMT) - goto exit; - - action = frame_body[1]; - switch (action) { - case RTW_WLAN_ACTION_SPCT_MSR_REQ: - case RTW_WLAN_ACTION_SPCT_MSR_RPRT: - case RTW_WLAN_ACTION_SPCT_TPC_REQ: - case RTW_WLAN_ACTION_SPCT_TPC_RPRT: - break; - case RTW_WLAN_ACTION_SPCT_CHL_SWITCH: - break; - default: - break; - } - -exit: - return ret; -} - -unsigned int OnAction_qos(struct adapter *padapter, struct recv_frame *precv_frame) -{ - return _SUCCESS; -} - -unsigned int OnAction_dls(struct adapter *padapter, struct recv_frame *precv_frame) -{ - return _SUCCESS; -} - unsigned int OnAction_back(struct adapter *padapter, struct recv_frame *precv_frame) { - u8 *addr; + struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)precv_frame->rx_data; struct sta_info *psta = NULL; struct recv_reorder_ctrl *preorder_ctrl; unsigned char *frame_body; - unsigned char category, action; - unsigned short tid, status; + unsigned short tid; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; u8 *pframe = precv_frame->rx_data; struct sta_priv *pstapriv = &padapter->stapriv; /* check RA matches or not */ - if (memcmp(myid(&padapter->eeprompriv), GetAddr1Ptr(pframe), ETH_ALEN))/* for if1, sta/ap mode */ + if (memcmp(myid(&padapter->eeprompriv), mgmt->da, ETH_ALEN))/* for if1, sta/ap mode */ return _SUCCESS; if ((pmlmeinfo->state & 0x03) != WIFI_FW_AP_STATE) if (!(pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS)) return _SUCCESS; - addr = GetAddr2Ptr(pframe); - psta = rtw_get_stainfo(pstapriv, addr); + psta = rtw_get_stainfo(pstapriv, mgmt->sa); if (!psta) return _SUCCESS; - frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); + frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); - category = frame_body[0]; - if (category == RTW_WLAN_CATEGORY_BACK) { /* representing Block Ack */ - if (!pmlmeinfo->HT_enable) - return _SUCCESS; - action = frame_body[1]; - switch (action) { - case RTW_WLAN_ACTION_ADDBA_REQ: /* ADDBA request */ - memcpy(&pmlmeinfo->ADDBA_req, &frame_body[2], sizeof(struct ADDBA_request)); - process_addba_req(padapter, (u8 *)&pmlmeinfo->ADDBA_req, addr); - - if (pmlmeinfo->bAcceptAddbaReq) - issue_action_BA(padapter, addr, RTW_WLAN_ACTION_ADDBA_RESP, 0); - else - issue_action_BA(padapter, addr, RTW_WLAN_ACTION_ADDBA_RESP, 37);/* reject ADDBA Req */ - break; - case RTW_WLAN_ACTION_ADDBA_RESP: /* ADDBA response */ - status = get_unaligned_le16(&frame_body[3]); - tid = ((frame_body[5] >> 2) & 0x7); - if (status == 0) { /* successful */ - psta->htpriv.agg_enable_bitmap |= 1 << tid; - psta->htpriv.candidate_tid_bitmap &= ~BIT(tid); - } else { - psta->htpriv.agg_enable_bitmap &= ~BIT(tid); - } - break; - case RTW_WLAN_ACTION_DELBA: /* DELBA */ - if ((frame_body[3] & BIT(3)) == 0) { - psta->htpriv.agg_enable_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf)); - psta->htpriv.candidate_tid_bitmap &= ~(1 << ((frame_body[3] >> 4) & 0xf)); - } else if ((frame_body[3] & BIT(3)) == BIT(3)) { - tid = (frame_body[3] >> 4) & 0x0F; - preorder_ctrl = &psta->recvreorder_ctrl[tid]; - preorder_ctrl->enable = false; - preorder_ctrl->indicate_seq = 0xffff; - } - /* todo: how to notify the host while receiving DELETE BA */ - break; - default: - break; + if (!pmlmeinfo->HT_enable) + return _SUCCESS; + /* All union members start with an action code, it's ok to use addba_req. */ + switch (mgmt->u.action.u.addba_req.action_code) { + case WLAN_ACTION_ADDBA_REQ: + memcpy(&pmlmeinfo->ADDBA_req, &frame_body[2], sizeof(struct ADDBA_request)); + tid = u16_get_bits(le16_to_cpu(mgmt->u.action.u.addba_req.capab), + IEEE80211_ADDBA_PARAM_TID_MASK); + preorder_ctrl = &psta->recvreorder_ctrl[tid]; + preorder_ctrl->indicate_seq = 0xffff; + preorder_ctrl->enable = pmlmeinfo->bAcceptAddbaReq; + + issue_action_BA(padapter, mgmt->sa, WLAN_ACTION_ADDBA_RESP, + pmlmeinfo->bAcceptAddbaReq ? + WLAN_STATUS_SUCCESS : WLAN_STATUS_REQUEST_DECLINED); + break; + case WLAN_ACTION_ADDBA_RESP: + tid = u16_get_bits(le16_to_cpu(mgmt->u.action.u.addba_resp.capab), + IEEE80211_ADDBA_PARAM_TID_MASK); + if (mgmt->u.action.u.addba_resp.status == 0) { /* successful */ + psta->htpriv.agg_enable_bitmap |= BIT(tid); + psta->htpriv.candidate_tid_bitmap &= ~BIT(tid); + } else { + psta->htpriv.agg_enable_bitmap &= ~BIT(tid); + } + break; + case WLAN_ACTION_DELBA: + tid = u16_get_bits(le16_to_cpu(mgmt->u.action.u.delba.params), + IEEE80211_DELBA_PARAM_TID_MASK); + if (u16_get_bits(le16_to_cpu(mgmt->u.action.u.delba.params), + IEEE80211_DELBA_PARAM_INITIATOR_MASK) == WLAN_BACK_RECIPIENT) { + psta->htpriv.agg_enable_bitmap &= ~BIT(tid); + psta->htpriv.candidate_tid_bitmap &= ~BIT(tid); + } else { + preorder_ctrl = &psta->recvreorder_ctrl[tid]; + preorder_ctrl->enable = false; + preorder_ctrl->indicate_seq = 0xffff; } + /* todo: how to notify the host while receiving DELETE BA */ + break; + default: + break; } + return _SUCCESS; } @@ -1645,7 +1546,7 @@ static int get_reg_classes_full_count(struct p2p_channels *channel_list) void issue_p2p_GO_request(struct adapter *padapter, u8 *raddr) { - unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; + unsigned char category = WLAN_CATEGORY_PUBLIC; u8 action = P2P_PUB_ACTION_ACTION; __be32 p2poui = cpu_to_be32(P2POUI); u8 oui_subtype = P2P_GO_NEGO_REQ; @@ -1655,7 +1556,7 @@ void issue_p2p_GO_request(struct adapter *padapter, u8 *raddr) struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; @@ -1672,9 +1573,9 @@ void issue_p2p_GO_request(struct adapter *padapter, u8 *raddr) memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); @@ -1685,8 +1586,8 @@ void issue_p2p_GO_request(struct adapter *padapter, u8 *raddr) pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_ACTION); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); @@ -1975,7 +1876,7 @@ void issue_p2p_GO_request(struct adapter *padapter, u8 *raddr) static void issue_p2p_GO_response(struct adapter *padapter, u8 *raddr, u8 *frame_body, uint len, u8 result) { - unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; + unsigned char category = WLAN_CATEGORY_PUBLIC; u8 action = P2P_PUB_ACTION_ACTION; __be32 p2poui = cpu_to_be32(P2POUI); u8 oui_subtype = P2P_GO_NEGO_RESP; @@ -1990,7 +1891,7 @@ static void issue_p2p_GO_response(struct adapter *padapter, u8 *raddr, u8 *frame struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; @@ -2007,9 +1908,9 @@ static void issue_p2p_GO_response(struct adapter *padapter, u8 *raddr, u8 *frame memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); @@ -2020,8 +1921,8 @@ static void issue_p2p_GO_response(struct adapter *padapter, u8 *raddr, u8 *frame pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_ACTION); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); @@ -2337,7 +2238,7 @@ static void issue_p2p_GO_response(struct adapter *padapter, u8 *raddr, u8 *frame static void issue_p2p_GO_confirm(struct adapter *padapter, u8 *raddr, u8 result) { - unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; + unsigned char category = WLAN_CATEGORY_PUBLIC; u8 action = P2P_PUB_ACTION_ACTION; __be32 p2poui = cpu_to_be32(P2POUI); u8 oui_subtype = P2P_GO_NEGO_CONF; @@ -2347,7 +2248,7 @@ static void issue_p2p_GO_confirm(struct adapter *padapter, u8 *raddr, u8 result) struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; @@ -2364,9 +2265,9 @@ static void issue_p2p_GO_confirm(struct adapter *padapter, u8 *raddr, u8 result) memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); @@ -2377,8 +2278,8 @@ static void issue_p2p_GO_confirm(struct adapter *padapter, u8 *raddr, u8 result) pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_ACTION); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); @@ -2498,7 +2399,7 @@ static void issue_p2p_GO_confirm(struct adapter *padapter, u8 *raddr, u8 result) void issue_p2p_invitation_request(struct adapter *padapter, u8 *raddr) { - unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; + unsigned char category = WLAN_CATEGORY_PUBLIC; u8 action = P2P_PUB_ACTION_ACTION; __be32 p2poui = cpu_to_be32(P2POUI); u8 oui_subtype = P2P_INVIT_REQ; @@ -2509,7 +2410,7 @@ void issue_p2p_invitation_request(struct adapter *padapter, u8 *raddr) struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; @@ -2526,9 +2427,9 @@ void issue_p2p_invitation_request(struct adapter *padapter, u8 *raddr) memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); @@ -2539,8 +2440,8 @@ void issue_p2p_invitation_request(struct adapter *padapter, u8 *raddr) pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_ACTION); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); @@ -2745,7 +2646,7 @@ void issue_p2p_invitation_request(struct adapter *padapter, u8 *raddr) void issue_p2p_invitation_response(struct adapter *padapter, u8 *raddr, u8 dialogToken, u8 status_code) { - unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; + unsigned char category = WLAN_CATEGORY_PUBLIC; u8 action = P2P_PUB_ACTION_ACTION; __be32 p2poui = cpu_to_be32(P2POUI); u8 oui_subtype = P2P_INVIT_RESP; @@ -2755,7 +2656,7 @@ void issue_p2p_invitation_response(struct adapter *padapter, u8 *raddr, u8 dialo struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; @@ -2772,9 +2673,9 @@ void issue_p2p_invitation_response(struct adapter *padapter, u8 *raddr, u8 dialo memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); @@ -2785,8 +2686,8 @@ void issue_p2p_invitation_response(struct adapter *padapter, u8 *raddr, u8 dialo pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_ACTION); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); @@ -2935,7 +2836,7 @@ void issue_p2p_invitation_response(struct adapter *padapter, u8 *raddr, u8 dialo void issue_p2p_provision_request(struct adapter *padapter, u8 *pssid, u8 ussidlen, u8 *pdev_raddr) { - unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; + unsigned char category = WLAN_CATEGORY_PUBLIC; u8 action = P2P_PUB_ACTION_ACTION; u8 dialogToken = 1; u8 oui_subtype = P2P_PROVISION_DISC_REQ; @@ -2946,7 +2847,7 @@ void issue_p2p_provision_request(struct adapter *padapter, u8 *pssid, u8 ussidle struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; @@ -2963,9 +2864,9 @@ void issue_p2p_provision_request(struct adapter *padapter, u8 *pssid, u8 ussidle memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; memcpy(pwlanhdr->addr1, pdev_raddr, ETH_ALEN); @@ -2976,8 +2877,8 @@ void issue_p2p_provision_request(struct adapter *padapter, u8 *pssid, u8 ussidle pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_ACTION); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); @@ -3045,7 +2946,7 @@ void issue_probersp_p2p(struct adapter *padapter, unsigned char *da) struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; unsigned char *mac; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; @@ -3067,11 +2968,11 @@ void issue_probersp_p2p(struct adapter *padapter, unsigned char *da) memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; mac = myid(&padapter->eeprompriv); - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; memcpy(pwlanhdr->addr1, da, ETH_ALEN); memcpy(pwlanhdr->addr2, mac, ETH_ALEN); @@ -3083,7 +2984,7 @@ void issue_probersp_p2p(struct adapter *padapter, unsigned char *da) pmlmeext->mgnt_seq++; SetFrameSubType(fctrl, WIFI_PROBERSP); - pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr); pattrib->pktlen = pattrib->hdrlen; pframe += pattrib->hdrlen; @@ -3291,7 +3192,7 @@ static int _issue_probereq_p2p(struct adapter *padapter, u8 *da, int wait_ack) struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; unsigned char *mac; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; @@ -3312,11 +3213,11 @@ static int _issue_probereq_p2p(struct adapter *padapter, u8 *da, int wait_ack) memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; mac = myid(&padapter->eeprompriv); - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; if (da) { @@ -3339,8 +3240,8 @@ static int _issue_probereq_p2p(struct adapter *padapter, u8 *da, int wait_ack) pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_PROBEREQ); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_TX_PROVISION_DIS_REQ)) pframe = rtw_set_ie(pframe, _SSID_IE_, pwdinfo->tx_prov_disc_info.ssid.SsidLength, pwdinfo->tx_prov_disc_info.ssid.Ssid, &pattrib->pktlen); @@ -3614,7 +3515,7 @@ static unsigned int on_action_public_p2p(struct recv_frame *precv_frame) u8 result = P2P_STATUS_SUCCESS; u8 empty_addr[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); + frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); dialogToken = frame_body[7]; @@ -3626,7 +3527,7 @@ static unsigned int on_action_public_p2p(struct recv_frame *precv_frame) if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) || rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) return _SUCCESS; - len -= sizeof(struct rtw_ieee80211_hdr_3addr); + len -= sizeof(struct ieee80211_hdr_3addr); switch (frame_body[6]) { /* OUI Subtype */ case P2P_GO_NEGO_REQ: @@ -3668,7 +3569,7 @@ static unsigned int on_action_public_p2p(struct recv_frame *precv_frame) pwdinfo->nego_req_info.benable = false; result = process_p2p_group_negotation_resp(pwdinfo, frame_body, len); issue_p2p_GO_confirm(pwdinfo->padapter, GetAddr2Ptr(pframe), result); - if (P2P_STATUS_SUCCESS == result) { + if (result == P2P_STATUS_SUCCESS) { if (rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT) { pwdinfo->p2p_info.operation_ch[0] = pwdinfo->peer_operating_ch; pwdinfo->p2p_info.scan_op_ch_only = 1; @@ -3683,7 +3584,7 @@ static unsigned int on_action_public_p2p(struct recv_frame *precv_frame) break; case P2P_GO_NEGO_CONF: result = process_p2p_group_negotation_confirm(pwdinfo, frame_body, len); - if (P2P_STATUS_SUCCESS == result) { + if (result == P2P_STATUS_SUCCESS) { if (rtw_p2p_role(pwdinfo) == P2P_ROLE_CLIENT) { pwdinfo->p2p_info.operation_ch[0] = pwdinfo->peer_operating_ch; pwdinfo->p2p_info.scan_op_ch_only = 1; @@ -3867,7 +3768,7 @@ static unsigned int on_action_public_vendor(struct recv_frame *precv_frame) { unsigned int ret = _FAIL; u8 *pframe = precv_frame->rx_data; - u8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr); + u8 *frame_body = pframe + sizeof(struct ieee80211_hdr_3addr); if (!memcmp(frame_body + 2, P2P_OUI, 4)) { ret = on_action_public_p2p(precv_frame); @@ -3880,7 +3781,7 @@ static unsigned int on_action_public_default(struct recv_frame *precv_frame) { unsigned int ret = _FAIL; u8 *pframe = precv_frame->rx_data; - u8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr); + u8 *frame_body = pframe + sizeof(struct ieee80211_hdr_3addr); u8 token; token = frame_body[2]; @@ -3898,7 +3799,7 @@ unsigned int on_action_public(struct adapter *padapter, struct recv_frame *precv { unsigned int ret = _FAIL; u8 *pframe = precv_frame->rx_data; - u8 *frame_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr); + u8 *frame_body = pframe + sizeof(struct ieee80211_hdr_3addr); u8 category, action; /* check RA matches or not */ @@ -3906,7 +3807,7 @@ unsigned int on_action_public(struct adapter *padapter, struct recv_frame *precv goto exit; category = frame_body[0]; - if (category != RTW_WLAN_CATEGORY_PUBLIC) + if (category != WLAN_CATEGORY_PUBLIC) goto exit; action = frame_body[1]; @@ -3923,16 +3824,6 @@ exit: return ret; } -unsigned int OnAction_ht(struct adapter *padapter, struct recv_frame *precv_frame) -{ - return _SUCCESS; -} - -unsigned int OnAction_wmm(struct adapter *padapter, struct recv_frame *precv_frame) -{ - return _SUCCESS; -} - unsigned int OnAction_p2p(struct adapter *padapter, struct recv_frame *precv_frame) { u8 *frame_body; @@ -3945,7 +3836,7 @@ unsigned int OnAction_p2p(struct adapter *padapter, struct recv_frame *precv_fra if (memcmp(myid(&padapter->eeprompriv), GetAddr1Ptr(pframe), ETH_ALEN))/* for if1, sta/ap mode */ return _SUCCESS; - frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); + frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); category = frame_body[0]; if (category != RTW_WLAN_CATEGORY_P2P) @@ -3954,7 +3845,7 @@ unsigned int OnAction_p2p(struct adapter *padapter, struct recv_frame *precv_fra if (be32_to_cpu(*((__be32 *)(frame_body + 1))) != P2POUI) return _SUCCESS; - len -= sizeof(struct rtw_ieee80211_hdr_3addr); + len -= sizeof(struct ieee80211_hdr_3addr); OUI_Subtype = frame_body[5]; switch (OUI_Subtype) { @@ -3975,29 +3866,22 @@ unsigned int OnAction_p2p(struct adapter *padapter, struct recv_frame *precv_fra unsigned int OnAction(struct adapter *padapter, struct recv_frame *precv_frame) { - int i; - unsigned char category; - struct action_handler *ptable; - unsigned char *frame_body; - u8 *pframe = precv_frame->rx_data; - - frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); + struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)precv_frame->rx_data; - category = frame_body[0]; - - for (i = 0; i < sizeof(OnAction_tbl) / sizeof(struct action_handler); i++) { - ptable = &OnAction_tbl[i]; - if (category == ptable->num) - ptable->func(padapter, precv_frame); + switch (mgmt->u.action.category) { + case WLAN_CATEGORY_BACK: + OnAction_back(padapter, precv_frame); + break; + case WLAN_CATEGORY_PUBLIC: + on_action_public(padapter, precv_frame); + break; + case RTW_WLAN_CATEGORY_P2P: + OnAction_p2p(padapter, precv_frame); + break; } return _SUCCESS; } -unsigned int DoReserved(struct adapter *padapter, struct recv_frame *precv_frame) -{ - return _SUCCESS; -} - struct xmit_frame *alloc_mgtxmitframe(struct xmit_priv *pxmitpriv) { struct xmit_frame *pmgntframe; @@ -4154,7 +4038,7 @@ void issue_beacon(struct adapter *padapter, int timeout_ms) struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; unsigned int rate_len; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; @@ -4177,9 +4061,9 @@ void issue_beacon(struct adapter *padapter, int timeout_ms) memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; eth_broadcast_addr(pwlanhdr->addr1); @@ -4190,8 +4074,8 @@ void issue_beacon(struct adapter *padapter, int timeout_ms) /* pmlmeext->mgnt_seq++; */ SetFrameSubType(pframe, WIFI_BEACON); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) { /* for P2P : Primary Device Type & Device Name */ @@ -4274,8 +4158,8 @@ void issue_beacon(struct adapter *padapter, int timeout_ms) u8 *wps_ie; uint wps_ielen; u8 sr = 0; - wps_ie = rtw_get_wps_ie(pmgntframe->buf_addr + TXDESC_OFFSET + sizeof(struct rtw_ieee80211_hdr_3addr) + _BEACON_IE_OFFSET_, - pattrib->pktlen - sizeof(struct rtw_ieee80211_hdr_3addr) - _BEACON_IE_OFFSET_, NULL, &wps_ielen); + wps_ie = rtw_get_wps_ie(pmgntframe->buf_addr + TXDESC_OFFSET + sizeof(struct ieee80211_hdr_3addr) + _BEACON_IE_OFFSET_, + pattrib->pktlen - sizeof(struct ieee80211_hdr_3addr) - _BEACON_IE_OFFSET_, NULL, &wps_ielen); if (wps_ie && wps_ielen > 0) rtw_get_wps_attr_content(wps_ie, wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8 *)(&sr), NULL); if (sr != 0) @@ -4362,7 +4246,7 @@ void issue_probersp(struct adapter *padapter, unsigned char *da, u8 is_valid_p2p struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; unsigned char *mac, *bssid; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; @@ -4386,12 +4270,12 @@ void issue_probersp(struct adapter *padapter, unsigned char *da, u8 is_valid_p2p memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; mac = myid(&padapter->eeprompriv); bssid = cur_network->MacAddress; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; memcpy(pwlanhdr->addr1, da, ETH_ALEN); memcpy(pwlanhdr->addr2, mac, ETH_ALEN); @@ -4401,7 +4285,7 @@ void issue_probersp(struct adapter *padapter, unsigned char *da, u8 is_valid_p2p pmlmeext->mgnt_seq++; SetFrameSubType(fctrl, WIFI_PROBERSP); - pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr); pattrib->pktlen = pattrib->hdrlen; pframe += pattrib->hdrlen; @@ -4511,7 +4395,7 @@ static int _issue_probereq(struct adapter *padapter, struct ndis_802_11_ssid *ps struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; unsigned char *mac; unsigned char bssrate[NumRates]; @@ -4531,11 +4415,11 @@ static int _issue_probereq(struct adapter *padapter, struct ndis_802_11_ssid *ps memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; mac = myid(&padapter->eeprompriv); - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; if (da) { @@ -4554,8 +4438,8 @@ static int _issue_probereq(struct adapter *padapter, struct ndis_802_11_ssid *ps pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_PROBEREQ); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); if (pssid) pframe = rtw_set_ie(pframe, _SSID_IE_, pssid->SsidLength, pssid->Ssid, &pattrib->pktlen); @@ -4629,7 +4513,7 @@ void issue_auth(struct adapter *padapter, struct sta_info *psta, unsigned short struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; unsigned int val32; u16 val16; @@ -4650,17 +4534,17 @@ void issue_auth(struct adapter *padapter, struct sta_info *psta, unsigned short memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_AUTH); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); if (psta) {/* for AP mode */ memcpy(pwlanhdr->addr1, psta->hwaddr, ETH_ALEN); @@ -4734,7 +4618,7 @@ void issue_auth(struct adapter *padapter, struct sta_info *psta, unsigned short SetPrivacy(fctrl); - pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr); pattrib->encrypt = _WEP40_; @@ -4753,7 +4637,7 @@ void issue_auth(struct adapter *padapter, struct sta_info *psta, unsigned short void issue_asocrsp(struct adapter *padapter, unsigned short status, struct sta_info *pstat, int pkt_type) { struct xmit_frame *pmgntframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; struct pkt_attrib *pattrib; unsigned char *pbuf, *pframe; unsigned short val; @@ -4778,9 +4662,9 @@ void issue_asocrsp(struct adapter *padapter, unsigned short status, struct sta_i memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; memcpy((void *)GetAddr1Ptr(pwlanhdr), pstat->hwaddr, ETH_ALEN); @@ -4794,7 +4678,7 @@ void issue_asocrsp(struct adapter *padapter, unsigned short status, struct sta_i else return; - pattrib->hdrlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr); pattrib->pktlen += pattrib->hdrlen; pframe += pattrib->hdrlen; @@ -4884,7 +4768,7 @@ void issue_assocreq(struct adapter *padapter) struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe, *p; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; __le16 le_tmp; unsigned int i, j, ie_len, index = 0; @@ -4910,9 +4794,9 @@ void issue_assocreq(struct adapter *padapter) memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; memcpy(pwlanhdr->addr1, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); @@ -4922,8 +4806,8 @@ void issue_assocreq(struct adapter *padapter) pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_ASSOCREQ); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); /* caps */ @@ -5184,7 +5068,7 @@ static int _issue_nulldata(struct adapter *padapter, unsigned char *da, unsigned struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; struct xmit_priv *pxmitpriv; struct mlme_ext_priv *pmlmeext; @@ -5209,9 +5093,9 @@ static int _issue_nulldata(struct adapter *padapter, unsigned char *da, unsigned memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) @@ -5230,8 +5114,8 @@ static int _issue_nulldata(struct adapter *padapter, unsigned char *da, unsigned pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_DATA_NULL); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); pattrib->last_txcmdsz = pattrib->pktlen; @@ -5286,7 +5170,7 @@ static int _issue_qos_nulldata(struct adapter *padapter, unsigned char *da, u16 struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; unsigned short *qc; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; @@ -5310,9 +5194,9 @@ static int _issue_qos_nulldata(struct adapter *padapter, unsigned char *da, u16 memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) @@ -5336,8 +5220,8 @@ static int _issue_qos_nulldata(struct adapter *padapter, unsigned char *da, u16 pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_QOS_DATA_NULL); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr_qos); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos); + pframe += sizeof(struct ieee80211_qos_hdr); + pattrib->pktlen = sizeof(struct ieee80211_qos_hdr); pattrib->last_txcmdsz = pattrib->pktlen; @@ -5390,7 +5274,7 @@ static int _issue_deauth(struct adapter *padapter, unsigned char *da, unsigned s struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; @@ -5416,9 +5300,9 @@ static int _issue_deauth(struct adapter *padapter, unsigned char *da, unsigned s memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; memcpy(pwlanhdr->addr1, da, ETH_ALEN); @@ -5429,8 +5313,8 @@ static int _issue_deauth(struct adapter *padapter, unsigned char *da, unsigned s pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_DEAUTH); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); le_tmp = cpu_to_le16(reason); pframe = rtw_set_fixed_ie(pframe, _RSON_CODE_, (unsigned char *)&le_tmp, &pattrib->pktlen); @@ -5481,7 +5365,7 @@ exit: void issue_action_BA(struct adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short status) { - u8 category = RTW_WLAN_CATEGORY_BACK; + u8 category = WLAN_CATEGORY_BACK; u16 start_seq; u16 BA_para_set; u16 reason_code; @@ -5491,7 +5375,7 @@ void issue_action_BA(struct adapter *padapter, unsigned char *raddr, unsigned ch struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; u8 *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; @@ -5511,9 +5395,9 @@ void issue_action_BA(struct adapter *padapter, unsigned char *raddr, unsigned ch memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; /* memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); */ @@ -5525,8 +5409,8 @@ void issue_action_BA(struct adapter *padapter, unsigned char *raddr, unsigned ch pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_ACTION); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); pframe = rtw_set_fixed_ie(pframe, 1, &(category), &pattrib->pktlen); pframe = rtw_set_fixed_ie(pframe, 1, &(action), &pattrib->pktlen); @@ -5599,7 +5483,7 @@ static void issue_action_BSSCoexistPacket(struct adapter *padapter) struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; struct wlan_network *pnetwork = NULL; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; @@ -5615,7 +5499,7 @@ static void issue_action_BSSCoexistPacket(struct adapter *padapter) if (pmlmeinfo->bwmode_updated) return; - category = RTW_WLAN_CATEGORY_PUBLIC; + category = WLAN_CATEGORY_PUBLIC; action = ACT_PUBLIC_BSSCOEXIST; pmgntframe = alloc_mgtxmitframe(pxmitpriv); @@ -5629,9 +5513,9 @@ static void issue_action_BSSCoexistPacket(struct adapter *padapter) memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; memcpy(pwlanhdr->addr1, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); @@ -5642,8 +5526,8 @@ static void issue_action_BSSCoexistPacket(struct adapter *padapter) pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_ACTION); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); @@ -5759,32 +5643,38 @@ unsigned int send_delba(struct adapter *padapter, u8 initiator, u8 *addr) unsigned int send_beacon(struct adapter *padapter) { - u8 bxmitok = false; + bool bxmitok = false; int issue = 0; int poll = 0; - u32 start = jiffies; + clear_beacon_valid_bit(padapter); - SetHwReg8188EU(padapter, HW_VAR_BCN_VALID, NULL); do { issue_beacon(padapter, 100); issue++; do { yield(); - GetHwReg8188EU(padapter, HW_VAR_BCN_VALID, (u8 *)(&bxmitok)); + bxmitok = get_beacon_valid_bit(padapter); poll++; } while ((poll % 10) != 0 && !bxmitok && !padapter->bSurpriseRemoved && !padapter->bDriverStopped); } while (!bxmitok && issue < 100 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped); - if (padapter->bSurpriseRemoved || padapter->bDriverStopped) - return _FAIL; - if (!bxmitok) { + if (padapter->bSurpriseRemoved || padapter->bDriverStopped || !bxmitok) return _FAIL; - } else { - rtw_get_passing_time_ms(start); - return _SUCCESS; - } + return _SUCCESS; +} + +bool get_beacon_valid_bit(struct adapter *adapter) +{ + /* BIT(16) of REG_TDECTRL = BIT(0) of REG_TDECTRL+2 */ + return BIT(0) & rtw_read8(adapter, REG_TDECTRL + 2); +} + +void clear_beacon_valid_bit(struct adapter *adapter) +{ + /* BIT(16) of REG_TDECTRL = BIT(0) of REG_TDECTRL+2, write 1 to clear, Clear by sw */ + rtw_write8(adapter, REG_TDECTRL + 2, rtw_read8(adapter, REG_TDECTRL + 2) | BIT(0)); } /**************************************************************************** @@ -5793,13 +5683,27 @@ Following are some utitity fuctions for WiFi MLME *****************************************************************************/ +static void rtw_set_initial_gain(struct adapter *adapter, u8 gain) +{ + struct hal_data_8188e *haldata = &adapter->haldata; + struct odm_dm_struct *odmpriv = &haldata->odmpriv; + struct rtw_dig *digtable = &odmpriv->DM_DigTable; + + if (gain == 0xff) { + /* restore rx gain */ + ODM_Write_DIG(odmpriv, digtable->BackupIGValue); + } else { + digtable->BackupIGValue = digtable->CurIGValue; + ODM_Write_DIG(odmpriv, gain); + } +} + void site_survey(struct adapter *padapter) { unsigned char survey_channel = 0, val8; enum rt_scan_type ScanType = SCAN_PASSIVE; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - u32 initialgain = 0; struct wifidirect_info *pwdinfo = &padapter->wdinfo; if ((pwdinfo->rx_invitereq_info.scan_op_ch_only) || (pwdinfo->p2p_info.scan_op_ch_only)) { @@ -5877,8 +5781,8 @@ void site_survey(struct adapter *padapter) rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_LISTEN); pmlmeext->sitesurvey_res.state = SCAN_DISABLE; - initialgain = 0xff; /* restore RX GAIN */ - SetHwReg8188EU(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); + /* restore RX GAIN */ + rtw_set_initial_gain(padapter, 0xff); /* turn on dynamic functions */ Restore_DM_Func_Flag(padapter); /* Switch_DM_Func(padapter, DYNAMIC_FUNC_DIG|DYNAMIC_FUNC_HP|DYNAMIC_FUNC_SS, true); */ @@ -5911,8 +5815,8 @@ void site_survey(struct adapter *padapter) /* config MSR */ Set_MSR(padapter, (pmlmeinfo->state & 0x3)); - initialgain = 0xff; /* restore RX GAIN */ - SetHwReg8188EU(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); + /* restore RX GAIN */ + rtw_set_initial_gain(padapter, 0xff); /* turn on dynamic functions */ Restore_DM_Func_Flag(padapter); /* Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, true); */ @@ -5950,7 +5854,7 @@ u8 collect_bss_info(struct adapter *padapter, struct recv_frame *precv_frame, st struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; __le32 le32_tmp; - len = packet_len - sizeof(struct rtw_ieee80211_hdr_3addr); + len = packet_len - sizeof(struct ieee80211_hdr_3addr); if (len > MAX_IE_SZ) return _FAIL; @@ -5980,13 +5884,13 @@ u8 collect_bss_info(struct adapter *padapter, struct recv_frame *precv_frame, st /* below is to copy the information element */ bssid->IELength = len; - memcpy(bssid->IEs, (pframe + sizeof(struct rtw_ieee80211_hdr_3addr)), bssid->IELength); + memcpy(bssid->IEs, (pframe + sizeof(struct ieee80211_hdr_3addr)), bssid->IELength); /* get the signal strength */ bssid->Rssi = precv_frame->attrib.phy_info.recvpower; /* in dBM.raw data */ bssid->PhyInfo.SignalQuality = precv_frame->attrib.phy_info.SignalQuality;/* in percentage */ bssid->PhyInfo.SignalStrength = precv_frame->attrib.phy_info.SignalStrength;/* in percentage */ - GetHalDefVar8188EUsb(padapter, HAL_DEF_CURRENT_ANTENNA, &bssid->PhyInfo.Optimum_antenna); + bssid->PhyInfo.Optimum_antenna = rtw_current_antenna(padapter); /* checking SSID */ p = rtw_get_ie(bssid->IEs + ie_offset, _SSID_IE_, &len, bssid->IELength - ie_offset); @@ -6087,10 +5991,58 @@ u8 collect_bss_info(struct adapter *padapter, struct recv_frame *precv_frame, st return _SUCCESS; } +static void rtw_set_bssid(struct adapter *adapter, u8 *bssid) +{ + int i; + + for (i = 0; i < ETH_ALEN; i++) + rtw_write8(adapter, REG_BSSID + i, bssid[i]); +} + +static void mlme_join(struct adapter *adapter, int type) +{ + struct mlme_priv *mlmepriv = &adapter->mlmepriv; + u8 retry_limit = 0x30; + + switch (type) { + case 0: + /* prepare to join */ + /* enable to rx data frame, accept all data frame */ + rtw_write16(adapter, REG_RXFLTMAP2, 0xFFFF); + + rtw_write32(adapter, REG_RCR, + rtw_read32(adapter, REG_RCR) | RCR_CBSSID_DATA | RCR_CBSSID_BCN); + + if (check_fwstate(mlmepriv, WIFI_STATION_STATE)) { + retry_limit = 48; + } else { + /* ad-hoc mode */ + retry_limit = 0x7; + } + break; + case 1: + /* joinbss_event call back when join res < 0 */ + rtw_write16(adapter, REG_RXFLTMAP2, 0x00); + break; + case 2: + /* sta add event call back */ + /* enable update TSF */ + rtw_write8(adapter, REG_BCN_CTRL, rtw_read8(adapter, REG_BCN_CTRL) & (~BIT(4))); + + if (check_fwstate(mlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE)) + retry_limit = 0x7; + break; + default: + break; + } + + rtw_write16(adapter, REG_RL, + retry_limit << RETRY_LIMIT_SHORT_SHIFT | retry_limit << RETRY_LIMIT_LONG_SHIFT); +} + void start_create_ibss(struct adapter *padapter) { unsigned short caps; - u8 join_type; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; struct wlan_bssid_ex *pnetwork = (struct wlan_bssid_ex *)(&pmlmeinfo->network); @@ -6121,9 +6073,8 @@ void start_create_ibss(struct adapter *padapter) report_join_res(padapter, -1); pmlmeinfo->state = WIFI_FW_NULL_STATE; } else { - SetHwReg8188EU(padapter, HW_VAR_BSSID, padapter->registrypriv.dev_network.MacAddress); - join_type = 0; - SetHwReg8188EU(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + rtw_set_bssid(padapter, padapter->registrypriv.dev_network.MacAddress); + mlme_join(padapter, 0); report_join_res(padapter, 1); pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS; @@ -6421,7 +6372,7 @@ void report_survey_event(struct adapter *padapter, struct recv_frame *precv_fram pmlmeext = &padapter->mlmeextpriv; pcmdpriv = &padapter->cmdpriv; - pcmd_obj = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); + pcmd_obj = kzalloc(sizeof(*pcmd_obj), GFP_ATOMIC); if (!pcmd_obj) return; @@ -6471,7 +6422,7 @@ void report_surveydone_event(struct adapter *padapter) struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - pcmd_obj = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); + pcmd_obj = kzalloc(sizeof(*pcmd_obj), GFP_KERNEL); if (!pcmd_obj) return; @@ -6513,7 +6464,7 @@ void report_join_res(struct adapter *padapter, int res) struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - pcmd_obj = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); + pcmd_obj = kzalloc(sizeof(*pcmd_obj), GFP_ATOMIC); if (!pcmd_obj) return; @@ -6610,7 +6561,7 @@ void report_add_sta_event(struct adapter *padapter, unsigned char *MacAddr, int struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - pcmd_obj = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); + pcmd_obj = kzalloc(sizeof(*pcmd_obj), GFP_KERNEL); if (!pcmd_obj) return; @@ -6696,13 +6647,11 @@ void mlmeext_joinbss_event_callback(struct adapter *padapter, int join_res) struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; struct wlan_bssid_ex *cur_network = &pmlmeinfo->network; struct sta_priv *pstapriv = &padapter->stapriv; - u8 join_type; u16 media_status; if (join_res < 0) { - join_type = 1; - SetHwReg8188EU(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); - SetHwReg8188EU(padapter, HW_VAR_BSSID, null_addr); + mlme_join(padapter, 1); + rtw_set_bssid(padapter, null_addr); /* restore to initial setting. */ update_tx_basic_rate(padapter, padapter->registrypriv.wireless_mode); @@ -6721,7 +6670,7 @@ void mlmeext_joinbss_event_callback(struct adapter *padapter, int join_res) } /* turn on dynamic functions */ - Switch_DM_Func(padapter, DYNAMIC_ALL_FUNC_ENABLE, true); + SetHwReg8188EU(padapter, HW_VAR_DM_FUNC_RESET, NULL); /* update IOT-releated issue */ update_IOT_info(padapter); @@ -6750,13 +6699,13 @@ void mlmeext_joinbss_event_callback(struct adapter *padapter, int join_res) /* set per sta rate after updating HT cap. */ set_sta_rate(padapter, psta); - SetHwReg8188EU(padapter, HW_VAR_TX_RPT_MAX_MACID, (u8 *)&psta->mac_id); + rtw_set_max_rpt_macid(padapter, psta->mac_id); + media_status = (psta->mac_id << 8) | 1; /* MACID|OPMODE: 1 means connect */ SetHwReg8188EU(padapter, HW_VAR_H2C_MEDIA_STATUS_RPT, (u8 *)&media_status); } - join_type = 2; - SetHwReg8188EU(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + mlme_join(padapter, 2); if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) { /* correcting TSF */ @@ -6769,7 +6718,6 @@ void mlmeext_sta_add_event_callback(struct adapter *padapter, struct sta_info *p { struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - u8 join_type; if ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) { if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) {/* adhoc master or sta_count>1 */ @@ -6786,9 +6734,7 @@ void mlmeext_sta_add_event_callback(struct adapter *padapter, struct sta_info *p } pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS; } - - join_type = 2; - SetHwReg8188EU(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + mlme_join(padapter, 2); } pmlmeinfo->FW_sta_info[psta->mac_id].psta = psta; @@ -6800,14 +6746,27 @@ void mlmeext_sta_add_event_callback(struct adapter *padapter, struct sta_info *p update_sta_info(padapter, psta); } +static void mlme_disconnect(struct adapter *adapter) +{ + /* Set RCR to not to receive data frame when NO LINK state */ + /* reject all data frames */ + rtw_write16(adapter, REG_RXFLTMAP2, 0x00); + + /* reset TSF */ + rtw_write8(adapter, REG_DUAL_TSF_RST, (BIT(0) | BIT(1))); + + /* disable update TSF */ + rtw_write8(adapter, REG_BCN_CTRL, rtw_read8(adapter, REG_BCN_CTRL) | BIT(4)); +} + void mlmeext_sta_del_event_callback(struct adapter *padapter) { struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; if (is_client_associated_to_ap(padapter) || is_IBSS_empty(padapter)) { - SetHwReg8188EU(padapter, HW_VAR_MLME_DISCONNECT, NULL); - SetHwReg8188EU(padapter, HW_VAR_BSSID, null_addr); + mlme_disconnect(padapter); + rtw_set_bssid(padapter, null_addr); /* restore to initial setting. */ update_tx_basic_rate(padapter, padapter->registrypriv.wireless_mode); @@ -6951,7 +6910,7 @@ void linked_status_chk(struct adapter *padapter) if (pmlmeinfo->FW_sta_info[i].status == 1) { psta = pmlmeinfo->FW_sta_info[i].psta; - if (NULL == psta) + if (psta == NULL) continue; if (pmlmeinfo->FW_sta_info[i].rx_pkt == sta_rx_pkts(psta)) { if (pmlmeinfo->FW_sta_info[i].retry < 3) { @@ -6996,11 +6955,11 @@ void survey_timer_hdl(struct adapter *padapter) pmlmeext->scan_abort = false;/* reset */ } - ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); + ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC); if (!ph2c) goto exit_survey_timer_hdl; - psurveyPara = kzalloc(sizeof(struct sitesurvey_parm), GFP_ATOMIC); + psurveyPara = kzalloc(sizeof(*psurveyPara), GFP_ATOMIC); if (!psurveyPara) { kfree(ph2c); goto exit_survey_timer_hdl; @@ -7122,7 +7081,7 @@ u8 createbss_hdl(struct adapter *padapter, u8 *pbuf) /* disable dynamic functions, such as high power, DIG */ Save_DM_Func_Flag(padapter); - Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, false); + SetHwReg8188EU(padapter, HW_VAR_DM_FUNC_CLR, NULL); /* cancel link timer */ _cancel_timer_ex(&pmlmeext->link_timer); @@ -7146,7 +7105,6 @@ u8 createbss_hdl(struct adapter *padapter, u8 *pbuf) u8 join_cmd_hdl(struct adapter *padapter, u8 *pbuf) { - u8 join_type; struct ndis_802_11_var_ie *pIE; struct registry_priv *pregpriv = &padapter->registrypriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; @@ -7170,7 +7128,7 @@ u8 join_cmd_hdl(struct adapter *padapter, u8 *pbuf) /* set MSR to nolink -> infra. mode */ Set_MSR(padapter, _HW_STATE_STATION_); - SetHwReg8188EU(padapter, HW_VAR_MLME_DISCONNECT, NULL); + mlme_disconnect(padapter); } rtw_antenna_select_cmd(padapter, pparm->network.PhyInfo.Optimum_antenna, false); @@ -7243,9 +7201,8 @@ u8 join_cmd_hdl(struct adapter *padapter, u8 *pbuf) /* config the initial gain under linking, need to write the BB registers */ - SetHwReg8188EU(padapter, HW_VAR_BSSID, pmlmeinfo->network.MacAddress); - join_type = 0; - SetHwReg8188EU(padapter, HW_VAR_MLME_JOIN, (u8 *)(&join_type)); + rtw_set_bssid(padapter, pmlmeinfo->network.MacAddress); + mlme_join(padapter, 0); /* cancel link timer */ _cancel_timer_ex(&pmlmeext->link_timer); @@ -7266,8 +7223,8 @@ u8 disconnect_hdl(struct adapter *padapter, unsigned char *pbuf) if (is_client_associated_to_ap(padapter)) issue_deauth_ex(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING, param->deauth_timeout_ms / 100, 100); - SetHwReg8188EU(padapter, HW_VAR_MLME_DISCONNECT, NULL); - SetHwReg8188EU(padapter, HW_VAR_BSSID, null_addr); + mlme_disconnect(padapter); + rtw_set_bssid(padapter, null_addr); /* restore to initial setting. */ update_tx_basic_rate(padapter, padapter->registrypriv.wireless_mode); @@ -7346,7 +7303,6 @@ u8 sitesurvey_cmd_hdl(struct adapter *padapter, u8 *pbuf) struct sitesurvey_parm *pparm = (struct sitesurvey_parm *)pbuf; u8 bdelayscan = false; u8 val8; - u32 initialgain; u32 i; struct wifidirect_info *pwdinfo = &padapter->wdinfo; @@ -7391,15 +7347,14 @@ u8 sitesurvey_cmd_hdl(struct adapter *padapter, u8 *pbuf) if ((pmlmeext->sitesurvey_res.state == SCAN_START) || (pmlmeext->sitesurvey_res.state == SCAN_TXNULL)) { /* disable dynamic functions, such as high power, DIG */ Save_DM_Func_Flag(padapter); - Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, false); + SetHwReg8188EU(padapter, HW_VAR_DM_FUNC_CLR, NULL); /* config the initial gain under scanning, need to write the BB registers */ if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) - initialgain = 0x1E; + rtw_set_initial_gain(padapter, 0x1e); else - initialgain = 0x28; + rtw_set_initial_gain(padapter, 0x28); - SetHwReg8188EU(padapter, HW_VAR_INITIAL_GAIN, (u8 *)(&initialgain)); /* set MSR to no link state */ Set_MSR(padapter, _HW_STATE_NOLINK_); @@ -7538,13 +7493,13 @@ u8 set_tx_beacon_cmd(struct adapter *padapter) u8 res = _SUCCESS; int len_diff = 0; - ph2c = kzalloc(sizeof(struct cmd_obj), GFP_ATOMIC); + ph2c = kzalloc(sizeof(*ph2c), GFP_ATOMIC); if (!ph2c) { res = _FAIL; goto exit; } - ptxBeacon_parm = kzalloc(sizeof(struct Tx_Beacon_param), GFP_ATOMIC); + ptxBeacon_parm = kzalloc(sizeof(*ptxBeacon_parm), GFP_ATOMIC); if (!ptxBeacon_parm) { kfree(ph2c); res = _FAIL; diff --git a/drivers/staging/r8188eu/core/rtw_p2p.c b/drivers/staging/r8188eu/core/rtw_p2p.c index 48500fb82250..beffe5b16f1e 100644 --- a/drivers/staging/r8188eu/core/rtw_p2p.c +++ b/drivers/staging/r8188eu/core/rtw_p2p.c @@ -111,7 +111,7 @@ static void issue_group_disc_req(struct wifidirect_info *pwdinfo, u8 *da) struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; struct adapter *padapter = pwdinfo->padapter; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; @@ -132,9 +132,9 @@ static void issue_group_disc_req(struct wifidirect_info *pwdinfo, u8 *da) memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; memcpy(pwlanhdr->addr1, da, ETH_ALEN); @@ -145,8 +145,8 @@ static void issue_group_disc_req(struct wifidirect_info *pwdinfo, u8 *da) pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_ACTION); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); /* Build P2P action frame header */ pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); @@ -166,12 +166,12 @@ static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 s struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; struct adapter *padapter = pwdinfo->padapter; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; + unsigned char category = WLAN_CATEGORY_PUBLIC; u8 action = P2P_PUB_ACTION_ACTION; __be32 p2poui = cpu_to_be32(P2POUI); u8 oui_subtype = P2P_DEVDISC_RESP; @@ -189,9 +189,9 @@ static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 s memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; memcpy(pwlanhdr->addr1, da, ETH_ALEN); @@ -202,8 +202,8 @@ static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 s pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_ACTION); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); /* Build P2P public action frame header */ pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); @@ -233,7 +233,7 @@ static void issue_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 s static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8 *raddr, u8 *frame_body, u16 config_method) { struct adapter *padapter = pwdinfo->padapter; - unsigned char category = RTW_WLAN_CATEGORY_PUBLIC; + unsigned char category = WLAN_CATEGORY_PUBLIC; u8 action = P2P_PUB_ACTION_ACTION; u8 dialogToken = frame_body[7]; /* The Dialog Token of provisioning discovery request frame. */ __be32 p2poui = cpu_to_be32(P2POUI); @@ -243,7 +243,7 @@ static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8 *raddr, struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; @@ -259,9 +259,9 @@ static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8 *raddr, memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); @@ -272,8 +272,8 @@ static void issue_p2p_provision_resp(struct wifidirect_info *pwdinfo, u8 *raddr, pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_ACTION); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); pframe = rtw_set_fixed_ie(pframe, 1, &action, &pattrib->pktlen); @@ -311,7 +311,7 @@ static void issue_p2p_presence_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; unsigned char *pframe; - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; struct adapter *padapter = pwdinfo->padapter; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; @@ -334,9 +334,9 @@ static void issue_p2p_presence_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; memcpy(pwlanhdr->addr1, da, ETH_ALEN); @@ -347,8 +347,8 @@ static void issue_p2p_presence_resp(struct wifidirect_info *pwdinfo, u8 *da, u8 pmlmeext->mgnt_seq++; SetFrameSubType(pframe, WIFI_ACTION); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); /* Build P2P action frame header */ pframe = rtw_set_fixed_ie(pframe, 1, &category, &pattrib->pktlen); @@ -872,7 +872,7 @@ u32 process_assoc_req_p2p_ie(struct wifidirect_info *pwdinfo, u8 *pframe, uint l } psta->dev_name_len = 0; - if (WPS_ATTR_DEVICE_NAME == be16_to_cpu(*(__be16 *)pattr_content)) { + if (be16_to_cpu(*(__be16 *)pattr_content) == WPS_ATTR_DEVICE_NAME) { dev_name_len = be16_to_cpu(*(__be16 *)(pattr_content + 2)); psta->dev_name_len = (sizeof(psta->dev_name) < dev_name_len) ? sizeof(psta->dev_name) : dev_name_len; @@ -900,7 +900,7 @@ u32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint le u8 *p2p_ie; u32 p2p_ielen = 0; - frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); + frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); dialogToken = frame_body[7]; status = P2P_STATUS_FAIL_UNKNOWN_P2PGROUP; @@ -951,7 +951,7 @@ u32 process_p2p_devdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint le /* issue Device Discoverability Response */ issue_p2p_devdisc_resp(pwdinfo, GetAddr2Ptr(pframe), status, dialogToken); - return (status == P2P_STATUS_SUCCESS) ? true : false; + return status == P2P_STATUS_SUCCESS; } u32 process_p2p_devdisc_resp(struct wifidirect_info *pwdinfo, u8 *pframe, uint len) @@ -967,7 +967,7 @@ u8 process_p2p_provdisc_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint l u16 uconfig_method = 0; __be16 be_tmp; - frame_body = (pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); + frame_body = (pframe + sizeof(struct ieee80211_hdr_3addr)); wpsie = rtw_get_wps_ie(frame_body + _PUBLIC_ACTION_IE_OFFSET_, len - _PUBLIC_ACTION_IE_OFFSET_, NULL, &wps_ielen); if (wpsie) { @@ -1213,7 +1213,7 @@ u8 process_p2p_group_negotation_resp(struct wifidirect_info *pwdinfo, u8 *pframe if (attr_content == P2P_STATUS_SUCCESS) { /* Do nothing. */ } else { - if (P2P_STATUS_FAIL_INFO_UNAVAILABLE == attr_content) { + if (attr_content == P2P_STATUS_FAIL_INFO_UNAVAILABLE) { rtw_p2p_set_state(pwdinfo, P2P_STATE_RX_INFOR_NOREADY); } else { rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_FAIL); @@ -1401,7 +1401,7 @@ u8 process_p2p_presence_req(struct wifidirect_info *pwdinfo, u8 *pframe, uint le u8 dialogToken = 0; u8 status = P2P_STATUS_SUCCESS; - frame_body = (unsigned char *)(pframe + sizeof(struct rtw_ieee80211_hdr_3addr)); + frame_body = (unsigned char *)(pframe + sizeof(struct ieee80211_hdr_3addr)); dialogToken = frame_body[6]; @@ -1602,7 +1602,7 @@ void p2p_ps_wk_hdl(struct adapter *padapter, u8 p2p_ps_state) case P2P_PS_DISABLE: pwdinfo->p2p_ps_state = p2p_ps_state; - SetHwReg8188EU(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state)); + rtl8188e_set_p2p_ps_offload_cmd(padapter, p2p_ps_state); pwdinfo->noa_index = 0; pwdinfo->ctwindow = 0; @@ -1612,7 +1612,7 @@ void p2p_ps_wk_hdl(struct adapter *padapter, u8 p2p_ps_state) if (padapter->pwrctrlpriv.bFwCurrentInPSMode) { if (pwrpriv->smart_ps == 0) { pwrpriv->smart_ps = 2; - SetHwReg8188EU(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&padapter->pwrctrlpriv.pwr_mode)); + rtw_set_firmware_ps_mode(padapter, pwrpriv->pwr_mode); } } break; @@ -1623,10 +1623,10 @@ void p2p_ps_wk_hdl(struct adapter *padapter, u8 p2p_ps_state) if (pwdinfo->ctwindow > 0) { if (pwrpriv->smart_ps != 0) { pwrpriv->smart_ps = 0; - SetHwReg8188EU(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&padapter->pwrctrlpriv.pwr_mode)); + rtw_set_firmware_ps_mode(padapter, pwrpriv->pwr_mode); } } - SetHwReg8188EU(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state)); + rtl8188e_set_p2p_ps_offload_cmd(padapter, p2p_ps_state); } break; case P2P_PS_SCAN: @@ -1634,7 +1634,7 @@ void p2p_ps_wk_hdl(struct adapter *padapter, u8 p2p_ps_state) case P2P_PS_ALLSTASLEEP: if (pwdinfo->p2p_ps_mode > P2P_PS_NONE) { pwdinfo->p2p_ps_state = p2p_ps_state; - SetHwReg8188EU(padapter, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, (u8 *)(&p2p_ps_state)); + rtl8188e_set_p2p_ps_offload_cmd(padapter, p2p_ps_state); } break; default: @@ -1891,7 +1891,7 @@ int rtw_p2p_enable(struct adapter *padapter, enum P2P_ROLE role) if (role == P2P_ROLE_DEVICE || role == P2P_ROLE_CLIENT || role == P2P_ROLE_GO) { /* leave IPS/Autosuspend */ - if (_FAIL == rtw_pwr_wakeup(padapter)) { + if (rtw_pwr_wakeup(padapter) == _FAIL) { ret = _FAIL; goto exit; } @@ -1905,7 +1905,7 @@ int rtw_p2p_enable(struct adapter *padapter, enum P2P_ROLE role) init_wifidirect_info(padapter, role); } else if (role == P2P_ROLE_DISABLE) { - if (_FAIL == rtw_pwr_wakeup(padapter)) { + if (rtw_pwr_wakeup(padapter) == _FAIL) { ret = _FAIL; goto exit; } diff --git a/drivers/staging/r8188eu/core/rtw_pwrctrl.c b/drivers/staging/r8188eu/core/rtw_pwrctrl.c index 7beabf82eb92..7b816b824947 100644 --- a/drivers/staging/r8188eu/core/rtw_pwrctrl.c +++ b/drivers/staging/r8188eu/core/rtw_pwrctrl.c @@ -59,7 +59,7 @@ int ips_leave(struct adapter *padapter) pwrpriv->rf_pwrstate = rf_on; } - if ((_WEP40_ == psecuritypriv->dot11PrivacyAlgrthm) || (_WEP104_ == psecuritypriv->dot11PrivacyAlgrthm)) { + if ((psecuritypriv->dot11PrivacyAlgrthm == _WEP40_) || (psecuritypriv->dot11PrivacyAlgrthm == _WEP104_)) { set_channel_bwmode(padapter, padapter->mlmeextpriv.cur_channel, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); for (keyid = 0; keyid < 4; keyid++) { if (pmlmepriv->key_mask & BIT(keyid)) { @@ -133,9 +133,8 @@ void rtw_ps_processor(struct adapter *padapter) if (!rtw_pwr_unassociated_idle(padapter)) goto exit; - if ((pwrpriv->rf_pwrstate == rf_on) && ((pwrpriv->pwr_state_check_cnts % 4) == 0)) { + if (pwrpriv->rf_pwrstate == rf_on) { pwrpriv->change_rfpwrstate = rf_off; - ips_enter(padapter); } exit: @@ -177,6 +176,19 @@ static bool PS_RDY_CHECK(struct adapter *padapter) return true; } +void rtw_set_firmware_ps_mode(struct adapter *adapter, u8 mode) +{ + struct hal_data_8188e *haldata = &adapter->haldata; + struct odm_dm_struct *odmpriv = &haldata->odmpriv; + + /* Force leave RF low power mode for 1T1R to prevent + * conflicting setting in firmware power saving sequence. + */ + if (mode != PS_MODE_ACTIVE) + ODM_RF_Saving(odmpriv, true); + rtl8188e_set_FwPwrMode_cmd(adapter, mode); +} + void rtw_set_ps_mode(struct adapter *padapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode) { struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; @@ -186,7 +198,7 @@ void rtw_set_ps_mode(struct adapter *padapter, u8 ps_mode, u8 smart_ps, u8 bcn_a return; if (pwrpriv->pwr_mode == ps_mode) { - if (PS_MODE_ACTIVE == ps_mode) + if (ps_mode == PS_MODE_ACTIVE) return; if ((pwrpriv->smart_ps == smart_ps) && @@ -194,11 +206,10 @@ void rtw_set_ps_mode(struct adapter *padapter, u8 ps_mode, u8 smart_ps, u8 bcn_a return; } - /* if (pwrpriv->pwr_mode == PS_MODE_ACTIVE) */ if (ps_mode == PS_MODE_ACTIVE) { if (pwdinfo->opp_ps == 0) { pwrpriv->pwr_mode = ps_mode; - SetHwReg8188EU(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); + rtw_set_firmware_ps_mode(padapter, ps_mode); pwrpriv->bFwCurrentInPSMode = false; } } else { @@ -207,14 +218,28 @@ void rtw_set_ps_mode(struct adapter *padapter, u8 ps_mode, u8 smart_ps, u8 bcn_a pwrpriv->pwr_mode = ps_mode; pwrpriv->smart_ps = smart_ps; pwrpriv->bcn_ant_mode = bcn_ant_mode; - SetHwReg8188EU(padapter, HW_VAR_H2C_FW_PWRMODE, (u8 *)(&ps_mode)); + rtw_set_firmware_ps_mode(padapter, ps_mode); /* Set CTWindow after LPS */ if (pwdinfo->opp_ps == 1) p2p_ps_wk_cmd(padapter, P2P_PS_ENABLE, 0); } } +} +static bool lps_rf_on(struct adapter *adapter) +{ + /* When we halt NIC, we should check if FW LPS is leave. */ + if (adapter->pwrctrlpriv.rf_pwrstate == rf_off) { + /* If it is in HW/SW Radio OFF or IPS state, we do not check Fw LPS Leave, */ + /* because Fw is unload. */ + return true; + } + + if (rtw_read32(adapter, REG_RCR) & 0x00070000) + return false; + + return true; } /* @@ -223,16 +248,13 @@ void rtw_set_ps_mode(struct adapter *padapter, u8 ps_mode, u8 smart_ps, u8 bcn_a * -1: Timeout * -2: Other error */ -s32 LPS_RF_ON_check(struct adapter *padapter, u32 delay_ms) +static s32 LPS_RF_ON_check(struct adapter *padapter, u32 delay_ms) { - u32 start_time; - u8 bAwake = false; + unsigned long timeout = jiffies + msecs_to_jiffies(delay_ms); s32 err = 0; - start_time = jiffies; while (1) { - GetHwReg8188EU(padapter, HW_VAR_FWLPS_RF_ON, &bAwake); - if (bAwake) + if (lps_rf_on(padapter)) break; if (padapter->bSurpriseRemoved) { @@ -240,7 +262,7 @@ s32 LPS_RF_ON_check(struct adapter *padapter, u32 delay_ms) break; } - if (rtw_get_passing_time_ms(start_time) > delay_ms) { + if (time_after(jiffies, timeout)) { err = -1; break; } @@ -329,13 +351,12 @@ void rtw_init_pwrctrl_priv(struct adapter *padapter) pwrctrlpriv->ips_mode_req = padapter->registrypriv.ips_mode; pwrctrlpriv->pwr_state_check_interval = RTW_PWR_STATE_CHK_INTERVAL; - pwrctrlpriv->pwr_state_check_cnts = 0; pwrctrlpriv->bInSuspend = false; pwrctrlpriv->bkeepfwalive = false; pwrctrlpriv->LpsIdleCount = 0; pwrctrlpriv->power_mgnt = padapter->registrypriv.power_mgnt;/* PS_MODE_MIN; */ - pwrctrlpriv->bLeisurePs = (PS_MODE_ACTIVE != pwrctrlpriv->power_mgnt) ? true : false; + pwrctrlpriv->bLeisurePs = pwrctrlpriv->power_mgnt != PS_MODE_ACTIVE; pwrctrlpriv->bFwCurrentInPSMode = false; @@ -346,58 +367,38 @@ void rtw_init_pwrctrl_priv(struct adapter *padapter) timer_setup(&pwrctrlpriv->pwr_state_check_timer, pwr_state_check_handler, 0); } -/* -* rtw_pwr_wakeup - Wake the NIC up from: 1)IPS. 2)USB autosuspend -* @adapter: pointer to struct adapter structure -* @ips_deffer_ms: the ms wiil prevent from falling into IPS after wakeup -* Return _SUCCESS or _FAIL -*/ - -int _rtw_pwr_wakeup(struct adapter *padapter, u32 ips_deffer_ms, const char *caller) +/* Wake the NIC up from: 1)IPS 2)USB autosuspend */ +int rtw_pwr_wakeup(struct adapter *padapter) { struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + unsigned long timeout = jiffies + msecs_to_jiffies(3000); + unsigned long deny_time; int ret = _SUCCESS; - u32 start = jiffies; - - if (pwrpriv->ips_deny_time < jiffies + rtw_ms_to_systime(ips_deffer_ms)) - pwrpriv->ips_deny_time = jiffies + rtw_ms_to_systime(ips_deffer_ms); - - if (pwrpriv->ps_processing) { - while (pwrpriv->ps_processing && rtw_get_passing_time_ms(start) <= 3000) - msleep(10); - } - /* System suspend is not allowed to wakeup */ - if (pwrpriv->bInSuspend) { - while (pwrpriv->bInSuspend && - (rtw_get_passing_time_ms(start) <= 3000 || - (rtw_get_passing_time_ms(start) <= 500))) - msleep(10); - } + while (pwrpriv->ps_processing && time_before(jiffies, timeout)) + msleep(10); /* I think this should be check in IPS, LPS, autosuspend functions... */ if (check_fwstate(pmlmepriv, _FW_LINKED)) { ret = _SUCCESS; goto exit; } - if (rf_off == pwrpriv->rf_pwrstate) { - if (_FAIL == ips_leave(padapter)) { - ret = _FAIL; - goto exit; - } + + if (pwrpriv->rf_pwrstate == rf_off && ips_leave(padapter) == _FAIL) { + ret = _FAIL; + goto exit; } - /* TODO: the following checking need to be merged... */ - if (padapter->bDriverStopped || !padapter->bup || - !padapter->hw_init_completed) { - ret = false; + if (padapter->bDriverStopped || !padapter->bup || !padapter->hw_init_completed) { + ret = _FAIL; goto exit; } exit: - if (pwrpriv->ips_deny_time < jiffies + rtw_ms_to_systime(ips_deffer_ms)) - pwrpriv->ips_deny_time = jiffies + rtw_ms_to_systime(ips_deffer_ms); + deny_time = jiffies + msecs_to_jiffies(RTW_PWR_STATE_CHK_INTERVAL); + if (time_before(pwrpriv->ips_deny_time, deny_time)) + pwrpriv->ips_deny_time = deny_time; return ret; } @@ -408,12 +409,12 @@ int rtw_pm_set_lps(struct adapter *padapter, u8 mode) if (mode < PS_MODE_NUM) { if (pwrctrlpriv->power_mgnt != mode) { - if (PS_MODE_ACTIVE == mode) + if (mode == PS_MODE_ACTIVE) LeaveAllPowerSaveMode(padapter); else pwrctrlpriv->LpsIdleCount = 2; pwrctrlpriv->power_mgnt = mode; - pwrctrlpriv->bLeisurePs = (PS_MODE_ACTIVE != pwrctrlpriv->power_mgnt) ? true : false; + pwrctrlpriv->bLeisurePs = pwrctrlpriv->power_mgnt != PS_MODE_ACTIVE; } } else { ret = -EINVAL; @@ -431,7 +432,7 @@ int rtw_pm_set_ips(struct adapter *padapter, u8 mode) return 0; } else if (mode == IPS_NONE) { rtw_ips_mode_req(pwrctrlpriv, mode); - if ((padapter->bSurpriseRemoved == 0) && (_FAIL == rtw_pwr_wakeup(padapter))) + if ((padapter->bSurpriseRemoved == 0) && (rtw_pwr_wakeup(padapter) == _FAIL)) return -EFAULT; } else { return -EINVAL; diff --git a/drivers/staging/r8188eu/core/rtw_recv.c b/drivers/staging/r8188eu/core/rtw_recv.c index 8800ea4825ff..df518439aea2 100644 --- a/drivers/staging/r8188eu/core/rtw_recv.c +++ b/drivers/staging/r8188eu/core/rtw_recv.c @@ -71,7 +71,6 @@ int _rtw_init_recv_priv(struct recv_priv *precvpriv, struct adapter *padapter) list_add_tail(&precvframe->list, &precvpriv->free_recv_queue.queue); - precvframe->pkt_newalloc = NULL; precvframe->pkt = NULL; precvframe->len = 0; @@ -81,8 +80,6 @@ int _rtw_init_recv_priv(struct recv_priv *precvpriv, struct adapter *padapter) } precvpriv->rx_pending_cnt = 1; - sema_init(&precvpriv->allrxreturnevt, 0); - res = rtl8188eu_init_recv_priv(padapter); timer_setup(&precvpriv->signal_stat_timer, rtw_signal_stat_timer_hdl, 0); @@ -749,6 +746,7 @@ static int sta2ap_data_frame(struct adapter *adapter, struct sta_priv *pstapriv = &adapter->stapriv; struct mlme_priv *pmlmepriv = &adapter->mlmepriv; u8 *ptr = precv_frame->rx_data; + __le16 fc = *(__le16 *)ptr; unsigned char *mybssid = get_bssid(pmlmepriv); int ret = _SUCCESS; @@ -769,9 +767,8 @@ static int sta2ap_data_frame(struct adapter *adapter, process_pwrbit_data(adapter, precv_frame); - if ((GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE) == WIFI_QOS_DATA_TYPE) { + if (ieee80211_is_data_qos(fc)) process_wmmps_data(adapter, precv_frame); - } if (GetFrameSubType(ptr) & BIT(6)) { /* No data, will not indicate to upper layer, temporily count it here */ @@ -795,143 +792,135 @@ exit: return ret; } -static int validate_recv_ctrl_frame(struct adapter *padapter, - struct recv_frame *precv_frame) +static void validate_recv_ctrl_frame(struct adapter *padapter, + struct recv_frame *precv_frame) { struct rx_pkt_attrib *pattrib = &precv_frame->attrib; struct sta_priv *pstapriv = &padapter->stapriv; - u8 *pframe = precv_frame->rx_data; - /* uint len = precv_frame->len; */ - - if (GetFrameType(pframe) != WIFI_CTRL_TYPE) - return _FAIL; + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)precv_frame->rx_data; + struct ieee80211_pspoll *pspoll = (struct ieee80211_pspoll *)hdr; + u8 wmmps_ac; + struct sta_info *psta; /* receive the frames that ra(a1) is my address */ - if (memcmp(GetAddr1Ptr(pframe), myid(&padapter->eeprompriv), ETH_ALEN)) - return _FAIL; + if (memcmp(hdr->addr1, myid(&padapter->eeprompriv), ETH_ALEN)) + return; /* only handle ps-poll */ - if (GetFrameSubType(pframe) == WIFI_PSPOLL) { - u16 aid; - u8 wmmps_ac = 0; - struct sta_info *psta = NULL; + if (!ieee80211_is_pspoll(hdr->frame_control)) + return; - aid = GetAid(pframe); - psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); + psta = rtw_get_stainfo(pstapriv, hdr->addr2); + if (!psta || psta->aid != (le16_to_cpu(pspoll->aid) & 0x3FFF)) + return; - if (!psta || psta->aid != aid) - return _FAIL; + /* for rx pkt statistics */ + psta->sta_stats.rx_ctrl_pkts++; - /* for rx pkt statistics */ - psta->sta_stats.rx_ctrl_pkts++; + switch (pattrib->priority) { + case 1: + case 2: + wmmps_ac = psta->uapsd_bk & BIT(0); + break; + case 4: + case 5: + wmmps_ac = psta->uapsd_vi & BIT(0); + break; + case 6: + case 7: + wmmps_ac = psta->uapsd_vo & BIT(0); + break; + case 0: + case 3: + default: + wmmps_ac = psta->uapsd_be & BIT(0); + break; + } - switch (pattrib->priority) { - case 1: - case 2: - wmmps_ac = psta->uapsd_bk & BIT(0); - break; - case 4: - case 5: - wmmps_ac = psta->uapsd_vi & BIT(0); - break; - case 6: - case 7: - wmmps_ac = psta->uapsd_vo & BIT(0); - break; - case 0: - case 3: - default: - wmmps_ac = psta->uapsd_be & BIT(0); - break; - } + if (wmmps_ac) + return; - if (wmmps_ac) - return _FAIL; + if (psta->state & WIFI_STA_ALIVE_CHK_STATE) { + psta->expire_to = pstapriv->expire_to; + psta->state ^= WIFI_STA_ALIVE_CHK_STATE; + } - if (psta->state & WIFI_STA_ALIVE_CHK_STATE) { - psta->expire_to = pstapriv->expire_to; - psta->state ^= WIFI_STA_ALIVE_CHK_STATE; - } + if ((psta->state & WIFI_SLEEP_STATE) && (pstapriv->sta_dz_bitmap & BIT(psta->aid))) { + struct list_head *xmitframe_plist, *xmitframe_phead; + struct xmit_frame *pxmitframe = NULL; + struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - if ((psta->state & WIFI_SLEEP_STATE) && (pstapriv->sta_dz_bitmap & BIT(psta->aid))) { - struct list_head *xmitframe_plist, *xmitframe_phead; - struct xmit_frame *pxmitframe = NULL; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; + spin_lock_bh(&pxmitpriv->lock); - spin_lock_bh(&pxmitpriv->lock); + xmitframe_phead = get_list_head(&psta->sleep_q); + xmitframe_plist = xmitframe_phead->next; - xmitframe_phead = get_list_head(&psta->sleep_q); - xmitframe_plist = xmitframe_phead->next; + if (xmitframe_phead != xmitframe_plist) { + pxmitframe = container_of(xmitframe_plist, struct xmit_frame, list); - if (xmitframe_phead != xmitframe_plist) { - pxmitframe = container_of(xmitframe_plist, struct xmit_frame, list); + xmitframe_plist = xmitframe_plist->next; - xmitframe_plist = xmitframe_plist->next; + list_del_init(&pxmitframe->list); - list_del_init(&pxmitframe->list); + psta->sleepq_len--; - psta->sleepq_len--; + if (psta->sleepq_len > 0) + pxmitframe->attrib.mdata = 1; + else + pxmitframe->attrib.mdata = 0; - if (psta->sleepq_len > 0) - pxmitframe->attrib.mdata = 1; - else - pxmitframe->attrib.mdata = 0; + pxmitframe->attrib.triggered = 1; - pxmitframe->attrib.triggered = 1; + if (psta->sleepq_len == 0) { + pstapriv->tim_bitmap &= ~BIT(psta->aid); - if (psta->sleepq_len == 0) { - pstapriv->tim_bitmap &= ~BIT(psta->aid); + /* upate BCN for TIM IE */ + /* update_BCNTIM(padapter); */ + update_beacon(padapter, _TIM_IE_, NULL, false); + } + } else { + if (pstapriv->tim_bitmap & BIT(psta->aid)) { + if (psta->sleepq_len == 0) + /* issue nulldata with More data bit = 0 to indicate we have no buffered packets */ + issue_nulldata(padapter, psta->hwaddr, 0, 0, 0); + else + psta->sleepq_len = 0; - /* upate BCN for TIM IE */ - /* update_BCNTIM(padapter); */ - update_beacon(padapter, _TIM_IE_, NULL, false); - } - } else { - if (pstapriv->tim_bitmap & BIT(psta->aid)) { - if (psta->sleepq_len == 0) - /* issue nulldata with More data bit = 0 to indicate we have no buffered packets */ - issue_nulldata(padapter, psta->hwaddr, 0, 0, 0); - else - psta->sleepq_len = 0; - - pstapriv->tim_bitmap &= ~BIT(psta->aid); - - /* upate BCN for TIM IE */ - /* update_BCNTIM(padapter); */ - update_beacon(padapter, _TIM_IE_, NULL, false); - } + pstapriv->tim_bitmap &= ~BIT(psta->aid); + + /* upate BCN for TIM IE */ + /* update_BCNTIM(padapter); */ + update_beacon(padapter, _TIM_IE_, NULL, false); } - spin_unlock_bh(&pxmitpriv->lock); } + spin_unlock_bh(&pxmitpriv->lock); } - - return _FAIL; } struct recv_frame *recvframe_chk_defrag(struct adapter *padapter, struct recv_frame *precv_frame); -static int validate_recv_mgnt_frame(struct adapter *padapter, - struct recv_frame *precv_frame) +static void validate_recv_mgnt_frame(struct adapter *padapter, + struct recv_frame *precv_frame) { struct sta_info *psta; + struct ieee80211_hdr *hdr; precv_frame = recvframe_chk_defrag(padapter, precv_frame); if (!precv_frame) - return _SUCCESS; + return; - /* for rx pkt statistics */ - psta = rtw_get_stainfo(&padapter->stapriv, GetAddr2Ptr(precv_frame->rx_data)); + hdr = (struct ieee80211_hdr *)precv_frame->rx_data; + psta = rtw_get_stainfo(&padapter->stapriv, hdr->addr2); if (psta) { psta->sta_stats.rx_mgnt_pkts++; - if (GetFrameSubType(precv_frame->rx_data) == WIFI_BEACON) { + if (ieee80211_is_beacon(hdr->frame_control)) psta->sta_stats.rx_beacon_pkts++; - } else if (GetFrameSubType(precv_frame->rx_data) == WIFI_PROBEREQ) { + else if (ieee80211_is_probe_req(hdr->frame_control)) psta->sta_stats.rx_probereq_pkts++; - } else if (GetFrameSubType(precv_frame->rx_data) == WIFI_PROBERSP) { - if (!memcmp(padapter->eeprompriv.mac_addr, GetAddr1Ptr(precv_frame->rx_data), ETH_ALEN)) + else if (ieee80211_is_probe_resp(hdr->frame_control)) { + if (!memcmp(padapter->eeprompriv.mac_addr, hdr->addr1, ETH_ALEN)) psta->sta_stats.rx_probersp_pkts++; - else if (is_broadcast_mac_addr(GetAddr1Ptr(precv_frame->rx_data)) || - is_multicast_mac_addr(GetAddr1Ptr(precv_frame->rx_data))) + else if (is_broadcast_mac_addr(hdr->addr1) || is_multicast_mac_addr(hdr->addr1)) psta->sta_stats.rx_probersp_bm_pkts++; else psta->sta_stats.rx_probersp_uo_pkts++; @@ -939,72 +928,44 @@ static int validate_recv_mgnt_frame(struct adapter *padapter, } mgt_dispatcher(padapter, precv_frame); - - return _SUCCESS; } static int validate_recv_data_frame(struct adapter *adapter, struct recv_frame *precv_frame) { - u8 bretry; - u8 *psa, *pda, *pbssid; struct sta_info *psta = NULL; u8 *ptr = precv_frame->rx_data; + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)precv_frame->rx_data; struct rx_pkt_attrib *pattrib = &precv_frame->attrib; struct security_priv *psecuritypriv = &adapter->securitypriv; - int ret = _SUCCESS; - - bretry = GetRetry(ptr); - pda = get_da(ptr); - psa = get_sa(ptr); - pbssid = get_hdr_bssid(ptr); + int ret; - if (!pbssid) { - ret = _FAIL; - goto exit; - } + memcpy(pattrib->dst, ieee80211_get_DA(hdr), ETH_ALEN); + memcpy(pattrib->src, ieee80211_get_SA(hdr), ETH_ALEN); - memcpy(pattrib->dst, pda, ETH_ALEN); - memcpy(pattrib->src, psa, ETH_ALEN); + /* address4 is used only if both to_ds and from_ds are set */ + if (ieee80211_has_a4(hdr->frame_control)) + return _FAIL; - memcpy(pattrib->bssid, pbssid, ETH_ALEN); + memcpy(pattrib->ra, hdr->addr1, ETH_ALEN); + memcpy(pattrib->ta, hdr->addr2, ETH_ALEN); - switch (pattrib->to_fr_ds) { - case 0: - memcpy(pattrib->ra, pda, ETH_ALEN); - memcpy(pattrib->ta, psa, ETH_ALEN); - ret = sta2sta_data_frame(adapter, precv_frame, &psta); - break; - case 1: - memcpy(pattrib->ra, pda, ETH_ALEN); - memcpy(pattrib->ta, pbssid, ETH_ALEN); + if (ieee80211_has_fromds(hdr->frame_control)) { + memcpy(pattrib->bssid, hdr->addr2, ETH_ALEN); ret = ap2sta_data_frame(adapter, precv_frame, &psta); - break; - case 2: - memcpy(pattrib->ra, pbssid, ETH_ALEN); - memcpy(pattrib->ta, psa, ETH_ALEN); + } else if (ieee80211_has_tods(hdr->frame_control)) { + memcpy(pattrib->bssid, hdr->addr1, ETH_ALEN); ret = sta2ap_data_frame(adapter, precv_frame, &psta); - break; - case 3: - memcpy(pattrib->ra, GetAddr1Ptr(ptr), ETH_ALEN); - memcpy(pattrib->ta, GetAddr2Ptr(ptr), ETH_ALEN); - ret = _FAIL; - break; - default: - ret = _FAIL; - break; + } else { + memcpy(pattrib->bssid, hdr->addr3, ETH_ALEN); + ret = sta2sta_data_frame(adapter, precv_frame, &psta); } - if (ret == _FAIL) { - goto exit; - } else if (ret == RTW_RX_HANDLED) { - goto exit; - } + if (ret == _FAIL || ret == RTW_RX_HANDLED) + return ret; - if (!psta) { - ret = _FAIL; - goto exit; - } + if (!psta) + return _FAIL; /* psta->rssi = prxcmd->rssi; */ /* psta->signal_quality = prxcmd->sq; */ @@ -1014,16 +975,16 @@ static int validate_recv_data_frame(struct adapter *adapter, pattrib->ack_policy = 0; /* parsing QC field */ if (pattrib->qos) { - pattrib->priority = GetPriority((ptr + 24)); + pattrib->priority = ieee80211_get_tid(hdr); pattrib->ack_policy = GetAckpolicy((ptr + 24)); pattrib->amsdu = GetAMsdu((ptr + 24)); - pattrib->hdrlen = pattrib->to_fr_ds == 3 ? 32 : 26; + pattrib->hdrlen = 26; if (pattrib->priority != 0 && pattrib->priority != 3) adapter->recvpriv.bIsAnyNonBEPkts = true; } else { pattrib->priority = 0; - pattrib->hdrlen = pattrib->to_fr_ds == 3 ? 30 : 24; + pattrib->hdrlen = 24; } if (pattrib->order)/* HT-CTRL 11n */ @@ -1032,10 +993,9 @@ static int validate_recv_data_frame(struct adapter *adapter, precv_frame->preorder_ctrl = &psta->recvreorder_ctrl[pattrib->priority]; /* decache, drop duplicate recv packets */ - if (recv_decache(precv_frame, bretry, &psta->sta_recvpriv.rxcache) == _FAIL) { - ret = _FAIL; - goto exit; - } + if (recv_decache(precv_frame, ieee80211_has_retry(hdr->frame_control), + &psta->sta_recvpriv.rxcache) == _FAIL) + return _FAIL; if (pattrib->privacy) { GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, is_multicast_ether_addr(pattrib->ra)); @@ -1047,9 +1007,7 @@ static int validate_recv_data_frame(struct adapter *adapter, pattrib->icv_len = 0; } -exit: - - return ret; + return _SUCCESS; } static int validate_recv_frame(struct adapter *adapter, struct recv_frame *precv_frame) @@ -1059,11 +1017,8 @@ static int validate_recv_frame(struct adapter *adapter, struct recv_frame *precv /* then call check if rx seq/frag. duplicated. */ int retval = _FAIL; - u8 bDumpRxPkt; struct rx_pkt_attrib *pattrib = &precv_frame->attrib; - u8 *ptr = precv_frame->rx_data; - __le16 fc = *(__le16 *)ptr; - u8 ver = (unsigned char)(*ptr) & 0x3; + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)precv_frame->rx_data; struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) { @@ -1072,32 +1027,26 @@ static int validate_recv_frame(struct adapter *adapter, struct recv_frame *precv pmlmeext->channel_set[ch_set_idx].rx_count++; } - /* add version chk */ - if (ver != 0) + if ((hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_VERS)) != 0) return _FAIL; - pattrib->to_fr_ds = get_tofr_ds(ptr); - - pattrib->frag_num = GetFragNum(ptr); - pattrib->seq_num = GetSequence(ptr); + pattrib->frag_num = le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG; + pattrib->seq_num = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl)); - pattrib->pw_save = GetPwrMgt(ptr); - pattrib->mfrag = ieee80211_has_morefrags(fc); - pattrib->mdata = ieee80211_has_moredata(fc); - pattrib->privacy = ieee80211_has_protected(fc); - pattrib->order = ieee80211_has_order(fc); - - /* Dump rx packets */ - GetHalDefVar8188EUsb(adapter, HAL_DEF_DBG_DUMP_RXPKT, &bDumpRxPkt); + pattrib->pw_save = ieee80211_has_pm(hdr->frame_control); + pattrib->mfrag = ieee80211_has_morefrags(hdr->frame_control); + pattrib->mdata = ieee80211_has_moredata(hdr->frame_control); + pattrib->privacy = ieee80211_has_protected(hdr->frame_control); + pattrib->order = ieee80211_has_order(hdr->frame_control); /* We return _SUCCESS only for data frames. */ - if (ieee80211_is_mgmt(fc)) + if (ieee80211_is_mgmt(hdr->frame_control)) validate_recv_mgnt_frame(adapter, precv_frame); - else if (ieee80211_is_ctl(fc)) + else if (ieee80211_is_ctl(hdr->frame_control)) validate_recv_ctrl_frame(adapter, precv_frame); - else if (ieee80211_is_data(fc)) { + else if (ieee80211_is_data(hdr->frame_control)) { rtw_led_control(adapter, LED_CTL_RX); - pattrib->qos = ieee80211_is_data_qos(fc); + pattrib->qos = ieee80211_is_data_qos(hdr->frame_control); retval = validate_recv_data_frame(adapter, precv_frame); if (retval == _FAIL) { struct recv_priv *precvpriv = &adapter->recvpriv; @@ -1284,8 +1233,9 @@ struct recv_frame *recvframe_chk_defrag(struct adapter *padapter, struct recv_fr psta_addr = pfhdr->attrib.ta; psta = rtw_get_stainfo(pstapriv, psta_addr); if (!psta) { - u8 type = GetFrameType(pfhdr->rx_data); - if (type != WIFI_DATA_TYPE) { + __le16 fc = *(__le16 *)pfhdr->rx_data; + + if (ieee80211_is_data(fc)) { psta = rtw_get_bcmc_stainfo(padapter); pdefrag_q = &psta->sta_recvpriv.defrag_q; } else { @@ -1723,12 +1673,9 @@ static int recv_func_prehandle(struct adapter *padapter, struct recv_frame *rfra /* check the frame crtl field and decache */ ret = validate_recv_frame(padapter, rframe); - if (ret != _SUCCESS) { + if (ret != _SUCCESS) rtw_free_recvframe(rframe, pfree_recv_queue);/* free this recv_frame */ - goto exit; - } -exit: return ret; } diff --git a/drivers/staging/r8188eu/core/rtw_security.c b/drivers/staging/r8188eu/core/rtw_security.c index 2cdcdfd5ca5c..5bba57d18b5f 100644 --- a/drivers/staging/r8188eu/core/rtw_security.c +++ b/drivers/staging/r8188eu/core/rtw_security.c @@ -63,7 +63,7 @@ void rtw_wep_encrypt(struct adapter *padapter, struct xmit_frame *pxmitframe) arc4_crypt(ctx, payload + length, crc.f1, 4); pframe += pxmitpriv->frag_len; - pframe = (u8 *)RND4((size_t)(pframe)); + pframe = PTR_ALIGN(pframe, 4); } } } @@ -504,7 +504,7 @@ u32 rtw_tkip_encrypt(struct adapter *padapter, struct xmit_frame *pxmitframe) arc4_crypt(ctx, payload + length, crc.f1, 4); pframe += pxmitpriv->frag_len; - pframe = (u8 *)RND4((size_t)(pframe)); + pframe = PTR_ALIGN(pframe, 4); } } } else { @@ -1133,7 +1133,7 @@ u32 rtw_aes_encrypt(struct adapter *padapter, struct xmit_frame *pxmitframe) aes_cipher(prwskey, pattrib->hdrlen, pframe, length); pframe += pxmitpriv->frag_len; - pframe = (u8 *)RND4((size_t)(pframe)); + pframe = PTR_ALIGN(pframe, 4); } } } else { diff --git a/drivers/staging/r8188eu/core/rtw_sta_mgt.c b/drivers/staging/r8188eu/core/rtw_sta_mgt.c index 91ff82f24f1f..357f98e22d8a 100644 --- a/drivers/staging/r8188eu/core/rtw_sta_mgt.c +++ b/drivers/staging/r8188eu/core/rtw_sta_mgt.c @@ -470,9 +470,9 @@ u8 rtw_access_ctrl(struct adapter *padapter, u8 *mac_addr) spin_unlock_bh(&pacl_node_q->lock); if (pacl_list->mode == 1)/* accept unless in deny list */ - res = (match) ? false : true; + res = !match; else if (pacl_list->mode == 2)/* deny unless in accept list */ - res = (match) ? true : false; + res = match; else res = true; diff --git a/drivers/staging/r8188eu/core/rtw_wlan_util.c b/drivers/staging/r8188eu/core/rtw_wlan_util.c index 665b077190bc..392a65783f32 100644 --- a/drivers/staging/r8188eu/core/rtw_wlan_util.c +++ b/drivers/staging/r8188eu/core/rtw_wlan_util.c @@ -276,14 +276,6 @@ void Restore_DM_Func_Flag(struct adapter *padapter) SetHwReg8188EU(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&saveflag)); } -void Switch_DM_Func(struct adapter *padapter, u32 mode, u8 enable) -{ - if (enable) - SetHwReg8188EU(padapter, HW_VAR_DM_FUNC_SET, (u8 *)(&mode)); - else - SetHwReg8188EU(padapter, HW_VAR_DM_FUNC_CLR, (u8 *)(&mode)); -} - void Set_MSR(struct adapter *padapter, u8 type) { u8 val8; @@ -511,6 +503,31 @@ int WMM_param_handler(struct adapter *padapter, struct ndis_802_11_var_ie *pIE) return true; } +static void set_acm_ctrl(struct adapter *adapter, u8 acm_mask) +{ + u8 acmctrl = rtw_read8(adapter, REG_ACMHWCTRL); + + if (acm_mask > 1) + acmctrl = acmctrl | 0x1; + + if (acm_mask & BIT(3)) + acmctrl |= ACMHW_VOQEN; + else + acmctrl &= (~ACMHW_VOQEN); + + if (acm_mask & BIT(2)) + acmctrl |= ACMHW_VIQEN; + else + acmctrl &= (~ACMHW_VIQEN); + + if (acm_mask & BIT(1)) + acmctrl |= ACMHW_BEQEN; + else + acmctrl &= (~ACMHW_BEQEN); + + rtw_write8(adapter, REG_ACMHWCTRL, acmctrl); +} + void WMMOnAssocRsp(struct adapter *padapter) { u8 ACI, ACM, AIFS, ECWMin, ECWMax, aSifsTime; @@ -522,6 +539,7 @@ void WMMOnAssocRsp(struct adapter *padapter) struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct registry_priv *pregpriv = &padapter->registrypriv; + struct hal_data_8188e *haldata = &padapter->haldata; if (pmlmeinfo->WMM_enable == 0) { padapter->mlmepriv.acm_mask = 0; @@ -550,7 +568,8 @@ void WMMOnAssocRsp(struct adapter *padapter) switch (ACI) { case 0x0: - SetHwReg8188EU(padapter, HW_VAR_AC_PARAM_BE, (u8 *)(&acParm)); + haldata->AcParam_BE = acParm; + rtw_write32(padapter, REG_EDCA_BE_PARAM, acParm); acm_mask |= (ACM ? BIT(1) : 0); edca[XMIT_BE_QUEUE] = acParm; break; @@ -572,7 +591,7 @@ void WMMOnAssocRsp(struct adapter *padapter) } if (padapter->registrypriv.acm_method == 1) - SetHwReg8188EU(padapter, HW_VAR_ACM_CTRL, (u8 *)(&acm_mask)); + set_acm_ctrl(padapter, acm_mask); else padapter->mlmepriv.acm_mask = acm_mask; @@ -743,6 +762,35 @@ void HT_info_handler(struct adapter *padapter, struct ndis_802_11_var_ie *pIE) memcpy(&pmlmeinfo->HT_info, pIE->data, pIE->Length); } +static void set_min_ampdu_spacing(struct adapter *adapter, u8 spacing) +{ + u8 sec_spacing; + + if (spacing <= 7) { + switch (adapter->securitypriv.dot11PrivacyAlgrthm) { + case _NO_PRIVACY_: + case _AES_: + sec_spacing = 0; + break; + case _WEP40_: + case _WEP104_: + case _TKIP_: + case _TKIP_WTMIC_: + sec_spacing = 6; + break; + default: + sec_spacing = 7; + break; + } + + if (spacing < sec_spacing) + spacing = sec_spacing; + + rtw_write8(adapter, REG_AMPDU_MIN_SPACE, + (rtw_read8(adapter, REG_AMPDU_MIN_SPACE) & 0xf8) | spacing); + } +} + void HTOnAssocRsp(struct adapter *padapter) { unsigned char max_AMPDU_len; @@ -767,7 +815,7 @@ void HTOnAssocRsp(struct adapter *padapter) min_MPDU_spacing = (pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) >> 2; - SetHwReg8188EU(padapter, HW_VAR_AMPDU_MIN_SPACE, (u8 *)(&min_MPDU_spacing)); + set_min_ampdu_spacing(padapter, min_MPDU_spacing); SetHwReg8188EU(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len)); } @@ -846,7 +894,7 @@ int rtw_check_bcn_info(struct adapter *Adapter, u8 *pframe, u32 packet_len) if (!is_client_associated_to_ap(Adapter)) return true; - len = packet_len - sizeof(struct rtw_ieee80211_hdr_3addr); + len = packet_len - sizeof(struct ieee80211_hdr_3addr); if (len > MAX_IE_SZ) return _FAIL; @@ -867,7 +915,7 @@ int rtw_check_bcn_info(struct adapter *Adapter, u8 *pframe, u32 packet_len) /* below is to copy the information element */ bssid->IELength = len; - memcpy(bssid->IEs, (pframe + sizeof(struct rtw_ieee80211_hdr_3addr)), bssid->IELength); + memcpy(bssid->IEs, (pframe + sizeof(struct ieee80211_hdr_3addr)), bssid->IELength); /* check bw and channel offset */ /* parsing HT_CAP_IE */ @@ -916,7 +964,7 @@ int rtw_check_bcn_info(struct adapter *Adapter, u8 *pframe, u32 packet_len) else hidden_ssid = false; - if ((NULL != p) && (false == hidden_ssid && (*(p + 1)))) { + if (p && (!hidden_ssid && (*(p + 1)))) { memcpy(bssid->Ssid.Ssid, (p + 2), *(p + 1)); bssid->Ssid.SsidLength = *(p + 1); } else { @@ -1275,14 +1323,10 @@ void update_IOT_info(struct adapter *padapter) case HT_IOT_PEER_RALINK: pmlmeinfo->turboMode_cts2self = 0; pmlmeinfo->turboMode_rtsen = 1; - /* disable high power */ - Switch_DM_Func(padapter, (~DYNAMIC_BB_DYNAMIC_TXPWR), false); break; case HT_IOT_PEER_REALTEK: /* rtw_write16(padapter, 0x4cc, 0xffff); */ /* rtw_write16(padapter, 0x546, 0x01c0); */ - /* disable high power */ - Switch_DM_Func(padapter, (~DYNAMIC_BB_DYNAMIC_TXPWR), false); break; default: pmlmeinfo->turboMode_cts2self = 0; @@ -1291,26 +1335,36 @@ void update_IOT_info(struct adapter *padapter) } } +static void set_ack_preamble(struct adapter *adapter, bool short_preamble) +{ + struct hal_data_8188e *haldata = &adapter->haldata; + u8 val8; + + /* Joseph marked out for Netgear 3500 TKIP channel 7 issue.(Temporarily) */ + val8 = haldata->nCur40MhzPrimeSC << 5; + if (short_preamble) + val8 |= 0x80; + + rtw_write8(adapter, REG_RRSR + 2, val8); +}; + void update_capinfo(struct adapter *Adapter, u16 updateCap) { struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - bool ShortPreamble; /* Check preamble mode, 2005.01.06, by rcnjko. */ /* Mark to update preamble value forever, 2008.03.18 by lanhsin */ if (updateCap & cShortPreamble) { /* Short Preamble */ if (pmlmeinfo->preamble_mode != PREAMBLE_SHORT) { /* PREAMBLE_LONG or PREAMBLE_AUTO */ - ShortPreamble = true; pmlmeinfo->preamble_mode = PREAMBLE_SHORT; - SetHwReg8188EU(Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble); + set_ack_preamble(Adapter, true); } } else { /* Long Preamble */ if (pmlmeinfo->preamble_mode != PREAMBLE_LONG) { /* PREAMBLE_SHORT or PREAMBLE_AUTO */ - ShortPreamble = false; pmlmeinfo->preamble_mode = PREAMBLE_LONG; - SetHwReg8188EU(Adapter, HW_VAR_ACK_PREAMBLE, (u8 *)&ShortPreamble); + set_ack_preamble(Adapter, false); } } @@ -1338,7 +1392,6 @@ void update_capinfo(struct adapter *Adapter, u16 updateCap) void update_wireless_mode(struct adapter *padapter) { int ratelen, network_type = 0; - u32 SIFS_Timer; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; struct wlan_bssid_ex *cur_network = &pmlmeinfo->network; @@ -1365,10 +1418,12 @@ void update_wireless_mode(struct adapter *padapter) pmlmeext->cur_wireless_mode = network_type & padapter->registrypriv.wireless_mode; - SIFS_Timer = 0x0a0a0808;/* 0x0808 -> for CCK, 0x0a0a -> for OFDM */ - /* change this value if having IOT issues. */ - - SetHwReg8188EU(padapter, HW_VAR_RESP_SIFS, (u8 *)&SIFS_Timer); + /* RESP_SIFS for CCK */ + rtw_write8(padapter, REG_R2T_SIFS, 0x08); + rtw_write8(padapter, REG_R2T_SIFS + 1, 0x08); + /* RESP_SIFS for OFDM */ + rtw_write8(padapter, REG_T2T_SIFS, 0x0a); + rtw_write8(padapter, REG_T2T_SIFS + 1, 0x0a); if (pmlmeext->cur_wireless_mode & WIRELESS_11B) update_mgnt_tx_rate(padapter, IEEE80211_CCK_RATE_1MB); @@ -1411,34 +1466,12 @@ int update_sta_support_rate(struct adapter *padapter, u8 *pvar_ie, uint var_ie_l return _SUCCESS; } -void process_addba_req(struct adapter *padapter, u8 *paddba_req, u8 *addr) -{ - struct sta_info *psta; - u16 tid; - u16 param; - struct recv_reorder_ctrl *preorder_ctrl; - struct sta_priv *pstapriv = &padapter->stapriv; - struct ADDBA_request *preq = (struct ADDBA_request *)paddba_req; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - - psta = rtw_get_stainfo(pstapriv, addr); - - if (psta) { - param = le16_to_cpu(preq->BA_para_set); - tid = (param >> 2) & 0x0f; - preorder_ctrl = &psta->recvreorder_ctrl[tid]; - preorder_ctrl->indicate_seq = 0xffff; - preorder_ctrl->enable = (pmlmeinfo->bAcceptAddbaReq) ? true : false; - } -} - void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len) { u8 *pIE; __le32 *pbuf; - pIE = pframe + sizeof(struct rtw_ieee80211_hdr_3addr); + pIE = pframe + sizeof(struct ieee80211_hdr_3addr); pbuf = (__le32 *)pIE; pmlmeext->TSFValue = le32_to_cpu(*(pbuf + 1)); diff --git a/drivers/staging/r8188eu/core/rtw_xmit.c b/drivers/staging/r8188eu/core/rtw_xmit.c index c2a550e7250e..3d8e9dea7651 100644 --- a/drivers/staging/r8188eu/core/rtw_xmit.c +++ b/drivers/staging/r8188eu/core/rtw_xmit.c @@ -52,8 +52,8 @@ s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, struct adapter *padapter) sema_init(&pxmitpriv->terminate_xmitthread_sema, 0); /* - Please insert all the queue initializaiton using rtw_init_queue below - */ + * Please insert all the queue initializaiton using rtw_init_queue below + */ pxmitpriv->adapter = padapter; @@ -66,10 +66,10 @@ s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, struct adapter *padapter) rtw_init_queue(&pxmitpriv->free_xmit_queue); /* - Please allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME, - and initialize free_xmit_frame below. - Please also apply free_txobj to link_up all the xmit_frames... - */ + * Please allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME, + * and initialize free_xmit_frame below. + * Please also apply free_txobj to link_up all the xmit_frames... + */ pxmitpriv->pallocated_frame_buf = vzalloc(NR_XMITFRAME * sizeof(struct xmit_frame) + 4); @@ -178,7 +178,12 @@ s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, struct adapter *padapter) pxmitpriv->free_xmit_extbuf_cnt = num_xmit_extbuf; - rtw_alloc_hwxmits(padapter); + res = rtw_alloc_hwxmits(padapter); + if (res) { + res = _FAIL; + goto exit; + } + rtw_init_hwxmits(pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry); for (i = 0; i < 4; i++) @@ -399,7 +404,7 @@ static void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib) pattrib->priority = user_prio; pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN; - pattrib->subtype = WIFI_QOS_DATA_TYPE; + pattrib->subtype = IEEE80211_STYPE_QOS_DATA | IEEE80211_FTYPE_DATA; } static s32 update_attrib(struct adapter *padapter, struct sk_buff *pkt, struct pkt_attrib *pattrib) @@ -448,14 +453,12 @@ static s32 update_attrib(struct adapter *padapter, struct sk_buff *pkt, struct p _rtw_pktfile_read(&pktfile, &tmp[0], 24); pattrib->dhcp_pkt = 0; if (pktfile.pkt_len > 282) {/* MINIMUM_DHCP_PACKET_SIZE) { */ - if (ETH_P_IP == pattrib->ether_type) {/* IP header */ - if (((tmp[21] == 68) && (tmp[23] == 67)) || - ((tmp[21] == 67) && (tmp[23] == 68))) { - /* 68 : UDP BOOTP client */ - /* 67 : UDP BOOTP server */ - /* Use low rate to send DHCP packet. */ - pattrib->dhcp_pkt = 1; - } + if (((tmp[21] == 68) && (tmp[23] == 67)) || + ((tmp[21] == 67) && (tmp[23] == 68))) { + /* 68 : UDP BOOTP client */ + /* 67 : UDP BOOTP server */ + /* Use low rate to send DHCP packet. */ + pattrib->dhcp_pkt = 1; } } } @@ -497,7 +500,7 @@ static s32 update_attrib(struct adapter *padapter, struct sk_buff *pkt, struct p pattrib->pkt_hdrlen = ETH_HLEN;/* pattrib->ether_type == 0x8100) ? (14 + 4): 14; vlan tag */ pattrib->hdrlen = WLAN_HDR_A3_LEN; - pattrib->subtype = WIFI_DATA_TYPE; + pattrib->subtype = IEEE80211_FTYPE_DATA; pattrib->priority = 0; if (check_fwstate(pmlmepriv, WIFI_AP_STATE | WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE)) { @@ -642,7 +645,7 @@ static s32 xmitframe_addmic(struct adapter *padapter, struct xmit_frame *pxmitfr payload = pframe; for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) { - payload = (u8 *)RND4((size_t)(payload)); + payload = PTR_ALIGN(payload, 4); payload = payload + pattrib->hdrlen + pattrib->iv_len; if ((curfragnum + 1) == pattrib->nr_frags) { @@ -696,13 +699,13 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr { u16 *qc; - struct rtw_ieee80211_hdr *pwlanhdr = (struct rtw_ieee80211_hdr *)hdr; + struct ieee80211_hdr *pwlanhdr = (struct ieee80211_hdr *)hdr; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct qos_priv *pqospriv = &pmlmepriv->qospriv; u8 qos_option = false; int res = _SUCCESS; - __le16 *fctrl = &pwlanhdr->frame_ctl; + __le16 *fctrl = &pwlanhdr->frame_control; struct sta_info *psta; @@ -717,7 +720,7 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr SetFrameSubType(fctrl, pattrib->subtype); - if (pattrib->subtype & WIFI_DATA_TYPE) { + if (pattrib->subtype & IEEE80211_FTYPE_DATA) { if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) { /* to_ds = 1, fr_ds = 0; */ /* Data transfer to AP */ @@ -853,22 +856,19 @@ s32 rtw_txframes_sta_ac_pending(struct adapter *padapter, struct pkt_attrib *pat } /* - -This sub-routine will perform all the following: - -1. remove 802.3 header. -2. create wlan_header, based on the info in pxmitframe -3. append sta's iv/ext-iv -4. append LLC -5. move frag chunk from pframe to pxmitframe->mem -6. apply sw-encrypt, if necessary. - -*/ + * This sub-routine will perform all the following: + * + * 1. remove 802.3 header. + * 2. create wlan_header, based on the info in pxmitframe + * 3. append sta's iv/ext-iv + * 4. append LLC + * 5. move frag chunk from pframe to pxmitframe->mem + * 6. apply sw-encrypt, if necessary. + */ s32 rtw_xmitframe_coalesce(struct adapter *padapter, struct sk_buff *pkt, struct xmit_frame *pxmitframe) { struct pkt_file pktfile; s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz; - size_t addr; u8 *pframe, *mem_start; u8 hw_hdr_offset; struct sta_info *psta; @@ -985,9 +985,7 @@ s32 rtw_xmitframe_coalesce(struct adapter *padapter, struct sk_buff *pkt, struct break; } - addr = (size_t)(pframe); - - mem_start = (unsigned char *)RND4(addr) + hw_hdr_offset; + mem_start = PTR_ALIGN(pframe, 4) + hw_hdr_offset; memcpy(mem_start, pbuf_start + hw_hdr_offset, pattrib->hdrlen); } @@ -1210,24 +1208,22 @@ s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) } /* -Calling context: -1. OS_TXENTRY -2. RXENTRY (rx_thread or RX_ISR/RX_CallBack) - -If we turn on USE_RXTHREAD, then, no need for critical section. -Otherwise, we must use _enter/_exit critical to protect free_xmit_queue... - -Must be very very cautious... - -*/ - + * Calling context: + * 1. OS_TXENTRY + * 2. RXENTRY (rx_thread or RX_ISR/RX_CallBack) + * + * If we turn on USE_RXTHREAD, then, no need for critical section. + * Otherwise, we must use _enter/_exit critical to protect free_xmit_queue... + * + * Must be very very cautious... + */ struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv)/* _queue *pfree_xmit_queue) */ { /* - Please remember to use all the osdep_service api, - and lock/unlock or _enter/_exit critical to protect - pfree_xmit_queue - */ + * Please remember to use all the osdep_service api, + * and lock/unlock or _enter/_exit critical to protect + * pfree_xmit_queue + */ struct xmit_frame *pxframe = NULL; struct list_head *plist, *phead; @@ -1474,7 +1470,7 @@ exit: return res; } -void rtw_alloc_hwxmits(struct adapter *padapter) +int rtw_alloc_hwxmits(struct adapter *padapter) { struct hw_xmit *hwxmits; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; @@ -1482,6 +1478,8 @@ void rtw_alloc_hwxmits(struct adapter *padapter) pxmitpriv->hwxmit_entry = HWXMIT_ENTRY; pxmitpriv->hwxmits = kzalloc(sizeof(struct hw_xmit) * pxmitpriv->hwxmit_entry, GFP_KERNEL); + if (!pxmitpriv->hwxmits) + return -ENOMEM; hwxmits = pxmitpriv->hwxmits; @@ -1498,6 +1496,8 @@ void rtw_alloc_hwxmits(struct adapter *padapter) hwxmits[3] .sta_queue = &pxmitpriv->bk_pending; } else { } + + return 0; } void rtw_free_hwxmits(struct adapter *padapter) diff --git a/drivers/staging/r8188eu/hal/HalHWImg8188E_BB.c b/drivers/staging/r8188eu/hal/HalHWImg8188E_BB.c index e7f834b02567..7901d0afa2e7 100644 --- a/drivers/staging/r8188eu/hal/HalHWImg8188E_BB.c +++ b/drivers/staging/r8188eu/hal/HalHWImg8188E_BB.c @@ -170,7 +170,7 @@ enum HAL_STATUS ODM_ReadAndConfig_AGC_TAB_1T_8188E(struct odm_dm_struct *dm_odm) { u32 hex = 0; u32 i = 0; - u32 arraylen = sizeof(array_agc_tab_1t_8188e) / sizeof(u32); + u32 arraylen = ARRAY_SIZE(array_agc_tab_1t_8188e); u32 *array = array_agc_tab_1t_8188e; bool biol = false; struct adapter *adapter = dm_odm->Adapter; @@ -446,7 +446,7 @@ enum HAL_STATUS ODM_ReadAndConfig_PHY_REG_1T_8188E(struct odm_dm_struct *dm_odm) { u32 hex = 0; u32 i = 0; - u32 arraylen = sizeof(array_phy_reg_1t_8188e) / sizeof(u32); + u32 arraylen = ARRAY_SIZE(array_phy_reg_1t_8188e); u32 *array = array_phy_reg_1t_8188e; bool biol = false; struct adapter *adapter = dm_odm->Adapter; @@ -651,7 +651,7 @@ void ODM_ReadAndConfig_PHY_REG_PG_8188E(struct odm_dm_struct *dm_odm) { u32 hex; u32 i = 0; - u32 arraylen = sizeof(array_phy_reg_pg_8188e) / sizeof(u32); + u32 arraylen = ARRAY_SIZE(array_phy_reg_pg_8188e); u32 *array = array_phy_reg_pg_8188e; hex = ODM_ITRF_USB << 8; diff --git a/drivers/staging/r8188eu/hal/HalHWImg8188E_MAC.c b/drivers/staging/r8188eu/hal/HalHWImg8188E_MAC.c index 20ce1571fc26..77b25885c63b 100644 --- a/drivers/staging/r8188eu/hal/HalHWImg8188E_MAC.c +++ b/drivers/staging/r8188eu/hal/HalHWImg8188E_MAC.c @@ -132,7 +132,7 @@ enum HAL_STATUS ODM_ReadAndConfig_MAC_REG_8188E(struct odm_dm_struct *dm_odm) u32 hex = 0; u32 i; - u32 array_len = sizeof(array_MAC_REG_8188E) / sizeof(u32); + u32 array_len = ARRAY_SIZE(array_MAC_REG_8188E); u32 *array = array_MAC_REG_8188E; bool biol = false; diff --git a/drivers/staging/r8188eu/hal/HalHWImg8188E_RF.c b/drivers/staging/r8188eu/hal/HalHWImg8188E_RF.c index 9dc888a66d09..08cbfce3808d 100644 --- a/drivers/staging/r8188eu/hal/HalHWImg8188E_RF.c +++ b/drivers/staging/r8188eu/hal/HalHWImg8188E_RF.c @@ -138,7 +138,7 @@ enum HAL_STATUS ODM_ReadAndConfig_RadioA_1T_8188E(struct odm_dm_struct *pDM_Odm) u32 hex = 0; u32 i = 0; - u32 ArrayLen = sizeof(Array_RadioA_1T_8188E) / sizeof(u32); + u32 ArrayLen = ARRAY_SIZE(Array_RadioA_1T_8188E); u32 *Array = Array_RadioA_1T_8188E; bool biol = false; struct adapter *Adapter = pDM_Odm->Adapter; diff --git a/drivers/staging/r8188eu/hal/HalPwrSeqCmd.c b/drivers/staging/r8188eu/hal/HalPwrSeqCmd.c index 5b91aec6a7e3..150ea380c39e 100644 --- a/drivers/staging/r8188eu/hal/HalPwrSeqCmd.c +++ b/drivers/staging/r8188eu/hal/HalPwrSeqCmd.c @@ -1,30 +1,8 @@ // SPDX-License-Identifier: GPL-2.0 /* Copyright(c) 2007 - 2011 Realtek Corporation. */ -/*++ - -Module Name: - HalPwrSeqCmd.c - -Abstract: - Implement HW Power sequence configuration CMD handling routine for Realtek devices. - -Major Change History: - When Who What - ---------- --------------- ------------------------------- - 2011-10-26 Lucas Modify to be compatible with SD4-CE driver. - 2011-07-07 Roger Create. - ---*/ - #include "../include/HalPwrSeqCmd.h" -/* Description: */ -/* This routine deals with the Power Configuration CMDs parsing - * for RTL8723/RTL8188E Series IC. - * Assumption: - * We should follow specific format which was released from HW SD. - */ u8 HalPwrSeqCmdParsing(struct adapter *padapter, struct wl_pwr_cfg pwrseqcmd[]) { struct wl_pwr_cfg pwrcfgcmd = {0}; diff --git a/drivers/staging/r8188eu/hal/hal_com.c b/drivers/staging/r8188eu/hal/hal_com.c index 06f2a9083056..910cc07f656c 100644 --- a/drivers/staging/r8188eu/hal/hal_com.c +++ b/drivers/staging/r8188eu/hal/hal_com.c @@ -44,7 +44,7 @@ void dump_chip_info(struct HAL_VERSION chip_vers) cnt += sprintf((buf + cnt), "1T1R_"); - cnt += sprintf((buf + cnt), "RomVer(%d)\n", chip_vers.ROMVer); + cnt += sprintf((buf + cnt), "RomVer(%d)\n", 0); pr_info("%s", buf); } @@ -267,7 +267,7 @@ static void three_out_pipe(struct adapter *adapter, bool wifi_cfg) bool Hal_MappingOutPipe(struct adapter *adapter, u8 numoutpipe) { struct registry_priv *pregistrypriv = &adapter->registrypriv; - bool wifi_cfg = (pregistrypriv->wifi_spec) ? true : false; + bool wifi_cfg = pregistrypriv->wifi_spec; bool result = true; switch (numoutpipe) { diff --git a/drivers/staging/r8188eu/hal/odm_HWConfig.c b/drivers/staging/r8188eu/hal/odm_HWConfig.c index 87e9a5270be0..54cc3d7789cd 100644 --- a/drivers/staging/r8188eu/hal/odm_HWConfig.c +++ b/drivers/staging/r8188eu/hal/odm_HWConfig.c @@ -65,13 +65,13 @@ static void odm_RxPhyStatus92CSeries_Parsing(struct odm_dm_struct *dm_odm, struct phy_status_rpt *pPhyStaRpt = (struct phy_status_rpt *)pPhyStatus; - isCCKrate = ((pPktinfo->Rate >= DESC92C_RATE1M) && (pPktinfo->Rate <= DESC92C_RATE11M)) ? true : false; + isCCKrate = pPktinfo->Rate >= DESC92C_RATE1M && pPktinfo->Rate <= DESC92C_RATE11M; if (isCCKrate) { u8 cck_agc_rpt; /* (1)Hardware does not provide RSSI for CCK */ - /* (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) */ + /* (2)PWDB, Average PWDB calculated by hardware (for rate adaptive) */ cck_highpwr = dm_odm->bCckHighPower; @@ -170,7 +170,7 @@ static void odm_RxPhyStatus92CSeries_Parsing(struct odm_dm_struct *dm_odm, /* Get Rx snr value in DB */ dm_odm->PhyDbgInfo.RxSNRdB[i] = (s32)(pPhyStaRpt->path_rxsnr[i] / 2); } - /* (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive) */ + /* (2)PWDB, Average PWDB calculated by hardware (for rate adaptive) */ rx_pwr_all = (((pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all) >> 1) & 0x7f) - 110; PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); @@ -234,7 +234,7 @@ static void odm_Process_RSSIForDM(struct odm_dm_struct *dm_odm, if ((!pPktinfo->bPacketMatchBSSID)) return; - isCCKrate = ((pPktinfo->Rate >= DESC92C_RATE1M) && (pPktinfo->Rate <= DESC92C_RATE11M)) ? true : false; + isCCKrate = pPktinfo->Rate >= DESC92C_RATE1M && pPktinfo->Rate <= DESC92C_RATE11M; /* Smart Antenna Debug Message------------------ */ if ((dm_odm->AntDivType == CG_TRX_HW_ANTDIV) || (dm_odm->AntDivType == CGCS_RX_HW_ANTDIV)) { diff --git a/drivers/staging/r8188eu/hal/rtl8188e_cmd.c b/drivers/staging/r8188eu/hal/rtl8188e_cmd.c index f1464e4ba429..475650dc7301 100644 --- a/drivers/staging/r8188eu/hal/rtl8188e_cmd.c +++ b/drivers/staging/r8188eu/hal/rtl8188e_cmd.c @@ -199,16 +199,16 @@ void rtl8188e_set_FwMediaStatus_cmd(struct adapter *adapt, __le16 mstatus_rpt) static void ConstructBeacon(struct adapter *adapt, u8 *pframe, u32 *pLength) { - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; u32 rate_len, pktlen; struct mlme_ext_priv *pmlmeext = &adapt->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; struct wlan_bssid_ex *cur_network = &pmlmeinfo->network; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; eth_broadcast_addr(pwlanhdr->addr1); @@ -218,8 +218,8 @@ static void ConstructBeacon(struct adapter *adapt, u8 *pframe, u32 *pLength) SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); SetFrameSubType(pframe, WIFI_BEACON); - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pframe += sizeof(struct ieee80211_hdr_3addr); + pktlen = sizeof(struct ieee80211_hdr_3addr); /* timestamp will be inserted by hardware */ pframe += 8; @@ -281,15 +281,15 @@ _ConstructBeacon: static void ConstructPSPoll(struct adapter *adapt, u8 *pframe, u32 *pLength) { - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; struct mlme_ext_priv *pmlmeext = &adapt->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; __le16 *fctrl; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; /* Frame control. */ - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; SetPwrMgt(fctrl); SetFrameSubType(pframe, WIFI_PSPOLL); @@ -314,7 +314,7 @@ static void ConstructNullFunctionData(struct adapter *adapt, u8 *pframe, u8 bEosp, u8 bForcePowerSave) { - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; u32 pktlen; struct mlme_priv *pmlmepriv = &adapt->mlmepriv; @@ -322,9 +322,9 @@ static void ConstructNullFunctionData(struct adapter *adapt, u8 *pframe, struct mlme_ext_priv *pmlmeext = &adapt->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; if (bForcePowerSave) SetPwrMgt(fctrl); @@ -353,19 +353,19 @@ static void ConstructNullFunctionData(struct adapter *adapt, u8 *pframe, SetSeqNum(pwlanhdr, 0); if (bQoS) { - struct rtw_ieee80211_hdr_3addr_qos *pwlanqoshdr; + struct ieee80211_qos_hdr *pwlanqoshdr; SetFrameSubType(pframe, WIFI_QOS_DATA_NULL); - pwlanqoshdr = (struct rtw_ieee80211_hdr_3addr_qos *)pframe; - SetPriority(&pwlanqoshdr->qc, AC); - SetEOSP(&pwlanqoshdr->qc, bEosp); + pwlanqoshdr = (struct ieee80211_qos_hdr *)pframe; + SetPriority(&pwlanqoshdr->qos_ctrl, AC); + SetEOSP(&pwlanqoshdr->qos_ctrl, bEosp); - pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos); + pktlen = sizeof(struct ieee80211_qos_hdr); } else { SetFrameSubType(pframe, WIFI_DATA_NULL); - pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pktlen = sizeof(struct ieee80211_qos_hdr); } *pLength = pktlen; @@ -373,7 +373,7 @@ static void ConstructNullFunctionData(struct adapter *adapt, u8 *pframe, static void ConstructProbeRsp(struct adapter *adapt, u8 *pframe, u32 *pLength, u8 *StaAddr, bool bHideSSID) { - struct rtw_ieee80211_hdr *pwlanhdr; + struct ieee80211_hdr *pwlanhdr; __le16 *fctrl; u8 *mac, *bssid; u32 pktlen; @@ -381,12 +381,12 @@ static void ConstructProbeRsp(struct adapter *adapt, u8 *pframe, u32 *pLength, u struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; struct wlan_bssid_ex *cur_network = &pmlmeinfo->network; - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; + pwlanhdr = (struct ieee80211_hdr *)pframe; mac = myid(&adapt->eeprompriv); bssid = cur_network->MacAddress; - fctrl = &pwlanhdr->frame_ctl; + fctrl = &pwlanhdr->frame_control; *(fctrl) = 0; memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); memcpy(pwlanhdr->addr2, mac, ETH_ALEN); @@ -395,7 +395,7 @@ static void ConstructProbeRsp(struct adapter *adapt, u8 *pframe, u32 *pLength, u SetSeqNum(pwlanhdr, 0); SetFrameSubType(fctrl, WIFI_PROBERSP); - pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); + pktlen = sizeof(struct ieee80211_hdr_3addr); pframe += pktlen; if (cur_network->IELength > MAX_IE_SZ) @@ -557,8 +557,7 @@ void rtl8188e_set_FwJoinBssReport_cmd(struct adapter *adapt, u8 mstatus) rtw_write8(adapt, REG_FWHW_TXQ_CTRL + 2, (haldata->RegFwHwTxQCtrl & (~BIT(6)))); haldata->RegFwHwTxQCtrl &= (~BIT(6)); - /* Clear beacon valid check bit. */ - SetHwReg8188EU(adapt, HW_VAR_BCN_VALID, NULL); + clear_beacon_valid_bit(adapt); DLBcnCount = 0; poll = 0; do { @@ -569,7 +568,7 @@ void rtl8188e_set_FwJoinBssReport_cmd(struct adapter *adapt, u8 mstatus) yield(); /* mdelay(10); */ /* check rsvd page download OK. */ - GetHwReg8188EU(adapt, HW_VAR_BCN_VALID, (u8 *)(&bcn_valid)); + bcn_valid = get_beacon_valid_bit(adapt); poll++; } while (!bcn_valid && (poll % 10) != 0 && !adapt->bSurpriseRemoved && !adapt->bDriverStopped); } while (!bcn_valid && DLBcnCount <= 100 && !adapt->bSurpriseRemoved && !adapt->bDriverStopped); @@ -597,7 +596,7 @@ void rtl8188e_set_FwJoinBssReport_cmd(struct adapter *adapt, u8 mstatus) /* Update RSVD page location H2C to Fw. */ if (bcn_valid) - SetHwReg8188EU(adapt, HW_VAR_BCN_VALID, NULL); + clear_beacon_valid_bit(adapt); /* Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli. */ /* Clear CR[8] or beacon packet will not be send to TxBuf anymore. */ diff --git a/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c b/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c index 6811be95da9a..e17375a74f17 100644 --- a/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c +++ b/drivers/staging/r8188eu/hal/rtl8188e_hal_init.c @@ -33,17 +33,16 @@ static s32 iol_execute(struct adapter *padapter, u8 control) { s32 status = _FAIL; u8 reg_0x88 = 0; - u32 start = 0, passing_time = 0; + unsigned long timeout; control = control & 0x0f; reg_0x88 = rtw_read8(padapter, REG_HMEBOX_E0); rtw_write8(padapter, REG_HMEBOX_E0, reg_0x88 | control); - start = jiffies; + timeout = jiffies + msecs_to_jiffies(1000); while ((reg_0x88 = rtw_read8(padapter, REG_HMEBOX_E0)) & control && - (passing_time = rtw_get_passing_time_ms(start)) < 1000) { + time_before(jiffies, timeout)) ; - } reg_0x88 = rtw_read8(padapter, REG_HMEBOX_E0); status = (reg_0x88 & control) ? _FAIL : _SUCCESS; @@ -187,8 +186,8 @@ static void efuse_read_phymap_from_txpktbuf( u16 *size /* for efuse content: the max byte to read. will update to byte read */ ) { + unsigned long timeout; u16 dbg_addr = 0; - u32 start = 0, passing_time = 0; __le32 lo32 = 0, hi32 = 0; u16 len = 0, count = 0; int i = 0; @@ -207,9 +206,8 @@ static void efuse_read_phymap_from_txpktbuf( rtw_write16(adapter, REG_PKTBUF_DBG_ADDR, dbg_addr + i); rtw_write8(adapter, REG_TXPKTBUF_DBG, 0); - start = jiffies; - while (!rtw_read8(adapter, REG_TXPKTBUF_DBG) && - (passing_time = rtw_get_passing_time_ms(start)) < 1000) + timeout = jiffies + msecs_to_jiffies(1000); + while (!rtw_read8(adapter, REG_TXPKTBUF_DBG) && time_before(jiffies, timeout)) rtw_usleep_os(100); /* data from EEPROM needs to be in LE */ @@ -505,7 +503,6 @@ void rtl8188e_read_chip_version(struct adapter *padapter) ChipVersion.VendorType = ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : CHIP_VENDOR_TSMC); ChipVersion.CUTVersion = (value32 & CHIP_VER_RTL_MASK) >> CHIP_VER_RTL_SHIFT; /* IC version (CUT) */ - ChipVersion.ROMVer = 0; /* ROM code version. */ dump_chip_info(ChipVersion); diff --git a/drivers/staging/r8188eu/hal/rtl8188e_phycfg.c b/drivers/staging/r8188eu/hal/rtl8188e_phycfg.c index ea75ff11ad17..4864dafd887b 100644 --- a/drivers/staging/r8188eu/hal/rtl8188e_phycfg.c +++ b/drivers/staging/r8188eu/hal/rtl8188e_phycfg.c @@ -378,10 +378,10 @@ phy_InitBBRFRegisterDefinition( /* Tx AGC Gain Stage (same for all path. Should we remove this?) */ pHalData->PHYRegDef.rfTxGainStage = rFPGA0_TxGainStage; /* Tx gain stage */ - /* Tranceiver A~D HSSI Parameter-1 */ + /* Transceiver A~D HSSI Parameter-1 */ pHalData->PHYRegDef.rfHSSIPara1 = rFPGA0_XA_HSSIParameter1; /* wire control parameter1 */ - /* Tranceiver A~D HSSI Parameter-2 */ + /* Transceiver A~D HSSI Parameter-2 */ pHalData->PHYRegDef.rfHSSIPara2 = rFPGA0_XA_HSSIParameter2; /* wire control parameter2 */ /* RF switch Control */ @@ -405,10 +405,10 @@ phy_InitBBRFRegisterDefinition( /* Tx AFE control 2 */ pHalData->PHYRegDef.rfTxAFE = rOFDM0_XATxAFE; - /* Tranceiver LSSI Readback SI mode */ + /* Transceiver LSSI Readback SI mode */ pHalData->PHYRegDef.rfLSSIReadBack = rFPGA0_XA_LSSIReadBack; - /* Tranceiver LSSI Readback PI mode */ + /* Transceiver LSSI Readback PI mode */ pHalData->PHYRegDef.rfLSSIReadBackPi = TransceiverA_HSPI_Readback; } diff --git a/drivers/staging/r8188eu/hal/rtl8188e_rxdesc.c b/drivers/staging/r8188eu/hal/rtl8188e_rxdesc.c index 9bf7a9248026..dff0cba751df 100644 --- a/drivers/staging/r8188eu/hal/rtl8188e_rxdesc.c +++ b/drivers/staging/r8188eu/hal/rtl8188e_rxdesc.c @@ -113,12 +113,13 @@ void update_recvframe_phyinfo_88e(struct recv_frame *precvframe, struct phy_stat struct hal_data_8188e *pHalData = &padapter->haldata; struct phy_info *pPHYInfo = &pattrib->phy_info; u8 *wlanhdr = precvframe->rx_data; + __le16 fc = *(__le16 *)wlanhdr; struct odm_per_pkt_info pkt_info; u8 *sa = NULL; struct sta_priv *pstapriv; struct sta_info *psta; - pkt_info.bPacketMatchBSSID = ((!IsFrameTypeCtrl(wlanhdr)) && + pkt_info.bPacketMatchBSSID = ((!ieee80211_is_ctl(fc)) && !pattrib->icv_err && !pattrib->crc_err && !memcmp(get_hdr_bssid(wlanhdr), get_bssid(&padapter->mlmepriv), ETH_ALEN)); @@ -127,9 +128,7 @@ void update_recvframe_phyinfo_88e(struct recv_frame *precvframe, struct phy_stat (!memcmp(get_da(wlanhdr), myid(&padapter->eeprompriv), ETH_ALEN)); - pkt_info.bPacketBeacon = pkt_info.bPacketMatchBSSID && - (GetFrameSubType(wlanhdr) == WIFI_BEACON); - + pkt_info.bPacketBeacon = pkt_info.bPacketMatchBSSID && ieee80211_is_beacon(fc); if (pkt_info.bPacketBeacon) { if (check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE)) sa = padapter->mlmepriv.cur_network.network.MacAddress; diff --git a/drivers/staging/r8188eu/hal/rtl8188eu_xmit.c b/drivers/staging/r8188eu/hal/rtl8188eu_xmit.c index 55032d7ae7e3..bdfa51949289 100644 --- a/drivers/staging/r8188eu/hal/rtl8188eu_xmit.c +++ b/drivers/staging/r8188eu/hal/rtl8188eu_xmit.c @@ -347,7 +347,7 @@ static s32 rtw_dump_xframe(struct adapter *adapt, struct xmit_frame *pxmitframe) mem_addr += w_sz; - mem_addr = (u8 *)RND4(((size_t)(mem_addr))); + mem_addr = PTR_ALIGN(mem_addr, 4); } rtw_free_xmitframe(pxmitpriv, pxmitframe); @@ -437,7 +437,7 @@ bool rtl8188eu_xmitframe_complete(struct adapter *adapt, struct xmit_priv *pxmit pfirstframe = pxmitframe; len = xmitframe_need_length(pfirstframe) + TXDESC_SIZE + (pfirstframe->pkt_offset * PACKET_OFFSET_SZ); pbuf_tail = len; - pbuf = _RND8(pbuf_tail); + pbuf = round_up(pbuf_tail, 8); /* check pkt amount in one bulk */ desc_cnt = 0; @@ -488,7 +488,7 @@ bool rtl8188eu_xmitframe_complete(struct adapter *adapt, struct xmit_priv *pxmit len = xmitframe_need_length(pxmitframe) + TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ); - if (_RND8(pbuf + len) > MAX_XMITBUF_SZ) { + if (pbuf + len > MAX_XMITBUF_SZ) { pxmitframe->agg_num = 1; pxmitframe->pkt_offset = 1; break; @@ -511,7 +511,7 @@ bool rtl8188eu_xmitframe_complete(struct adapter *adapt, struct xmit_priv *pxmit /* handle pointer and stop condition */ pbuf_tail = pbuf + len; - pbuf = _RND8(pbuf_tail); + pbuf = round_up(pbuf_tail, 8); pfirstframe->agg_num++; if (MAX_TX_AGG_PACKET_NUMBER == pfirstframe->agg_num) diff --git a/drivers/staging/r8188eu/hal/usb_halinit.c b/drivers/staging/r8188eu/hal/usb_halinit.c index a92774352d2d..a217272a07f8 100644 --- a/drivers/staging/r8188eu/hal/usb_halinit.c +++ b/drivers/staging/r8188eu/hal/usb_halinit.c @@ -123,7 +123,7 @@ static void _InitQueueReservedPage(struct adapter *Adapter) if (haldata->OutEpQueueSel & TX_SELE_LQ) numLQ = 0x1C; - /* NOTE: This step shall be proceed before writting REG_RQPN. */ + /* NOTE: This step shall be proceed before writing REG_RQPN. */ if (haldata->OutEpQueueSel & TX_SELE_NQ) numNQ = 0x1C; value8 = (u8)_NPQ(numNQ); @@ -539,10 +539,6 @@ u32 rtl8188eu_hal_init(struct adapter *Adapter) /* Save target channel */ haldata->CurrentChannel = 6;/* default set to 6 */ - if (pwrctrlpriv->reg_rfoff) { - pwrctrlpriv->rf_pwrstate = rf_off; - } - /* 2010/08/09 MH We need to check if we need to turnon or off RF after detecting */ /* HW GPIO pin. Before PHY_RFConfig8192C. */ /* 2010/08/26 MH If Efuse does not support sective suspend then disable the function. */ @@ -942,17 +938,6 @@ static void hw_var_set_opmode(struct adapter *Adapter, u8 *val) } } -static void hw_var_set_bssid(struct adapter *Adapter, u8 *val) -{ - u8 idx = 0; - u32 reg_bssid; - - reg_bssid = REG_BSSID; - - for (idx = 0; idx < 6; idx++) - rtw_write8(Adapter, (reg_bssid + idx), val[idx]); -} - void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val) { struct hal_data_8188e *haldata = &Adapter->haldata; @@ -963,9 +948,6 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val) case HW_VAR_SET_OPMODE: hw_var_set_opmode(Adapter, val); break; - case HW_VAR_BSSID: - hw_var_set_bssid(Adapter, val); - break; case HW_VAR_BASIC_RATE: { u16 BrateCfg = 0; @@ -1024,17 +1006,6 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val) ResumeTxBeacon(Adapter); } break; - case HW_VAR_MLME_DISCONNECT: - /* Set RCR to not to receive data frame when NO LINK state */ - /* reject all data frames */ - rtw_write16(Adapter, REG_RXFLTMAP2, 0x00); - - /* reset TSF */ - rtw_write8(Adapter, REG_DUAL_TSF_RST, (BIT(0) | BIT(1))); - - /* disable update TSF */ - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) | BIT(4)); - break; case HW_VAR_MLME_SITESURVEY: if (*((u8 *)val)) { /* under sitesurvey */ /* config RCR to receive different BSSID & not to receive data frame */ @@ -1065,36 +1036,6 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val) rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR) | RCR_CBSSID_BCN); } break; - case HW_VAR_MLME_JOIN: - { - u8 RetryLimit = 0x30; - u8 type = *((u8 *)val); - struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; - - if (type == 0) { /* prepare to join */ - /* enable to rx data frame.Accept all data frame */ - rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF); - - rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR) | RCR_CBSSID_DATA | RCR_CBSSID_BCN); - - if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) - RetryLimit = 48; - else /* Ad-hoc Mode */ - RetryLimit = 0x7; - } else if (type == 1) { - /* joinbss_event call back when join res < 0 */ - rtw_write16(Adapter, REG_RXFLTMAP2, 0x00); - } else if (type == 2) { - /* sta add event call back */ - /* enable update TSF */ - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) & (~BIT(4))); - - if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE)) - RetryLimit = 0x7; - } - rtw_write16(Adapter, REG_RL, RetryLimit << RETRY_LIMIT_SHORT_SHIFT | RetryLimit << RETRY_LIMIT_LONG_SHIFT); - } - break; case HW_VAR_SLOT_TIME: { u8 u1bAIFS, aSifsTime; @@ -1119,26 +1060,6 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val) } } break; - case HW_VAR_RESP_SIFS: - /* RESP_SIFS for CCK */ - rtw_write8(Adapter, REG_R2T_SIFS, val[0]); /* SIFS_T2T_CCK (0x08) */ - rtw_write8(Adapter, REG_R2T_SIFS + 1, val[1]); /* SIFS_R2T_CCK(0x08) */ - /* RESP_SIFS for OFDM */ - rtw_write8(Adapter, REG_T2T_SIFS, val[2]); /* SIFS_T2T_OFDM (0x0a) */ - rtw_write8(Adapter, REG_T2T_SIFS + 1, val[3]); /* SIFS_R2T_OFDM(0x0a) */ - break; - case HW_VAR_ACK_PREAMBLE: - { - u8 regTmp; - u8 bShortPreamble = *((bool *)val); - /* Joseph marked out for Netgear 3500 TKIP channel 7 issue.(Temporarily) */ - regTmp = (haldata->nCur40MhzPrimeSC) << 5; - if (bShortPreamble) - regTmp |= 0x80; - - rtw_write8(Adapter, REG_RRSR + 2, regTmp); - } - break; case HW_VAR_DM_FLAG: podmpriv->SupportAbility = *((u8 *)val); break; @@ -1148,73 +1069,11 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val) else podmpriv->SupportAbility = podmpriv->BK_SupportAbility; break; - case HW_VAR_DM_FUNC_SET: - if (*((u32 *)val) == DYNAMIC_ALL_FUNC_ENABLE) { - podmpriv->SupportAbility = pdmpriv->InitODMFlag; - } else { - podmpriv->SupportAbility |= *((u32 *)val); - } + case HW_VAR_DM_FUNC_RESET: + podmpriv->SupportAbility = pdmpriv->InitODMFlag; break; case HW_VAR_DM_FUNC_CLR: - podmpriv->SupportAbility &= *((u32 *)val); - break; - case HW_VAR_AC_PARAM_BE: - haldata->AcParam_BE = ((u32 *)(val))[0]; - rtw_write32(Adapter, REG_EDCA_BE_PARAM, ((u32 *)(val))[0]); - break; - case HW_VAR_ACM_CTRL: - { - u8 acm_ctrl = *((u8 *)val); - u8 AcmCtrl = rtw_read8(Adapter, REG_ACMHWCTRL); - - if (acm_ctrl > 1) - AcmCtrl = AcmCtrl | 0x1; - - if (acm_ctrl & BIT(3)) - AcmCtrl |= AcmHw_VoqEn; - else - AcmCtrl &= (~AcmHw_VoqEn); - - if (acm_ctrl & BIT(2)) - AcmCtrl |= AcmHw_ViqEn; - else - AcmCtrl &= (~AcmHw_ViqEn); - - if (acm_ctrl & BIT(1)) - AcmCtrl |= AcmHw_BeqEn; - else - AcmCtrl &= (~AcmHw_BeqEn); - - rtw_write8(Adapter, REG_ACMHWCTRL, AcmCtrl); - } - break; - case HW_VAR_AMPDU_MIN_SPACE: - { - u8 MinSpacingToSet; - u8 SecMinSpace; - - MinSpacingToSet = *((u8 *)val); - if (MinSpacingToSet <= 7) { - switch (Adapter->securitypriv.dot11PrivacyAlgrthm) { - case _NO_PRIVACY_: - case _AES_: - SecMinSpace = 0; - break; - case _WEP40_: - case _WEP104_: - case _TKIP_: - case _TKIP_WTMIC_: - SecMinSpace = 6; - break; - default: - SecMinSpace = 7; - break; - } - if (MinSpacingToSet < SecMinSpace) - MinSpacingToSet = SecMinSpace; - rtw_write8(Adapter, REG_AMPDU_MIN_SPACE, (rtw_read8(Adapter, REG_AMPDU_MIN_SPACE) & 0xf8) | MinSpacingToSet); - } - } + podmpriv->SupportAbility = 0; break; case HW_VAR_AMPDU_FACTOR: { @@ -1242,221 +1101,15 @@ void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val) } } break; - case HW_VAR_RXDMA_AGG_PG_TH: - { - u8 threshold = *((u8 *)val); - if (threshold == 0) - threshold = USB_RXAGG_PAGE_COUNT; - rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, threshold); - } - break; - case HW_VAR_H2C_FW_PWRMODE: - { - u8 psmode = (*(u8 *)val); - - /* Forece leave RF low power mode for 1T1R to prevent conficting setting in Fw power */ - /* saving sequence. 2010.06.07. Added by tynli. Suggested by SD3 yschang. */ - if (psmode != PS_MODE_ACTIVE) - ODM_RF_Saving(podmpriv, true); - rtl8188e_set_FwPwrMode_cmd(Adapter, psmode); - } - break; - case HW_VAR_H2C_FW_JOINBSSRPT: - { - u8 mstatus = (*(u8 *)val); - rtl8188e_set_FwJoinBssReport_cmd(Adapter, mstatus); - } - break; - case HW_VAR_H2C_FW_P2P_PS_OFFLOAD: - { - u8 p2p_ps_state = (*(u8 *)val); - rtl8188e_set_p2p_ps_offload_cmd(Adapter, p2p_ps_state); - } - break; - case HW_VAR_INITIAL_GAIN: - { - struct rtw_dig *pDigTable = &podmpriv->DM_DigTable; - u32 rx_gain = ((u32 *)(val))[0]; - - if (rx_gain == 0xff) {/* restore rx gain */ - ODM_Write_DIG(podmpriv, pDigTable->BackupIGValue); - } else { - pDigTable->BackupIGValue = pDigTable->CurIGValue; - ODM_Write_DIG(podmpriv, rx_gain); - } - } - break; - case HW_VAR_RPT_TIMER_SETTING: - { - u16 min_rpt_time = (*(u16 *)val); - ODM_RA_Set_TxRPT_Time(podmpriv, min_rpt_time); - } - break; - case HW_VAR_ANTENNA_DIVERSITY_SELECT: - { - u8 Optimum_antenna = (*(u8 *)val); - u8 Ant; - /* switch antenna to Optimum_antenna */ - if (haldata->CurAntenna != Optimum_antenna) { - Ant = (Optimum_antenna == 2) ? MAIN_ANT : AUX_ANT; - ODM_UpdateRxIdleAnt_88E(&haldata->odmpriv, Ant); - - haldata->CurAntenna = Optimum_antenna; - } - } - break; - case HW_VAR_FIFO_CLEARN_UP: - { - struct pwrctrl_priv *pwrpriv = &Adapter->pwrctrlpriv; - u8 trycnt = 100; - - /* pause tx */ - rtw_write8(Adapter, REG_TXPAUSE, 0xff); - - /* keep sn */ - Adapter->xmitpriv.nqos_ssn = rtw_read16(Adapter, REG_NQOS_SEQ); - - if (!pwrpriv->bkeepfwalive) { - /* RX DMA stop */ - rtw_write32(Adapter, REG_RXPKT_NUM, (rtw_read32(Adapter, REG_RXPKT_NUM) | RW_RELEASE_EN)); - do { - if (!(rtw_read32(Adapter, REG_RXPKT_NUM) & RXDMA_IDLE)) - break; - } while (trycnt--); - - /* RQPN Load 0 */ - rtw_write16(Adapter, REG_RQPN_NPQ, 0x0); - rtw_write32(Adapter, REG_RQPN, 0x80000000); - mdelay(10); - } - } - break; - case HW_VAR_TX_RPT_MAX_MACID: - { - u8 maxMacid = *val; - rtw_write8(Adapter, REG_TX_RPT_CTRL + 1, maxMacid + 1); - } - break; case HW_VAR_H2C_MEDIA_STATUS_RPT: rtl8188e_set_FwMediaStatus_cmd(Adapter, (*(__le16 *)val)); break; - case HW_VAR_BCN_VALID: - /* BCN_VALID, BIT(16) of REG_TDECTRL = BIT(0) of REG_TDECTRL+2, write 1 to clear, Clear by sw */ - rtw_write8(Adapter, REG_TDECTRL + 2, rtw_read8(Adapter, REG_TDECTRL + 2) | BIT(0)); - break; - default: - break; - } - -} - -void GetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val) -{ - struct hal_data_8188e *haldata = &Adapter->haldata; - struct odm_dm_struct *podmpriv = &haldata->odmpriv; - - switch (variable) { - case HW_VAR_BCN_VALID: - /* BCN_VALID, BIT(16) of REG_TDECTRL = BIT(0) of REG_TDECTRL+2 */ - val[0] = (BIT(0) & rtw_read8(Adapter, REG_TDECTRL + 2)) ? true : false; - break; - case HW_VAR_DM_FLAG: - val[0] = podmpriv->SupportAbility; - break; - case HW_VAR_FWLPS_RF_ON: - { - /* When we halt NIC, we should check if FW LPS is leave. */ - if (Adapter->pwrctrlpriv.rf_pwrstate == rf_off) { - /* If it is in HW/SW Radio OFF or IPS state, we do not check Fw LPS Leave, */ - /* because Fw is unload. */ - val[0] = true; - } else { - u32 valRCR; - valRCR = rtw_read32(Adapter, REG_RCR); - valRCR &= 0x00070000; - if (valRCR) - val[0] = false; - else - val[0] = true; - } - } - break; - case HW_VAR_CHK_HI_QUEUE_EMPTY: - *val = ((rtw_read32(Adapter, REG_HGQ_INFORMATION) & 0x0000ff00) == 0) ? true : false; - break; default: break; } } -/* Query setting of specified variable. */ -void GetHalDefVar8188EUsb(struct adapter *Adapter, enum hal_def_variable eVariable, void *pValue) -{ - struct hal_data_8188e *haldata = &Adapter->haldata; - - switch (eVariable) { - case HAL_DEF_IS_SUPPORT_ANT_DIV: - *((u8 *)pValue) = (haldata->AntDivCfg == 0) ? false : true; - break; - case HAL_DEF_CURRENT_ANTENNA: - *((u8 *)pValue) = haldata->CurAntenna; - break; - case HAL_DEF_DBG_DM_FUNC: - *((u32 *)pValue) = haldata->odmpriv.SupportAbility; - break; - case HAL_DEF_DBG_DUMP_RXPKT: - *((u8 *)pValue) = haldata->bDumpRxPkt; - break; - case HAL_DEF_DBG_DUMP_TXPKT: - *((u8 *)pValue) = haldata->bDumpTxPkt; - break; - default: - break; - } -} - -/* Change default setting of specified variable. */ -void SetHalDefVar8188EUsb(struct adapter *Adapter, enum hal_def_variable eVariable, void *pValue) -{ - struct hal_data_8188e *haldata = &Adapter->haldata; - - switch (eVariable) { - case HAL_DEF_DBG_DM_FUNC: - { - u8 dm_func = *((u8 *)pValue); - struct odm_dm_struct *podmpriv = &haldata->odmpriv; - - if (dm_func == 0) { /* disable all dynamic func */ - podmpriv->SupportAbility = DYNAMIC_FUNC_DISABLE; - } else if (dm_func == 1) {/* disable DIG */ - podmpriv->SupportAbility &= (~DYNAMIC_BB_DIG); - } else if (dm_func == 2) {/* disable High power */ - podmpriv->SupportAbility &= (~DYNAMIC_BB_DYNAMIC_TXPWR); - } else if (dm_func == 3) {/* disable tx power tracking */ - podmpriv->SupportAbility &= (~DYNAMIC_RF_CALIBRATION); - } else if (dm_func == 5) {/* disable antenna diversity */ - podmpriv->SupportAbility &= (~DYNAMIC_BB_ANT_DIV); - } else if (dm_func == 6) {/* turn on all dynamic func */ - if (!(podmpriv->SupportAbility & DYNAMIC_BB_DIG)) { - struct rtw_dig *pDigTable = &podmpriv->DM_DigTable; - pDigTable->CurIGValue = rtw_read8(Adapter, 0xc50); - } - podmpriv->SupportAbility = DYNAMIC_ALL_FUNC_ENABLE; - } - } - break; - case HAL_DEF_DBG_DUMP_RXPKT: - haldata->bDumpRxPkt = *((u8 *)pValue); - break; - case HAL_DEF_DBG_DUMP_TXPKT: - haldata->bDumpTxPkt = *((u8 *)pValue); - break; - default: - break; - } -} - void UpdateHalRAMask8188EUsb(struct adapter *adapt, u32 mac_id, u8 rssi_level) { u8 init_rate = 0; diff --git a/drivers/staging/r8188eu/hal/usb_ops_linux.c b/drivers/staging/r8188eu/hal/usb_ops_linux.c index 673c30ed3cce..d5e674542a78 100644 --- a/drivers/staging/r8188eu/hal/usb_ops_linux.c +++ b/drivers/staging/r8188eu/hal/usb_ops_linux.c @@ -16,7 +16,7 @@ static int usb_read(struct intf_hdl *intf, u16 value, void *data, u8 size) int status; u8 io_buf[4]; - if (adapt->bSurpriseRemoved || adapt->pwrctrlpriv.pnp_bstop_trx) + if (adapt->bSurpriseRemoved) return -EPERM; status = usb_control_msg_recv(udev, 0, REALTEK_USB_VENQT_CMD_REQ, @@ -59,7 +59,7 @@ static int usb_write(struct intf_hdl *intf, u16 value, void *data, u8 size) int status; u8 io_buf[VENDOR_CMD_MAX_DATA_LEN]; - if (adapt->bSurpriseRemoved || adapt->pwrctrlpriv.pnp_bstop_trx) + if (adapt->bSurpriseRemoved) return -EPERM; memcpy(io_buf, data, size); @@ -260,7 +260,6 @@ static int recvbuf2recvframe(struct adapter *adapt, struct sk_buff *pskb) pkt_copy = netdev_alloc_skb(adapt->pnetdev, alloc_sz); if (pkt_copy) { - pkt_copy->dev = adapt->pnetdev; precvframe->pkt = pkt_copy; precvframe->rx_head = pkt_copy->data; precvframe->rx_end = pkt_copy->data + alloc_sz; @@ -288,7 +287,7 @@ static int recvbuf2recvframe(struct adapter *adapt, struct sk_buff *pskb) recvframe_put(precvframe, skb_len); - pkt_offset = (u16)_RND128(pkt_offset); + pkt_offset = (u16)round_up(pkt_offset, 128); if (pattrib->pkt_rpt_type == NORMAL_RX) { /* Normal rx packet */ if (pattrib->physt) @@ -415,8 +414,7 @@ u32 rtw_read_port(struct adapter *adapter, u8 *rmem) size_t alignment = 0; u32 ret = _SUCCESS; - if (adapter->bDriverStopped || adapter->bSurpriseRemoved || - adapter->pwrctrlpriv.pnp_bstop_trx) + if (adapter->bDriverStopped || adapter->bSurpriseRemoved) return _FAIL; if (!precvbuf) diff --git a/drivers/staging/r8188eu/include/HalVerDef.h b/drivers/staging/r8188eu/include/HalVerDef.h index 2bc18eabb55d..7a530c7d57eb 100644 --- a/drivers/staging/r8188eu/include/HalVerDef.h +++ b/drivers/staging/r8188eu/include/HalVerDef.h @@ -25,7 +25,6 @@ struct HAL_VERSION { enum HAL_CHIP_TYPE ChipType; enum HAL_CUT_VERSION CUTVersion; enum HAL_VENDOR VendorType; - u8 ROMVer; }; /* Get element */ @@ -34,10 +33,10 @@ struct HAL_VERSION { /* HAL_CHIP_TYPE_E */ #define IS_NORMAL_CHIP(version) \ - ((GET_CVID_CHIP_TYPE(version) == NORMAL_CHIP) ? true : false) + (GET_CVID_CHIP_TYPE(version) == NORMAL_CHIP) /* HAL_VENDOR_E */ #define IS_CHIP_VENDOR_TSMC(version) \ - ((GET_CVID_MANUFACTUER(version) == CHIP_VENDOR_TSMC) ? true : false) + (GET_CVID_MANUFACTUER(version) == CHIP_VENDOR_TSMC) #endif diff --git a/drivers/staging/r8188eu/include/basic_types.h b/drivers/staging/r8188eu/include/basic_types.h index d82b2171d584..ffb21170e898 100644 --- a/drivers/staging/r8188eu/include/basic_types.h +++ b/drivers/staging/r8188eu/include/basic_types.h @@ -4,9 +4,6 @@ #ifndef __BASIC_TYPES_H__ #define __BASIC_TYPES_H__ -#define SUCCESS 0 -#define FAIL (-1) - #include <linux/types.h> #define NDIS_OID uint @@ -14,9 +11,6 @@ typedef void (*proc_t)(void *); #define FIELD_OFFSET(s, field) ((ssize_t)&((s *)(0))->field) -#define MEM_ALIGNMENT_OFFSET (sizeof(size_t)) -#define MEM_ALIGNMENT_PADDING (sizeof(size_t) - 1) - /* port from fw */ /* TODO: Macros Below are Sync from SD7-Driver. It is necessary * to check correctness */ @@ -31,86 +25,21 @@ typedef void (*proc_t)(void *); /* Convert little data endian to host ordering */ #define EF1BYTE(_val) \ ((u8)(_val)) -#define EF2BYTE(_val) \ - (le16_to_cpu(_val)) -#define EF4BYTE(_val) \ - (le32_to_cpu(_val)) - -/* Read data from memory */ -#define READEF1BYTE(_ptr) \ - EF1BYTE(*((u8 *)(_ptr))) -/* Read le16 data from memory and convert to host ordering */ -#define READEF2BYTE(_ptr) \ - EF2BYTE(*(_ptr)) -#define READEF4BYTE(_ptr) \ - EF4BYTE(*(_ptr)) -/* Write data to memory */ -#define WRITEEF1BYTE(_ptr, _val) \ - do { \ - (*((u8 *)(_ptr))) = EF1BYTE(_val) \ - } while (0) -/* Write le data to memory in host ordering */ -#define WRITEEF2BYTE(_ptr, _val) \ - do { \ - (*((u16 *)(_ptr))) = EF2BYTE(_val) \ - } while (0) - -#define WRITEEF4BYTE(_ptr, _val) \ - do { \ - (*((u32 *)(_ptr))) = EF2BYTE(_val) \ - } while (0) - -/* Create a bit mask - * Examples: - * BIT_LEN_MASK_32(0) => 0x00000000 - * BIT_LEN_MASK_32(1) => 0x00000001 - * BIT_LEN_MASK_32(2) => 0x00000003 - * BIT_LEN_MASK_32(32) => 0xFFFFFFFF - */ -#define BIT_LEN_MASK_32(__bitlen) \ - (0xFFFFFFFF >> (32 - (__bitlen))) -#define BIT_LEN_MASK_16(__bitlen) \ - (0xFFFF >> (16 - (__bitlen))) +/* Create a bit mask */ #define BIT_LEN_MASK_8(__bitlen) \ (0xFF >> (8 - (__bitlen))) -/* Create an offset bit mask - * Examples: - * BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003 - * BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000 - */ -#define BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen) \ - (BIT_LEN_MASK_32(__bitlen) << (__bitoffset)) -#define BIT_OFFSET_LEN_MASK_16(__bitoffset, __bitlen) \ - (BIT_LEN_MASK_16(__bitlen) << (__bitoffset)) -#define BIT_OFFSET_LEN_MASK_8(__bitoffset, __bitlen) \ - (BIT_LEN_MASK_8(__bitlen) << (__bitoffset)) - /*Description: * Return 4-byte value in host byte ordering from * 4-byte pointer in little-endian system. */ -#define LE_P4BYTE_TO_HOST_4BYTE(__pstart) \ - (EF4BYTE(*((__le32 *)(__pstart)))) -#define LE_P2BYTE_TO_HOST_2BYTE(__pstart) \ - (EF2BYTE(*((__le16 *)(__pstart)))) #define LE_P1BYTE_TO_HOST_1BYTE(__pstart) \ (EF1BYTE(*((u8 *)(__pstart)))) /*Description: Translate subfield (continuous bits in little-endian) of 4-byte value to host byte ordering.*/ -#define LE_BITS_TO_4BYTE(__pstart, __bitoffset, __bitlen) \ - ( \ - (LE_P4BYTE_TO_HOST_4BYTE(__pstart) >> (__bitoffset)) & \ - BIT_LEN_MASK_32(__bitlen) \ - ) -#define LE_BITS_TO_2BYTE(__pstart, __bitoffset, __bitlen) \ - ( \ - (LE_P2BYTE_TO_HOST_2BYTE(__pstart) >> (__bitoffset)) & \ - BIT_LEN_MASK_16(__bitlen) \ - ) #define LE_BITS_TO_1BYTE(__pstart, __bitoffset, __bitlen) \ ( \ (LE_P1BYTE_TO_HOST_1BYTE(__pstart) >> (__bitoffset)) & \ diff --git a/drivers/staging/r8188eu/include/drv_types.h b/drivers/staging/r8188eu/include/drv_types.h index 09fc27082f7c..bba88a0ede61 100644 --- a/drivers/staging/r8188eu/include/drv_types.h +++ b/drivers/staging/r8188eu/include/drv_types.h @@ -26,7 +26,6 @@ #include "rtw_eeprom.h" #include "sta_info.h" #include "rtw_mlme.h" -#include "rtw_debug.h" #include "rtw_rf.h" #include "rtw_event.h" #include "rtw_led.h" @@ -35,6 +34,7 @@ #include "rtw_ap.h" #include "rtw_br_ext.h" #include "rtl8188e_hal.h" +#include "rtw_fw.h" #define DRIVERVERSION "v4.1.4_6773.20130222" @@ -116,11 +116,6 @@ struct registry_priv { #define MAX_CONTINUAL_URB_ERR 4 -struct rt_firmware { - u8 *data; - u32 size; -}; - struct dvobj_priv { struct adapter *if1; diff --git a/drivers/staging/r8188eu/include/hal_intf.h b/drivers/staging/r8188eu/include/hal_intf.h index 3cededa4dcfc..a56f3d6ca399 100644 --- a/drivers/staging/r8188eu/include/hal_intf.h +++ b/drivers/staging/r8188eu/include/hal_intf.h @@ -10,44 +10,16 @@ enum hw_variables { HW_VAR_SET_OPMODE, - HW_VAR_BSSID, HW_VAR_BASIC_RATE, HW_VAR_CORRECT_TSF, - HW_VAR_MLME_DISCONNECT, HW_VAR_MLME_SITESURVEY, - HW_VAR_MLME_JOIN, HW_VAR_SLOT_TIME, - HW_VAR_RESP_SIFS, - HW_VAR_ACK_PREAMBLE, - HW_VAR_BCN_VALID, HW_VAR_DM_FLAG, HW_VAR_DM_FUNC_OP, - HW_VAR_DM_FUNC_SET, + HW_VAR_DM_FUNC_RESET, HW_VAR_DM_FUNC_CLR, - HW_VAR_AC_PARAM_BE, - HW_VAR_ACM_CTRL, - HW_VAR_AMPDU_MIN_SPACE, HW_VAR_AMPDU_FACTOR, - HW_VAR_RXDMA_AGG_PG_TH, - HW_VAR_H2C_FW_PWRMODE, - HW_VAR_H2C_FW_JOINBSSRPT, - HW_VAR_FWLPS_RF_ON, - HW_VAR_H2C_FW_P2P_PS_OFFLOAD, - HW_VAR_INITIAL_GAIN, - HW_VAR_ANTENNA_DIVERSITY_SELECT, - HW_VAR_FIFO_CLEARN_UP, - HW_VAR_RPT_TIMER_SETTING, - HW_VAR_TX_RPT_MAX_MACID, HW_VAR_H2C_MEDIA_STATUS_RPT, - HW_VAR_CHK_HI_QUEUE_EMPTY, -}; - -enum hal_def_variable { - HAL_DEF_IS_SUPPORT_ANT_DIV, - HAL_DEF_CURRENT_ANTENNA, - HAL_DEF_DBG_DUMP_RXPKT,/* for dbg */ - HAL_DEF_DBG_DM_FUNC,/* for dbg */ - HAL_DEF_DBG_DUMP_TXPKT, }; typedef s32 (*c2h_id_filter)(u8 id); @@ -70,13 +42,9 @@ void UpdateHalRAMask8188EUsb(struct adapter *adapt, u32 mac_id, u8 rssi_level); int rtl8188e_IOL_exec_cmds_sync(struct adapter *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt); -void SetHalDefVar8188EUsb(struct adapter *Adapter, enum hal_def_variable eVariable, void *pValue); -void GetHalDefVar8188EUsb(struct adapter *Adapter, enum hal_def_variable eVariable, void *pValue); - unsigned int rtl8188eu_inirp_init(struct adapter *Adapter); void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val); -void GetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val); uint rtw_hal_init(struct adapter *padapter); uint rtw_hal_deinit(struct adapter *padapter); diff --git a/drivers/staging/r8188eu/include/ieee80211.h b/drivers/staging/r8188eu/include/ieee80211.h index 8c20363cdd31..15636a808f52 100644 --- a/drivers/staging/r8188eu/include/ieee80211.h +++ b/drivers/staging/r8188eu/include/ieee80211.h @@ -123,24 +123,6 @@ enum NETWORK_TYPE { WIRELESS_11BG_24N = (WIRELESS_11B | WIRELESS_11G | WIRELESS_11_24N), }; -#define SUPPORTED_24G_NETTYPE_MSK \ - (WIRELESS_11B | WIRELESS_11G | WIRELESS_11_24N) - -#define IsSupported24G(NetType) \ - ((NetType) & SUPPORTED_24G_NETTYPE_MSK ? true : false) - -#define IsEnableHWCCK(NetType) \ - IsSupported24G(NetType) - -#define IsSupportedRxCCK(NetType) IsEnableHWCCK(NetType) - -#define IsSupportedTxCCK(NetType) \ - ((NetType) & (WIRELESS_11B) ? true : false) -#define IsSupportedTxOFDM(NetType) \ - ((NetType) & (WIRELESS_11G) ? true : false) -#define IsSupportedTxMCS(NetType) \ - ((NetType) & (WIRELESS_11_24N) ? true : false) - struct ieee_param { u32 cmd; u8 sta_addr[ETH_ALEN]; @@ -196,35 +178,6 @@ struct ieee_param { /* this is stolen from ipw2200 driver */ #define IEEE_IBSS_MAC_HASH_SIZE 31 -struct rtw_ieee80211_hdr { - __le16 frame_ctl; - __le16 duration_id; - u8 addr1[ETH_ALEN]; - u8 addr2[ETH_ALEN]; - u8 addr3[ETH_ALEN]; - u16 seq_ctl; - u8 addr4[ETH_ALEN]; -} __packed; - -struct rtw_ieee80211_hdr_3addr { - __le16 frame_ctl; - __le16 duration_id; - u8 addr1[ETH_ALEN]; - u8 addr2[ETH_ALEN]; - u8 addr3[ETH_ALEN]; - u16 seq_ctl; -} __packed; - -struct rtw_ieee80211_hdr_3addr_qos { - __le16 frame_ctl; - __le16 duration_id; - u8 addr1[ETH_ALEN]; - u8 addr2[ETH_ALEN]; - u8 addr3[ETH_ALEN]; - u16 seq_ctl; - u16 qc; -} __packed; - #define IEEE80211_3ADDR_LEN 24 #define IEEE80211_4ADDR_LEN 30 #define IEEE80211_FCS_LEN 4 @@ -636,24 +589,8 @@ static inline int is_broadcast_mac_addr(const u8 *addr) #define MAXTID 16 -#define IEEE_A (1<<0) -#define IEEE_B (1<<1) -#define IEEE_G (1<<2) -#define IEEE_MODE_MASK (IEEE_A|IEEE_B|IEEE_G) - /* Action category code */ enum rtw_ieee80211_category { - RTW_WLAN_CATEGORY_SPECTRUM_MGMT = 0, - RTW_WLAN_CATEGORY_QOS = 1, - RTW_WLAN_CATEGORY_DLS = 2, - RTW_WLAN_CATEGORY_BACK = 3, - RTW_WLAN_CATEGORY_PUBLIC = 4, /* IEEE 802.11 public action frames */ - RTW_WLAN_CATEGORY_RADIO_MEASUREMENT = 5, - RTW_WLAN_CATEGORY_FT = 6, - RTW_WLAN_CATEGORY_HT = 7, - RTW_WLAN_CATEGORY_SA_QUERY = 8, - RTW_WLAN_CATEGORY_TDLS = 12, - RTW_WLAN_CATEGORY_WMM = 17, RTW_WLAN_CATEGORY_P2P = 0x7f,/* P2P action frames */ }; diff --git a/drivers/staging/r8188eu/include/odm.h b/drivers/staging/r8188eu/include/odm.h index 1902aa48a255..f131e17167bf 100644 --- a/drivers/staging/r8188eu/include/odm.h +++ b/drivers/staging/r8188eu/include/odm.h @@ -98,22 +98,6 @@ struct odm_per_pkt_info { bool bPacketBeacon; }; -enum odm_ability { - /* BB Team */ - ODM_DIG = 0x00000001, - ODM_HIGH_POWER = 0x00000002, - ODM_CCK_CCA_TH = 0x00000004, - ODM_FA_STATISTICS = 0x00000008, - ODM_RAMASK = 0x00000010, - ODM_RSSI_MONITOR = 0x00000020, - ODM_SW_ANTDIV = 0x00000040, - ODM_HW_ANTDIV = 0x00000080, - ODM_BB_PWRSV = 0x00000100, - ODM_2TPATHDIV = 0x00000200, - ODM_1TPATHDIV = 0x00000400, - ODM_PSD2AFH = 0x00000800 -}; - /* 2011/10/20 MH Define Common info enum for all team. */ enum odm_common_info_def { @@ -137,19 +121,6 @@ enum odm_ability_def { # define ODM_ITRF_USB 0x2 -/* ODM_CMNINFO_OP_MODE */ -enum odm_operation_mode { - ODM_NO_LINK = BIT(0), - ODM_LINK = BIT(1), - ODM_SCAN = BIT(2), - ODM_POWERSAVE = BIT(3), - ODM_AP_MODE = BIT(4), - ODM_CLIENT_MODE = BIT(5), - ODM_AD_HOC = BIT(6), - ODM_WIFI_DIRECT = BIT(7), - ODM_WIFI_DISPLAY = BIT(8), -}; - /* ODM_CMNINFO_WM_MODE */ enum odm_wireless_mode { ODM_WM_UNKNOW = 0x0, diff --git a/drivers/staging/r8188eu/include/osdep_service.h b/drivers/staging/r8188eu/include/osdep_service.h index fca8f3d116c2..f1a703643e74 100644 --- a/drivers/staging/r8188eu/include/osdep_service.h +++ b/drivers/staging/r8188eu/include/osdep_service.h @@ -77,10 +77,6 @@ void *rtw_malloc2d(int h, int w, int size); spin_lock_init(&((q)->lock)); \ } while (0) -u32 rtw_systime_to_ms(u32 systime); -u32 rtw_ms_to_systime(u32 ms); -s32 rtw_get_passing_time_ms(u32 start); - void rtw_usleep_os(int us); static inline unsigned char _cancel_timer_ex(struct timer_list *ptimer) @@ -94,49 +90,6 @@ static inline void flush_signals_thread(void) flush_signals(current); } -#define _RND(sz, r) ((((sz)+((r)-1))/(r))*(r)) -#define RND4(x) (((x >> 2) + (((x & 3) == 0) ? 0: 1)) << 2) - -static inline u32 _RND4(u32 sz) -{ - u32 val; - - val = ((sz >> 2) + ((sz & 3) ? 1: 0)) << 2; - return val; -} - -static inline u32 _RND8(u32 sz) -{ - u32 val; - - val = ((sz >> 3) + ((sz & 7) ? 1: 0)) << 3; - return val; -} - -static inline u32 _RND128(u32 sz) -{ - u32 val; - - val = ((sz >> 7) + ((sz & 127) ? 1: 0)) << 7; - return val; -} - -static inline u32 _RND256(u32 sz) -{ - u32 val; - - val = ((sz >> 8) + ((sz & 255) ? 1: 0)) << 8; - return val; -} - -static inline u32 _RND512(u32 sz) -{ - u32 val; - - val = ((sz >> 9) + ((sz & 511) ? 1: 0)) << 9; - return val; -} - struct rtw_netdev_priv_indicator { void *priv; u32 sizeof_priv; diff --git a/drivers/staging/r8188eu/include/rtl8188e_hal.h b/drivers/staging/r8188eu/include/rtl8188e_hal.h index 82cb4f7f4d3e..d2a069d4e1cc 100644 --- a/drivers/staging/r8188eu/include/rtl8188e_hal.h +++ b/drivers/staging/r8188eu/include/rtl8188e_hal.h @@ -160,9 +160,6 @@ struct hal_data_8188e { u8 AntDivCfg; u8 TRxAntDivType; - u8 bDumpRxPkt;/* for debug */ - u8 bDumpTxPkt;/* for debug */ - u8 OutEpQueueSel; u8 OutEpNumber; diff --git a/drivers/staging/r8188eu/include/rtl8188e_spec.h b/drivers/staging/r8188eu/include/rtl8188e_spec.h index edae053e350e..ef42c4b2f20c 100644 --- a/drivers/staging/r8188eu/include/rtl8188e_spec.h +++ b/drivers/staging/r8188eu/include/rtl8188e_spec.h @@ -998,13 +998,9 @@ Current IOREG MAP #define STOP_BCNQ BIT(6) /* 2 ACMHWCTRL */ -#define AcmHw_HwEn BIT(0) -#define AcmHw_BeqEn BIT(1) -#define AcmHw_ViqEn BIT(2) -#define AcmHw_VoqEn BIT(3) -#define AcmHw_BeqStatus BIT(4) -#define AcmHw_ViqStatus BIT(5) -#define AcmHw_VoqStatus BIT(6) +#define ACMHW_BEQEN BIT(1) +#define ACMHW_VIQEN BIT(2) +#define ACMHW_VOQEN BIT(3) /* 0x0600h ~ 0x07FFh WMAC Configuration */ /* 2APSD_CTRL */ diff --git a/drivers/staging/r8188eu/include/rtw_debug.h b/drivers/staging/r8188eu/include/rtw_debug.h deleted file mode 100644 index 01a7d987d6cc..000000000000 --- a/drivers/staging/r8188eu/include/rtw_debug.h +++ /dev/null @@ -1,55 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ -/* Copyright(c) 2007 - 2011 Realtek Corporation. */ - -#ifndef __RTW_DEBUG_H__ -#define __RTW_DEBUG_H__ - -#include "osdep_service.h" -#include "drv_types.h" - -#define _drv_always_ 1 -#define _drv_emerg_ 2 -#define _drv_alert_ 3 -#define _drv_crit_ 4 -#define _drv_err_ 5 -#define _drv_warning_ 6 -#define _drv_notice_ 7 -#define _drv_info_ 8 -#define _drv_debug_ 9 - -#define _module_rtl871x_xmit_c_ BIT(0) -#define _module_xmit_osdep_c_ BIT(1) -#define _module_rtl871x_recv_c_ BIT(2) -#define _module_recv_osdep_c_ BIT(3) -#define _module_rtl871x_mlme_c_ BIT(4) -#define _module_mlme_osdep_c_ BIT(5) -#define _module_rtl871x_sta_mgt_c_ BIT(6) -#define _module_rtl871x_cmd_c_ BIT(7) -#define _module_cmd_osdep_c_ BIT(8) -#define _module_rtl871x_io_c_ BIT(9) -#define _module_io_osdep_c_ BIT(10) -#define _module_os_intfs_c_ BIT(11) -#define _module_rtl871x_security_c_ BIT(12) -#define _module_rtl871x_eeprom_c_ BIT(13) -#define _module_hal_init_c_ BIT(14) -#define _module_hci_hal_init_c_ BIT(15) -#define _module_rtl871x_ioctl_c_ BIT(16) -#define _module_rtl871x_ioctl_set_c_ BIT(17) -#define _module_rtl871x_ioctl_query_c_ BIT(18) -#define _module_rtl871x_pwrctrl_c_ BIT(19) -#define _module_hci_intfs_c_ BIT(20) -#define _module_hci_ops_c_ BIT(21) -#define _module_osdep_service_c_ BIT(22) -#define _module_mp_ BIT(23) -#define _module_hci_ops_os_c_ BIT(24) -#define _module_rtl871x_ioctl_os_c BIT(25) -#define _module_rtl8712_cmd_c_ BIT(26) -#define _module_rtl8192c_xmit_c_ BIT(27) -#define _module_hal_xmit_c_ BIT(28) -#define _module_efuse_ BIT(29) -#define _module_rtl8712_recv_c_ BIT(30) -#define _module_rtl8712_led_c_ BIT(31) - -#define DRIVER_PREFIX "R8188EU: " - -#endif /* __RTW_DEBUG_H__ */ diff --git a/drivers/staging/r8188eu/include/rtw_eeprom.h b/drivers/staging/r8188eu/include/rtw_eeprom.h index 3e8d3bb48903..d8d48ace356c 100644 --- a/drivers/staging/r8188eu/include/rtw_eeprom.h +++ b/drivers/staging/r8188eu/include/rtw_eeprom.h @@ -11,10 +11,7 @@ struct eeprom_priv { u8 bautoload_fail_flag; - u8 bloadfile_fail_flag; - u8 bloadmac_fail_flag; u8 mac_addr[ETH_ALEN] __aligned(2); /* PermanentAddress */ - u16 channel_plan; u8 EepromOrEfuse; u8 efuse_eeprom_data[HWSET_MAX_SIZE_512] __aligned(4); }; diff --git a/drivers/staging/r8188eu/include/rtw_fw.h b/drivers/staging/r8188eu/include/rtw_fw.h index c4b1a8370b4a..8f74157ee9ac 100644 --- a/drivers/staging/r8188eu/include/rtw_fw.h +++ b/drivers/staging/r8188eu/include/rtw_fw.h @@ -4,6 +4,11 @@ #ifndef __RTW_FW_H__ #define __RTW_FW_H__ +struct rt_firmware { + u8 *data; + u32 size; +}; + #include "drv_types.h" int rtl8188e_firmware_download(struct adapter *padapter); diff --git a/drivers/staging/r8188eu/include/rtw_ioctl.h b/drivers/staging/r8188eu/include/rtw_ioctl.h index a36bd7313755..c704f3040ac8 100644 --- a/drivers/staging/r8188eu/include/rtw_ioctl.h +++ b/drivers/staging/r8188eu/include/rtw_ioctl.h @@ -7,86 +7,7 @@ #include "osdep_service.h" #include "drv_types.h" -#ifndef OID_802_11_CAPABILITY - #define OID_802_11_CAPABILITY 0x0d010122 -#endif - -#ifndef OID_802_11_PMKID - #define OID_802_11_PMKID 0x0d010123 -#endif - -/* For DDK-defined OIDs */ -#define OID_NDIS_SEG1 0x00010100 -#define OID_NDIS_SEG2 0x00010200 -#define OID_NDIS_SEG3 0x00020100 -#define OID_NDIS_SEG4 0x01010100 -#define OID_NDIS_SEG5 0x01020100 -#define OID_NDIS_SEG6 0x01020200 -#define OID_NDIS_SEG7 0xFD010100 -#define OID_NDIS_SEG8 0x0D010100 -#define OID_NDIS_SEG9 0x0D010200 -#define OID_NDIS_SEG10 0x0D020200 - -#define SZ_OID_NDIS_SEG1 23 -#define SZ_OID_NDIS_SEG2 3 -#define SZ_OID_NDIS_SEG3 6 -#define SZ_OID_NDIS_SEG4 6 -#define SZ_OID_NDIS_SEG5 4 -#define SZ_OID_NDIS_SEG6 8 -#define SZ_OID_NDIS_SEG7 7 -#define SZ_OID_NDIS_SEG8 36 -#define SZ_OID_NDIS_SEG9 24 -#define SZ_OID_NDIS_SEG10 19 - -/* For Realtek-defined OIDs */ -#define OID_MP_SEG1 0xFF871100 -#define OID_MP_SEG2 0xFF818000 - -#define OID_MP_SEG3 0xFF818700 -#define OID_MP_SEG4 0xFF011100 - -enum oid_type { - QUERY_OID, - SET_OID -}; - -struct oid_funs_node { - unsigned int oid_start; /* the starting number for OID */ - unsigned int oid_end; /* the ending number for OID */ - struct oid_obj_priv *node_array; - unsigned int array_sz; /* the size of node_array */ - int query_counter; /* count the number of query hits for this segment */ - int set_counter; /* count the number of set hits for this segment */ -}; - -struct oid_par_priv { - void *adapter_context; - NDIS_OID oid; - void *information_buf; - u32 information_buf_len; - u32 *bytes_rw; - u32 *bytes_needed; - enum oid_type type_of_oid; - u32 dbg; -}; - -struct oid_obj_priv { - unsigned char dbg; /* 0: without OID debug message - * 1: with OID debug message */ - int (*oidfuns)(struct oid_par_priv *poid_par_priv); -}; - extern struct iw_handler_def rtw_handlers_def; - -int drv_query_info(struct net_device *miniportadaptercontext, NDIS_OID oid, - void *informationbuffer, u32 informationbufferlength, - u32 *byteswritten, u32 *bytesneeded); - -int drv_set_info(struct net_device *MiniportAdapterContext, - NDIS_OID oid, void *informationbuffer, - u32 informationbufferlength, u32 *bytesread, - u32 *bytesneeded); - extern int ui_pid[3]; #endif /* #ifndef __INC_CEINFO_ */ diff --git a/drivers/staging/r8188eu/include/rtw_mlme.h b/drivers/staging/r8188eu/include/rtw_mlme.h index 42d850f9d777..d81668498e46 100644 --- a/drivers/staging/r8188eu/include/rtw_mlme.h +++ b/drivers/staging/r8188eu/include/rtw_mlme.h @@ -363,8 +363,6 @@ struct mlme_priv { u8 *assoc_req; u32 assoc_req_len; - u8 *assoc_rsp; - u32 assoc_rsp_len; /* Number of associated Non-ERP stations (i.e., stations using 802.11b * in 802.11g BSS) */ @@ -558,13 +556,9 @@ void rtw_scan_timeout_handler(struct adapter *adapter); #define rtw_set_scan_deny_timer_hdl(adapter) do {} while (0) #define rtw_set_scan_deny(adapter, ms) do {} while (0) -int _rtw_init_mlme_priv(struct adapter *padapter); - void rtw_free_mlme_priv_ie_data(struct mlme_priv *pmlmepriv); -void _rtw_free_mlme_priv(struct mlme_priv *pmlmepriv); - - struct wlan_network *_rtw_alloc_network(struct mlme_priv *pmlmepriv); +struct wlan_network *rtw_alloc_network(struct mlme_priv *pmlmepriv); void _rtw_free_network(struct mlme_priv *pmlmepriv, struct wlan_network *pnetwork, u8 isfreeall); @@ -596,7 +590,10 @@ void _rtw_roaming(struct adapter *padapter, struct wlan_network *tgt_network); void rtw_set_roaming(struct adapter *adapter, u8 to_roaming); u8 rtw_to_roaming(struct adapter *adapter); +void rtw_set_max_rpt_macid(struct adapter *adapter, u8 macid); void rtw_sta_media_status_rpt(struct adapter *adapter, struct sta_info *psta, u32 mstatus); +u8 rtw_current_antenna(struct adapter *adapter); + #endif /* __RTL871X_MLME_H_ */ diff --git a/drivers/staging/r8188eu/include/rtw_mlme_ext.h b/drivers/staging/r8188eu/include/rtw_mlme_ext.h index 0c555ea6719b..573d65b175cc 100644 --- a/drivers/staging/r8188eu/include/rtw_mlme_ext.h +++ b/drivers/staging/r8188eu/include/rtw_mlme_ext.h @@ -24,36 +24,12 @@ #define REAUTH_LIMIT (4) #define REASSOC_LIMIT (4) -#define READDBA_LIMIT (2) - -#define ROAMING_LIMIT 8 #define DYNAMIC_FUNC_DISABLE (0x0) /* ====== ODM_ABILITY_E ======== */ /* BB ODM section BIT 0-15 */ #define DYNAMIC_BB_DIG BIT(0) -#define DYNAMIC_BB_RA_MASK BIT(1) -#define DYNAMIC_BB_DYNAMIC_TXPWR BIT(2) -#define DYNAMIC_BB_BB_FA_CNT BIT(3) - -#define DYNAMIC_BB_RSSI_MONITOR BIT(4) -#define DYNAMIC_BB_CCK_PD BIT(5) -#define DYNAMIC_BB_ANT_DIV BIT(6) -#define DYNAMIC_BB_PWR_SAVE BIT(7) -#define DYNAMIC_BB_PWR_TRA BIT(8) -#define DYNAMIC_BB_RATE_ADAPTIVE BIT(9) -#define DYNAMIC_BB_PATH_DIV BIT(10) -#define DYNAMIC_BB_PSD BIT(11) - -/* MAC DM section BIT 16-23 */ -#define DYNAMIC_MAC_EDCA_TURBO BIT(16) -#define DYNAMIC_MAC_EARLY_MODE BIT(17) - -/* RF ODM section BIT 24-31 */ -#define DYNAMIC_RF_TX_PWR_TRACK BIT(24) -#define DYNAMIC_RF_RX_GAIN_TRACK BIT(25) -#define DYNAMIC_RF_CALIBRATION BIT(26) #define DYNAMIC_ALL_FUNC_ENABLE 0xFFFFFFF @@ -208,17 +184,7 @@ enum SCAN_STATE { SCAN_STATE_MAX, }; -struct mlme_handler { - unsigned int num; - char *str; - unsigned int (*func)(struct adapter *adapt, struct recv_frame *frame); -}; - -struct action_handler { - unsigned int num; - char* str; - unsigned int (*func)(struct adapter *adapt, struct recv_frame *frame); -}; +typedef unsigned int (*mlme_handler)(struct adapter *adapt, struct recv_frame *frame); struct ss_res { int state; @@ -419,7 +385,7 @@ struct mlme_ext_priv { u8 active_keep_alive_check; }; -int init_mlme_ext_priv(struct adapter *adapter); +void init_mlme_ext_priv(struct adapter *adapter); int init_hw_mlme_ext(struct adapter *padapter); void free_mlme_ext_priv (struct mlme_ext_priv *pmlmeext); extern void init_mlme_ext_timer(struct adapter *padapter); @@ -434,7 +400,6 @@ void UpdateBrateTblForSoftAP(u8 *bssrateset, u32 bssratelen); void Save_DM_Func_Flag(struct adapter *padapter); void Restore_DM_Func_Flag(struct adapter *padapter); -void Switch_DM_Func(struct adapter *padapter, u32 mode, u8 enable); void Set_MSR(struct adapter *padapter, u8 type); @@ -563,6 +528,8 @@ void issue_action_BA(struct adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short status); unsigned int send_delba(struct adapter *padapter, u8 initiator, u8 *addr); unsigned int send_beacon(struct adapter *padapter); +bool get_beacon_valid_bit(struct adapter *adapter); +void clear_beacon_valid_bit(struct adapter *adapter); void start_clnt_assoc(struct adapter *padapter); void start_clnt_auth(struct adapter *padapter); @@ -594,20 +561,10 @@ unsigned int OnDeAuth(struct adapter *padapter, unsigned int OnAction(struct adapter *padapter, struct recv_frame *precv_frame); -unsigned int on_action_spct(struct adapter *padapter, - struct recv_frame *precv_frame); -unsigned int OnAction_qos(struct adapter *padapter, - struct recv_frame *precv_frame); -unsigned int OnAction_dls(struct adapter *padapter, - struct recv_frame *precv_frame); unsigned int OnAction_back(struct adapter *padapter, struct recv_frame *precv_frame); unsigned int on_action_public(struct adapter *padapter, struct recv_frame *precv_frame); -unsigned int OnAction_ht(struct adapter *padapter, - struct recv_frame *precv_frame); -unsigned int OnAction_wmm(struct adapter *padapter, - struct recv_frame *precv_frame); unsigned int OnAction_p2p(struct adapter *padapter, struct recv_frame *precv_frame); @@ -635,8 +592,6 @@ void addba_timer_hdl(struct sta_info *psta); bool cckrates_included(unsigned char *rate, int ratelen); bool cckratesonly_included(unsigned char *rate, int ratelen); -void process_addba_req(struct adapter *padapter, u8 *paddba_req, u8 *addr); - void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len); void correct_TSF(struct adapter *padapter, struct mlme_ext_priv *pmlmeext); @@ -769,9 +724,6 @@ struct C2HEvent_Header { unsigned int rsvd; }; -void rtw_dummy_event_callback(struct adapter *adapter, u8 *pbuf); -void rtw_fwdbg_event_callback(struct adapter *adapter, u8 *pbuf); - enum rtw_c2h_event { GEN_EVT_CODE(_Read_MACREG) = 0, /*0*/ GEN_EVT_CODE(_Read_BBREG), @@ -806,7 +758,7 @@ enum rtw_c2h_event { #ifdef _RTW_MLME_EXT_C_ static struct fwevent wlanevents[] = { - {0, rtw_dummy_event_callback}, /*0*/ + {0, NULL}, /*0*/ {0, NULL}, {0, NULL}, {0, NULL}, @@ -820,12 +772,12 @@ static struct fwevent wlanevents[] = { {sizeof(struct stassoc_event), &rtw_stassoc_event_callback}, {sizeof(struct stadel_event), &rtw_stadel_event_callback}, {0, NULL}, - {0, rtw_dummy_event_callback}, + {0, NULL}, {0, NULL}, /*15*/ {0, NULL}, {0, NULL}, {0, NULL}, - {0, rtw_fwdbg_event_callback}, + {0, NULL}, {0, NULL}, /*20*/ {0, NULL}, {0, NULL}, diff --git a/drivers/staging/r8188eu/include/rtw_pwrctrl.h b/drivers/staging/r8188eu/include/rtw_pwrctrl.h index 7c3cb895c3cd..6e9fdd66fad1 100644 --- a/drivers/staging/r8188eu/include/rtw_pwrctrl.h +++ b/drivers/staging/r8188eu/include/rtw_pwrctrl.h @@ -47,16 +47,8 @@ struct pwrctrl_priv { u8 smart_ps; u8 bcn_ant_mode; - u32 alives; - struct work_struct cpwm_event; bool bpower_saving; - u8 reg_rfoff; - u8 reg_pdnmode; /* powerdown mode */ - - /* RF OFF Level */ - u32 cur_ps_level; - u32 reg_rfps_level; uint ips_enter_cnts; uint ips_leave_cnts; @@ -64,7 +56,7 @@ struct pwrctrl_priv { u8 ips_mode_req; /* used to accept the mode setting request, * will update to ipsmode later */ uint bips_processing; - u32 ips_deny_time; /* will deny IPS when system time less than this */ + unsigned long ips_deny_time; /* will deny IPS when system time less than this */ u8 ps_processing; /* temp used to mark whether in rtw_ps_processor */ u8 bLeisurePs; @@ -72,21 +64,15 @@ struct pwrctrl_priv { u8 power_mgnt; u8 bFwCurrentInPSMode; u32 DelayLPSLastTimeStamp; - s32 pnp_current_pwr_state; - u8 pnp_bstop_trx; u8 bInSuspend; u8 bSupportRemoteWakeup; struct timer_list pwr_state_check_timer; int pwr_state_check_interval; - u8 pwr_state_check_cnts; - - int ps_flag; enum rt_rf_power_state rf_pwrstate;/* cur power state */ enum rt_rf_power_state change_rfpwrstate; - u8 wepkeymask; u8 bkeepfwalive; }; @@ -109,6 +95,7 @@ struct pwrctrl_priv { void rtw_init_pwrctrl_priv(struct adapter *adapter); +void rtw_set_firmware_ps_mode(struct adapter *adapter, u8 mode); void rtw_set_ps_mode(struct adapter *adapter, u8 ps_mode, u8 smart_ps, u8 bcn_ant_mode); void LeaveAllPowerSaveMode(struct adapter *adapter); @@ -117,14 +104,10 @@ int ips_leave(struct adapter *padapter); void rtw_ps_processor(struct adapter *padapter); -s32 LPS_RF_ON_check(struct adapter *adapter, u32 delay_ms); void LPS_Enter(struct adapter *adapter); void LPS_Leave(struct adapter *adapter); -int _rtw_pwr_wakeup(struct adapter *adapter, u32 ips_defer_ms, - const char *caller); -#define rtw_pwr_wakeup(adapter) \ - _rtw_pwr_wakeup(adapter, RTW_PWR_STATE_CHK_INTERVAL, __func__) +int rtw_pwr_wakeup(struct adapter *adapter); int rtw_pm_set_ips(struct adapter *adapter, u8 mode); int rtw_pm_set_lps(struct adapter *adapter, u8 mode); diff --git a/drivers/staging/r8188eu/include/rtw_recv.h b/drivers/staging/r8188eu/include/rtw_recv.h index 4ac4e6b3e177..66d240a7123d 100644 --- a/drivers/staging/r8188eu/include/rtw_recv.h +++ b/drivers/staging/r8188eu/include/rtw_recv.h @@ -80,7 +80,6 @@ struct rx_pkt_attrib { u8 drvinfo_sz; u8 shift_sz; u8 hdrlen; /* the WLAN Header Len */ - u8 to_fr_ds; u8 amsdu; bool qos; u8 priority; @@ -167,7 +166,6 @@ struct recv_priv { uint rx_largepacket_crcerr; uint rx_smallpacket_crcerr; uint rx_middlepacket_crcerr; - struct semaphore allrxreturnevt; u8 rx_pending_cnt; struct tasklet_struct recv_tasklet; @@ -230,7 +228,6 @@ struct recv_buf { struct recv_frame { struct list_head list; struct sk_buff *pkt; - struct sk_buff *pkt_newalloc; struct adapter *adapter; u8 fragcnt; int frame_tag; diff --git a/drivers/staging/r8188eu/include/rtw_xmit.h b/drivers/staging/r8188eu/include/rtw_xmit.h index b2df1480d66b..034a9f8f51c9 100644 --- a/drivers/staging/r8188eu/include/rtw_xmit.h +++ b/drivers/staging/r8188eu/include/rtw_xmit.h @@ -198,7 +198,7 @@ struct xmit_buf { u32 len; struct submit_ctx *sctx; u32 ff_hwaddr; - struct urb *pxmit_urb[8]; + struct urb *pxmit_urb; dma_addr_t dma_transfer_addr; /* (in) dma addr for transfer_buffer */ u8 bpending[8]; int last[8]; @@ -341,7 +341,7 @@ s32 rtw_txframes_sta_ac_pending(struct adapter *padapter, void rtw_init_hwxmits(struct hw_xmit *phwxmit, int entry); s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, struct adapter *padapter); void _rtw_free_xmit_priv(struct xmit_priv *pxmitpriv); -void rtw_alloc_hwxmits(struct adapter *padapter); +int rtw_alloc_hwxmits(struct adapter *padapter); void rtw_free_hwxmits(struct adapter *padapter); s32 rtw_xmit(struct adapter *padapter, struct sk_buff **pkt); diff --git a/drivers/staging/r8188eu/include/sta_info.h b/drivers/staging/r8188eu/include/sta_info.h index b7e6b1f319a2..4112c837bcef 100644 --- a/drivers/staging/r8188eu/include/sta_info.h +++ b/drivers/staging/r8188eu/include/sta_info.h @@ -48,7 +48,6 @@ struct stainfo_stats { u64 rx_ctrl_pkts; u64 rx_data_pkts; - u64 last_rx_mgnt_pkts; u64 last_rx_beacon_pkts; u64 last_rx_probereq_pkts; u64 last_rx_probersp_pkts; @@ -230,7 +229,6 @@ struct sta_info { #define sta_update_last_rx_pkts(sta) \ do { \ - sta->sta_stats.last_rx_mgnt_pkts = sta->sta_stats.rx_mgnt_pkts; \ sta->sta_stats.last_rx_beacon_pkts = sta->sta_stats.rx_beacon_pkts; \ sta->sta_stats.last_rx_probereq_pkts = sta->sta_stats.rx_probereq_pkts; \ sta->sta_stats.last_rx_probersp_pkts = sta->sta_stats.rx_probersp_pkts; \ diff --git a/drivers/staging/r8188eu/include/usb_ops.h b/drivers/staging/r8188eu/include/usb_ops.h index 14526fcff4ae..ddc46cb44358 100644 --- a/drivers/staging/r8188eu/include/usb_ops.h +++ b/drivers/staging/r8188eu/include/usb_ops.h @@ -25,15 +25,14 @@ * @return true: * @return false: */ -static inline int rtw_inc_and_chk_continual_urb_error(struct dvobj_priv *dvobj) +static inline bool rtw_inc_and_chk_continual_urb_error(struct dvobj_priv *dvobj) { - int ret = false; - int value; - value = atomic_inc_return(&dvobj->continual_urb_error); + int value = atomic_inc_return(&dvobj->continual_urb_error); + if (value > MAX_CONTINUAL_URB_ERR) - ret = true; + return true; - return ret; + return false; } /* @@ -47,19 +46,14 @@ static inline void rtw_reset_continual_urb_error(struct dvobj_priv *dvobj) #define USB_HIGH_SPEED_BULK_SIZE 512 #define USB_FULL_SPEED_BULK_SIZE 64 -static inline u8 rtw_usb_bulk_size_boundary(struct adapter *padapter, - int buf_len) +static inline bool rtw_usb_bulk_size_boundary(struct adapter *padapter, int buf_len) { - u8 rst = true; struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); if (pdvobjpriv->pusbdev->speed == USB_SPEED_HIGH) - rst = (0 == (buf_len) % USB_HIGH_SPEED_BULK_SIZE) ? - true : false; + return buf_len % USB_HIGH_SPEED_BULK_SIZE == 0; else - rst = (0 == (buf_len) % USB_FULL_SPEED_BULK_SIZE) ? - true : false; - return rst; + return buf_len % USB_FULL_SPEED_BULK_SIZE == 0; } #endif /* __USB_OPS_H_ */ diff --git a/drivers/staging/r8188eu/include/usb_osintf.h b/drivers/staging/r8188eu/include/usb_osintf.h index 3e777ca52745..f271e93e9ab9 100644 --- a/drivers/staging/r8188eu/include/usb_osintf.h +++ b/drivers/staging/r8188eu/include/usb_osintf.h @@ -6,16 +6,12 @@ #include "osdep_service.h" #include "drv_types.h" -#include "usb_vendor_req.h" extern char *rtw_initmac; extern int rtw_mc2u_disable; #define USBD_HALTED(Status) ((u32)(Status) >> 30 == 3) -u8 usbvendorrequest(struct dvobj_priv *pdvobjpriv, enum bt_usb_request brequest, - enum rt_usb_wvalue wvalue, u8 windex, void *data, - u8 datalen, u8 isdirectionin); void netdev_br_init(struct net_device *netdev); void dhcp_flag_bcast(struct adapter *priv, struct sk_buff *skb); void *scdb_findEntry(struct adapter *priv, unsigned char *ipAddr); diff --git a/drivers/staging/r8188eu/include/usb_vendor_req.h b/drivers/staging/r8188eu/include/usb_vendor_req.h deleted file mode 100644 index 7337b1b7419f..000000000000 --- a/drivers/staging/r8188eu/include/usb_vendor_req.h +++ /dev/null @@ -1,35 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ -/* Copyright(c) 2007 - 2011 Realtek Corporation. */ - -#ifndef _USB_VENDOR_REQUEST_H_ -#define _USB_VENDOR_REQUEST_H_ - -/* 4 Set/Get Register related wIndex/Data */ -#define RT_USB_RESET_MASK_OFF 0 -#define RT_USB_RESET_MASK_ON 1 -#define RT_USB_SLEEP_MASK_OFF 0 -#define RT_USB_SLEEP_MASK_ON 1 -#define RT_USB_LDO_ON 1 -#define RT_USB_LDO_OFF 0 - -/* 4 Set/Get SYSCLK related wValue or Data */ -#define RT_USB_SYSCLK_32KHZ 0 -#define RT_USB_SYSCLK_40MHZ 1 -#define RT_USB_SYSCLK_60MHZ 2 - -enum bt_usb_request { - RT_USB_SET_REGISTER = 1, - RT_USB_SET_SYSCLK = 2, - RT_USB_GET_SYSCLK = 3, - RT_USB_GET_REGISTER = 4 -}; - -enum rt_usb_wvalue { - RT_USB_RESET_MASK = 1, - RT_USB_SLEEP_MASK = 2, - RT_USB_USB_HRCPWM = 3, - RT_USB_LDO = 4, - RT_USB_BOOT_TYPE = 5 -}; - -#endif diff --git a/drivers/staging/r8188eu/include/wifi.h b/drivers/staging/r8188eu/include/wifi.h index c331be19ff83..0254310bdf44 100644 --- a/drivers/staging/r8188eu/include/wifi.h +++ b/drivers/staging/r8188eu/include/wifi.h @@ -4,25 +4,14 @@ #ifndef _WIFI_H_ #define _WIFI_H_ +#include <linux/bits.h> #include <linux/ieee80211.h> -#ifdef BIT -/* error "BIT define occurred earlier elsewhere!\n" */ -#undef BIT -#endif -#define BIT(x) (1 << (x)) - #define WLAN_ETHHDR_LEN 14 #define WLAN_HDR_A3_LEN 24 #define WLAN_HDR_A3_QOS_LEN 26 #define WLAN_SSID_MAXLEN 32 -enum WIFI_FRAME_TYPE { - WIFI_CTRL_TYPE = (BIT(2)), - WIFI_DATA_TYPE = (BIT(3)), - WIFI_QOS_DATA_TYPE = (BIT(7)|BIT(3)), /* QoS Data */ -}; - enum WIFI_FRAME_SUBTYPE { /* below is for mgt frame */ WIFI_ASSOCREQ = (0 | IEEE80211_FTYPE_MGMT), @@ -39,24 +28,15 @@ enum WIFI_FRAME_SUBTYPE { WIFI_ACTION = (BIT(7) | BIT(6) | BIT(4) | IEEE80211_FTYPE_MGMT), /* below is for control frame */ - WIFI_PSPOLL = (BIT(7) | BIT(5) | WIFI_CTRL_TYPE), - WIFI_RTS = (BIT(7) | BIT(5) | BIT(4) | WIFI_CTRL_TYPE), - WIFI_CTS = (BIT(7) | BIT(6) | WIFI_CTRL_TYPE), - WIFI_ACK = (BIT(7) | BIT(6) | BIT(4) | WIFI_CTRL_TYPE), - WIFI_CFEND = (BIT(7) | BIT(6) | BIT(5) | WIFI_CTRL_TYPE), - WIFI_CFEND_CFACK = (BIT(7) | BIT(6) | BIT(5) | BIT(4) | - WIFI_CTRL_TYPE), + WIFI_PSPOLL = (BIT(7) | BIT(5) | IEEE80211_FTYPE_CTL), /* below is for data frame */ - WIFI_DATA = (0 | WIFI_DATA_TYPE), - WIFI_DATA_CFACK = (BIT(4) | WIFI_DATA_TYPE), - WIFI_DATA_CFPOLL = (BIT(5) | WIFI_DATA_TYPE), - WIFI_DATA_CFACKPOLL = (BIT(5) | BIT(4) | WIFI_DATA_TYPE), - WIFI_DATA_NULL = (BIT(6) | WIFI_DATA_TYPE), - WIFI_CF_ACK = (BIT(6) | BIT(4) | WIFI_DATA_TYPE), - WIFI_CF_POLL = (BIT(6) | BIT(5) | WIFI_DATA_TYPE), - WIFI_CF_ACKPOLL = (BIT(6) | BIT(5) | BIT(4) | WIFI_DATA_TYPE), - WIFI_QOS_DATA_NULL = (BIT(6) | WIFI_QOS_DATA_TYPE), + WIFI_DATA = (0 | IEEE80211_FTYPE_DATA), + WIFI_DATA_CFACK = (BIT(4) | IEEE80211_FTYPE_DATA), + WIFI_DATA_CFPOLL = (BIT(5) | IEEE80211_FTYPE_DATA), + WIFI_DATA_CFACKPOLL = (BIT(5) | BIT(4) | IEEE80211_FTYPE_DATA), + WIFI_DATA_NULL = (BIT(6) | IEEE80211_FTYPE_DATA), + WIFI_QOS_DATA_NULL = (BIT(6) | IEEE80211_STYPE_QOS_DATA | IEEE80211_FTYPE_DATA), }; enum WIFI_REASON_CODE { @@ -172,8 +152,6 @@ enum WIFI_REG_DOMAIN { #define GetFrDs(pbuf) (((*(__le16 *)(pbuf)) & cpu_to_le16(_FROM_DS_)) != 0) -#define get_tofr_ds(pframe) ((GetToDs(pframe) << 1) | GetFrDs(pframe)) - #define SetMFrag(pbuf) \ *(__le16 *)(pbuf) |= cpu_to_le16(_MORE_FRAG_) @@ -209,12 +187,6 @@ enum WIFI_REG_DOMAIN { *(__le16 *)(pbuf) |= cpu_to_le16(type); \ } while (0) -#define GetSequence(pbuf) \ - (le16_to_cpu(*(__le16 *)((size_t)(pbuf) + 22)) >> 4) - -#define GetFragNum(pbuf) \ - (le16_to_cpu(*(__le16 *)((size_t)(pbuf) + 22)) & 0x0f) - #define GetTupleCache(pbuf) \ (cpu_to_le16(*(unsigned short *)((size_t)(pbuf) + 22))) @@ -239,8 +211,6 @@ enum WIFI_REG_DOMAIN { #define SetPriority(pbuf, tid) \ *(__le16 *)(pbuf) |= cpu_to_le16(tid & 0xf) -#define GetPriority(pbuf) ((le16_to_cpu(*(__le16 *)(pbuf))) & 0xf) - #define SetEOSP(pbuf, eosp) \ *(__le16 *)(pbuf) |= cpu_to_le16((eosp & 1) << 4) @@ -254,8 +224,6 @@ enum WIFI_REG_DOMAIN { #define SetAMsdu(pbuf, amsdu) \ *(__le16 *)(pbuf) |= cpu_to_le16((amsdu & 1) << 7) -#define GetAid(pbuf) (le16_to_cpu(*(__le16 *)((size_t)(pbuf) + 2)) & 0x3fff) - #define GetTid(pbuf) (le16_to_cpu(*(__le16 *)((size_t)(pbuf) + \ (((GetToDs(pbuf)<<1) | GetFrDs(pbuf)) == 3 ? \ 30 : 24))) & 0x000f) @@ -270,10 +238,7 @@ enum WIFI_REG_DOMAIN { static inline bool IS_MCAST(unsigned char *da) { - if ((*da) & 0x01) - return true; - else - return false; + return (*da) & 0x01; } static inline unsigned char *get_da(unsigned char *pframe) @@ -345,13 +310,6 @@ static inline unsigned char *get_hdr_bssid(unsigned char *pframe) return sa; } -static inline bool IsFrameTypeCtrl(unsigned char *pframe) -{ - if (WIFI_CTRL_TYPE == GetFrameType(pframe)) - return true; - else - return false; -} /*----------------------------------------------------------------------------- Below is for the security related definition ------------------------------------------------------------------------------*/ diff --git a/drivers/staging/r8188eu/os_dep/ioctl_linux.c b/drivers/staging/r8188eu/os_dep/ioctl_linux.c index eb9375b0c660..1b09462ca908 100644 --- a/drivers/staging/r8188eu/os_dep/ioctl_linux.c +++ b/drivers/staging/r8188eu/os_dep/ioctl_linux.c @@ -4,7 +4,6 @@ #include "../include/osdep_service.h" #include "../include/drv_types.h" #include "../include/wlan_bssdef.h" -#include "../include/rtw_debug.h" #include "../include/wifi.h" #include "../include/rtw_mlme.h" #include "../include/rtw_mlme_ext.h" @@ -1131,9 +1130,11 @@ static int rtw_wx_set_scan(struct net_device *dev, struct iw_request_info *a, break; } sec_len = *(pos++); len -= 1; - if (sec_len > 0 && sec_len <= len) { + if (sec_len > 0 && + sec_len <= len && + sec_len <= 32) { ssid[ssid_index].SsidLength = sec_len; - memcpy(ssid[ssid_index].Ssid, pos, ssid[ssid_index].SsidLength); + memcpy(ssid[ssid_index].Ssid, pos, sec_len); ssid_index++; } pos += sec_len; @@ -1886,88 +1887,6 @@ static int rtw_wx_get_nick(struct net_device *dev, return 0; } -static int rtw_wx_read32(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct adapter *padapter; - struct iw_point *p; - u16 len; - u32 addr; - u32 data32; - u32 bytes; - u8 *ptmp; - int ret; - - padapter = (struct adapter *)rtw_netdev_priv(dev); - p = &wrqu->data; - len = p->length; - ptmp = memdup_user(p->pointer, len); - if (IS_ERR(ptmp)) - return PTR_ERR(ptmp); - - bytes = 0; - addr = 0; - sscanf(ptmp, "%d,%x", &bytes, &addr); - - switch (bytes) { - case 1: - data32 = rtw_read8(padapter, addr); - sprintf(extra, "0x%02X", data32); - break; - case 2: - data32 = rtw_read16(padapter, addr); - sprintf(extra, "0x%04X", data32); - break; - case 4: - data32 = rtw_read32(padapter, addr); - sprintf(extra, "0x%08X", data32); - break; - default: - ret = -EINVAL; - goto err_free_ptmp; - } - - kfree(ptmp); - return 0; - -err_free_ptmp: - kfree(ptmp); - return ret; -} - -static int rtw_wx_write32(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); - - u32 addr; - u32 data32; - u32 bytes; - - bytes = 0; - addr = 0; - data32 = 0; - sscanf(extra, "%d,%x,%x", &bytes, &addr, &data32); - - switch (bytes) { - case 1: - rtw_write8(padapter, addr, (u8)data32); - break; - case 2: - rtw_write16(padapter, addr, (u16)data32); - break; - case 4: - rtw_write32(padapter, addr, data32); - break; - default: - return -EINVAL; - } - - return 0; -} - static int rtw_wx_read_rf(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) @@ -2363,114 +2282,6 @@ static void rtw_p2p_setDN(struct net_device *dev, pwdinfo->device_name_len = wrqu->data.length - 1; } -static void rtw_p2p_get_status(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - - /* Commented by Albert 2010/10/12 */ - /* Because of the output size limitation, I had removed the "Role" information. */ - /* About the "Role" information, we will use the new private IOCTL to get the "Role" information. */ - sprintf(extra, "\n\nStatus =%.2d\n", rtw_p2p_state(pwdinfo)); - wrqu->data.length = strlen(extra); -} - -/* Commented by Albert 20110520 */ -/* This function will return the config method description */ -/* This config method description will show us which config method the remote P2P device is intended to use */ -/* by sending the provisioning discovery request frame. */ - -static void rtw_p2p_get_req_cm(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - - sprintf(extra, "\n\nCM =%s\n", pwdinfo->rx_prov_disc_info.strconfig_method_desc_of_prov_disc_req); - wrqu->data.length = strlen(extra); -} - -static void rtw_p2p_get_role(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - - sprintf(extra, "\n\nRole =%.2d\n", rtw_p2p_role(pwdinfo)); - wrqu->data.length = strlen(extra); -} - -static void rtw_p2p_get_peer_ifaddr(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - - sprintf(extra, "\nMAC %pM", - pwdinfo->p2p_peer_interface_addr); - wrqu->data.length = strlen(extra); -} - -static void rtw_p2p_get_peer_devaddr(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) - -{ - struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - - sprintf(extra, "\n%pM", - pwdinfo->rx_prov_disc_info.peerDevAddr); - wrqu->data.length = strlen(extra); -} - -static void rtw_p2p_get_peer_devaddr_by_invitation(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, - char *extra) - -{ - struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - - sprintf(extra, "\nMAC %pM", - pwdinfo->p2p_peer_device_addr); - wrqu->data.length = strlen(extra); -} - -static void rtw_p2p_get_groupid(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) - -{ - struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - - sprintf(extra, "\n%.2X:%.2X:%.2X:%.2X:%.2X:%.2X %s", - pwdinfo->groupid_info.go_device_addr[0], pwdinfo->groupid_info.go_device_addr[1], - pwdinfo->groupid_info.go_device_addr[2], pwdinfo->groupid_info.go_device_addr[3], - pwdinfo->groupid_info.go_device_addr[4], pwdinfo->groupid_info.go_device_addr[5], - pwdinfo->groupid_info.ssid); - wrqu->data.length = strlen(extra); -} - -static void rtw_p2p_get_op_ch(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) - -{ - struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - - sprintf(extra, "\n\nOp_ch =%.2d\n", pwdinfo->operating_channel); - wrqu->data.length = strlen(extra); -} - static int rtw_p2p_get_wps_configmethod(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) @@ -3229,32 +3040,6 @@ static int rtw_p2p_set(struct net_device *dev, return ret; } -static int rtw_p2p_get(struct net_device *dev, - struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - if (!memcmp(wrqu->data.pointer, "status", 6)) { - rtw_p2p_get_status(dev, info, wrqu, extra); - } else if (!memcmp(wrqu->data.pointer, "role", 4)) { - rtw_p2p_get_role(dev, info, wrqu, extra); - } else if (!memcmp(wrqu->data.pointer, "peer_ifa", 8)) { - rtw_p2p_get_peer_ifaddr(dev, info, wrqu, extra); - } else if (!memcmp(wrqu->data.pointer, "req_cm", 6)) { - rtw_p2p_get_req_cm(dev, info, wrqu, extra); - } else if (!memcmp(wrqu->data.pointer, "peer_deva", 9)) { - /* Get the P2P device address when receiving the provision discovery request frame. */ - rtw_p2p_get_peer_devaddr(dev, info, wrqu, extra); - } else if (!memcmp(wrqu->data.pointer, "group_id", 8)) { - rtw_p2p_get_groupid(dev, info, wrqu, extra); - } else if (!memcmp(wrqu->data.pointer, "peer_deva_inv", 9)) { - /* Get the P2P device address when receiving the P2P Invitation request frame. */ - rtw_p2p_get_peer_devaddr_by_invitation(dev, info, wrqu, extra); - } else if (!memcmp(wrqu->data.pointer, "op_ch", 5)) { - rtw_p2p_get_op_ch(dev, info, wrqu, extra); - } - return 0; -} - static int rtw_p2p_get2(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) @@ -3389,6 +3174,34 @@ static void rf_reg_dump(struct adapter *padapter) } } +static void rtw_set_dynamic_functions(struct adapter *adapter, u8 dm_func) +{ + struct hal_data_8188e *haldata = &adapter->haldata; + struct odm_dm_struct *odmpriv = &haldata->odmpriv; + + switch (dm_func) { + case 0: + /* disable all dynamic func */ + odmpriv->SupportAbility = DYNAMIC_FUNC_DISABLE; + break; + case 1: + /* disable DIG */ + odmpriv->SupportAbility &= (~DYNAMIC_BB_DIG); + break; + case 6: + /* turn on all dynamic func */ + if (!(odmpriv->SupportAbility & DYNAMIC_BB_DIG)) { + struct rtw_dig *digtable = &odmpriv->DM_DigTable; + + digtable->CurIGValue = rtw_read8(adapter, 0xc50); + } + odmpriv->SupportAbility = DYNAMIC_ALL_FUNC_ENABLE; + break; + default: + break; + } +} + static int rtw_dbg_port(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra) @@ -3620,9 +3433,7 @@ static int rtw_dbg_port(struct net_device *dev, break; case 0x06: { - u32 ODMFlag; - GetHwReg8188EU(padapter, HW_VAR_DM_FLAG, (u8 *)(&ODMFlag)); - ODMFlag = (u32)(0x0f & arg); + u32 ODMFlag = (u32)(0x0f & arg); SetHwReg8188EU(padapter, HW_VAR_DM_FLAG, (u8 *)(&ODMFlag)); } break; @@ -3632,13 +3443,6 @@ static int rtw_dbg_port(struct net_device *dev, break; case 0x09: break; - case 0x0c:/* dump rx/tx packet */ - if (arg == 0) { - SetHalDefVar8188EUsb(padapter, HAL_DEF_DBG_DUMP_RXPKT, &extra_arg); - } else if (arg == 1) { - SetHalDefVar8188EUsb(padapter, HAL_DEF_DBG_DUMP_TXPKT, &extra_arg); - } - break; case 0x15: break; case 0x10:/* driver version display */ @@ -3683,23 +3487,14 @@ static int rtw_dbg_port(struct net_device *dev, rf_reg_dump(padapter); break; case 0xee:/* turn on/off dynamic funcs */ - { - u32 odm_flag; - - if (0xf == extra_arg) { - GetHalDefVar8188EUsb(padapter, HAL_DEF_DBG_DM_FUNC, &odm_flag); - } else { - /* extra_arg = 0 - disable all dynamic func - extra_arg = 1 - disable DIG - extra_arg = 2 - disable tx power tracking - extra_arg = 3 - turn on all dynamic func - */ - SetHalDefVar8188EUsb(padapter, HAL_DEF_DBG_DM_FUNC, &extra_arg); - GetHalDefVar8188EUsb(padapter, HAL_DEF_DBG_DM_FUNC, &odm_flag); - } + if (extra_arg != 0xf) { + /* extra_arg = 0 - disable all dynamic func + * extra_arg = 1 - disable DIG + * extra_arg = 6 - turn on all dynamic func + */ + rtw_set_dynamic_functions(padapter, extra_arg); } break; - case 0xfd: rtw_write8(padapter, 0xc50, arg); rtw_write8(padapter, 0xc58, arg); @@ -3895,8 +3690,8 @@ static const struct iw_priv_args rtw_private_args[] = { }; static iw_handler rtw_private_handler[] = { -rtw_wx_write32, /* 0x00 */ -rtw_wx_read32, /* 0x01 */ + NULL, /* 0x00 */ + NULL, /* 0x01 */ NULL, /* 0x02 */ NULL, /* 0x03 */ /* for MM DTV platform */ @@ -3919,7 +3714,7 @@ NULL, /* 0x03 */ NULL, /* 0x0F */ rtw_p2p_set, /* 0x10 */ - rtw_p2p_get, /* 0x11 */ + NULL, /* 0x11 */ rtw_p2p_get2, /* 0x12 */ NULL, /* 0x13 */ @@ -3958,10 +3753,10 @@ static struct iw_statistics *rtw_get_wireless_stats(struct net_device *dev) struct iw_handler_def rtw_handlers_def = { .standard = rtw_handlers, - .num_standard = sizeof(rtw_handlers) / sizeof(iw_handler), + .num_standard = ARRAY_SIZE(rtw_handlers), .private = rtw_private_handler, .private_args = (struct iw_priv_args *)rtw_private_args, - .num_private = sizeof(rtw_private_handler) / sizeof(iw_handler), - .num_private_args = sizeof(rtw_private_args) / sizeof(struct iw_priv_args), + .num_private = ARRAY_SIZE(rtw_private_handler), + .num_private_args = ARRAY_SIZE(rtw_private_args), .get_wireless_stats = rtw_get_wireless_stats, }; diff --git a/drivers/staging/r8188eu/os_dep/mlme_linux.c b/drivers/staging/r8188eu/os_dep/mlme_linux.c index 72ad9700130e..899d8e9c3834 100644 --- a/drivers/staging/r8188eu/os_dep/mlme_linux.c +++ b/drivers/staging/r8188eu/os_dep/mlme_linux.c @@ -66,7 +66,6 @@ void rtw_reset_securitypriv(struct adapter *adapter) /* We have to backup the PMK information for WiFi PMK Caching test item. */ /* Backup the btkip_countermeasure information. */ /* When the countermeasure is trigger, the driver have to disconnect with AP for 60 seconds. */ - memset(&backup_pmkid[0], 0x00, sizeof(struct rt_pmkid_list) * NUM_PMKID_CACHE); memcpy(&backup_pmkid[0], &adapter->securitypriv.PMKIDList[0], sizeof(struct rt_pmkid_list) * NUM_PMKID_CACHE); backup_index = adapter->securitypriv.PMKIDIndex; backup_counter = adapter->securitypriv.btkip_countermeasure; diff --git a/drivers/staging/r8188eu/os_dep/os_intfs.c b/drivers/staging/r8188eu/os_dep/os_intfs.c index 550721eef681..891c85b088ca 100644 --- a/drivers/staging/r8188eu/os_dep/os_intfs.c +++ b/drivers/staging/r8188eu/os_dep/os_intfs.c @@ -441,7 +441,6 @@ static void rtw_init_default_value(struct adapter *padapter) u8 rtw_reset_drv_sw(struct adapter *padapter) { struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; /* hal_priv */ rtl8188eu_init_default_value(padapter); @@ -457,8 +456,6 @@ u8 rtw_reset_drv_sw(struct adapter *padapter) _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING); - pwrctrlpriv->pwr_state_check_cnts = 0; - /* mlmeextpriv */ padapter->mlmeextpriv.sitesurvey_res.state = SCAN_DISABLE; @@ -490,10 +487,7 @@ u8 rtw_init_drv_sw(struct adapter *padapter) init_wifidirect_info(padapter, P2P_ROLE_DISABLE); reset_global_wifidirect_info(padapter); - if (init_mlme_ext_priv(padapter) == _FAIL) { - dev_err(dvobj_to_dev(padapter->dvobj), "init_mlme_ext_priv failed\n"); - goto free_mlme_priv; - } + init_mlme_ext_priv(padapter); if (_rtw_init_xmit_priv(&padapter->xmitpriv, padapter) == _FAIL) { dev_err(dvobj_to_dev(padapter->dvobj), "_rtw_init_xmit_priv failed\n"); @@ -534,7 +528,6 @@ free_xmit_priv: free_mlme_ext: free_mlme_ext_priv(&padapter->mlmeextpriv); -free_mlme_priv: rtw_free_mlme_priv(&padapter->mlmepriv); free_evt_priv: @@ -632,12 +625,6 @@ int _netdev_open(struct net_device *pnetdev) { uint status; struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev); - struct pwrctrl_priv *pwrctrlpriv = &padapter->pwrctrlpriv; - - if (pwrctrlpriv->ps_flag) { - padapter->net_closed = false; - goto netdev_open_normal_process; - } if (!padapter->bup) { padapter->bDriverStopped = false; @@ -681,7 +668,6 @@ int _netdev_open(struct net_device *pnetdev) netdev_br_init(pnetdev); -netdev_open_normal_process: return 0; netdev_open_error: @@ -750,9 +736,36 @@ void rtw_ips_pwr_down(struct adapter *padapter) padapter->bCardDisableWOHSM = false; } +static void rtw_fifo_cleanup(struct adapter *adapter) +{ + struct pwrctrl_priv *pwrpriv = &adapter->pwrctrlpriv; + u8 trycnt = 100; + + /* pause tx */ + rtw_write8(adapter, REG_TXPAUSE, 0xff); + + /* keep sn */ + adapter->xmitpriv.nqos_ssn = rtw_read16(adapter, REG_NQOS_SEQ); + + if (!pwrpriv->bkeepfwalive) { + /* RX DMA stop */ + rtw_write32(adapter, REG_RXPKT_NUM, + (rtw_read32(adapter, REG_RXPKT_NUM) | RW_RELEASE_EN)); + do { + if (!(rtw_read32(adapter, REG_RXPKT_NUM) & RXDMA_IDLE)) + break; + } while (trycnt--); + + /* RQPN Load 0 */ + rtw_write16(adapter, REG_RQPN_NPQ, 0x0); + rtw_write32(adapter, REG_RQPN, 0x80000000); + mdelay(10); + } +} + void rtw_ips_dev_unload(struct adapter *padapter) { - SetHwReg8188EU(padapter, HW_VAR_FIFO_CLEARN_UP, NULL); + rtw_fifo_cleanup(padapter); if (padapter->intf_stop) padapter->intf_stop(padapter); diff --git a/drivers/staging/r8188eu/os_dep/osdep_service.c b/drivers/staging/r8188eu/os_dep/osdep_service.c index 7a6fcc96081a..812acd59be79 100644 --- a/drivers/staging/r8188eu/os_dep/osdep_service.c +++ b/drivers/staging/r8188eu/os_dep/osdep_service.c @@ -42,22 +42,6 @@ Otherwise, there will be racing condition. Caller must check if the list is empty before calling rtw_list_delete */ -inline u32 rtw_systime_to_ms(u32 systime) -{ - return systime * 1000 / HZ; -} - -inline u32 rtw_ms_to_systime(u32 ms) -{ - return ms * HZ / 1000; -} - -/* the input parameter start use the same unit as jiffies */ -inline s32 rtw_get_passing_time_ms(u32 start) -{ - return rtw_systime_to_ms(jiffies - start); -} - void rtw_usleep_os(int us) { if (1 < (us / 1000)) @@ -116,19 +100,10 @@ void rtw_free_netdev(struct net_device *netdev) { struct rtw_netdev_priv_indicator *pnpi; - if (!netdev) - goto RETURN; - pnpi = netdev_priv(netdev); - if (!pnpi->priv) - goto RETURN; - vfree(pnpi->priv); free_netdev(netdev); - -RETURN: - return; } int rtw_change_ifname(struct adapter *padapter, const char *ifname) @@ -220,7 +195,7 @@ keep_ori: */ inline bool rtw_cbuf_empty(struct rtw_cbuf *cbuf) { - return (cbuf->write == cbuf->read) ? true : false; + return cbuf->write == cbuf->read; } /** diff --git a/drivers/staging/r8188eu/os_dep/usb_intf.c b/drivers/staging/r8188eu/os_dep/usb_intf.c index ffd727fb32e3..68869c5daeff 100644 --- a/drivers/staging/r8188eu/os_dep/usb_intf.c +++ b/drivers/staging/r8188eu/os_dep/usb_intf.c @@ -8,7 +8,6 @@ #include "../include/xmit_osdep.h" #include "../include/hal_intf.h" #include "../include/osdep_intf.h" -#include "../include/usb_vendor_req.h" #include "../include/usb_ops.h" #include "../include/usb_osintf.h" #include "../include/rtw_ioctl.h" @@ -200,8 +199,6 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message) struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct pwrctrl_priv *pwrpriv = &padapter->pwrctrlpriv; - int ret = 0; - if ((!padapter->bup) || (padapter->bDriverStopped) || (padapter->bSurpriseRemoved)) goto exit; @@ -240,7 +237,7 @@ static int rtw_suspend(struct usb_interface *pusb_intf, pm_message_t message) rtw_indicate_disconnect(padapter); exit: - return ret; + return 0; } static int rtw_resume(struct usb_interface *pusb_intf) diff --git a/drivers/staging/r8188eu/os_dep/usb_ops_linux.c b/drivers/staging/r8188eu/os_dep/usb_ops_linux.c index c4b6dbc8d66d..0269e602b217 100644 --- a/drivers/staging/r8188eu/os_dep/usb_ops_linux.c +++ b/drivers/staging/r8188eu/os_dep/usb_ops_linux.c @@ -106,8 +106,7 @@ u32 rtw_write_port(struct adapter *padapter, u32 addr, u32 cnt, u8 *wmem) struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data; struct usb_device *pusbd = pdvobj->pusbdev; - if ((padapter->bDriverStopped) || (padapter->bSurpriseRemoved) || - (padapter->pwrctrlpriv.pnp_bstop_trx)) { + if (padapter->bDriverStopped || padapter->bSurpriseRemoved) { rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_TX_DENY); goto exit; } @@ -141,7 +140,7 @@ u32 rtw_write_port(struct adapter *padapter, u32 addr, u32 cnt, u8 *wmem) spin_unlock_irqrestore(&pxmitpriv->lock, irqL); - purb = pxmitbuf->pxmit_urb[0]; + purb = pxmitbuf->pxmit_urb; /* translate DMA FIFO addr to pipehandle */ pipe = ffaddr2pipehdl(pdvobj, addr); @@ -179,25 +178,21 @@ exit: void rtw_write_port_cancel(struct adapter *padapter) { - int i, j; + int i; struct xmit_buf *pxmitbuf = (struct xmit_buf *)padapter->xmitpriv.pxmitbuf; padapter->bWritePortCancel = true; for (i = 0; i < NR_XMITBUFF; i++) { - for (j = 0; j < 8; j++) { - if (pxmitbuf->pxmit_urb[j]) - usb_kill_urb(pxmitbuf->pxmit_urb[j]); - } + if (pxmitbuf->pxmit_urb) + usb_kill_urb(pxmitbuf->pxmit_urb); pxmitbuf++; } pxmitbuf = (struct xmit_buf *)padapter->xmitpriv.pxmit_extbuf; for (i = 0; i < NR_XMIT_EXTBUFF; i++) { - for (j = 0; j < 8; j++) { - if (pxmitbuf->pxmit_urb[j]) - usb_kill_urb(pxmitbuf->pxmit_urb[j]); - } + if (pxmitbuf->pxmit_urb) + usb_kill_urb(pxmitbuf->pxmit_urb); pxmitbuf++; } } diff --git a/drivers/staging/r8188eu/os_dep/xmit_linux.c b/drivers/staging/r8188eu/os_dep/xmit_linux.c index a6012cffd37e..e430c64e9068 100644 --- a/drivers/staging/r8188eu/os_dep/xmit_linux.c +++ b/drivers/staging/r8188eu/os_dep/xmit_linux.c @@ -67,8 +67,6 @@ bool rtw_endofpktfile(struct pkt_file *pfile) int rtw_os_xmit_resource_alloc(struct adapter *padapter, struct xmit_buf *pxmitbuf, u32 alloc_sz) { - int i; - pxmitbuf->pallocated_buf = kzalloc(alloc_sz, GFP_KERNEL); if (!pxmitbuf->pallocated_buf) return _FAIL; @@ -76,21 +74,17 @@ int rtw_os_xmit_resource_alloc(struct adapter *padapter, struct xmit_buf *pxmitb pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((size_t)(pxmitbuf->pallocated_buf), XMITBUF_ALIGN_SZ); pxmitbuf->dma_transfer_addr = 0; - for (i = 0; i < 8; i++) { - pxmitbuf->pxmit_urb[i] = usb_alloc_urb(0, GFP_KERNEL); - if (!pxmitbuf->pxmit_urb[i]) - return _FAIL; - } + pxmitbuf->pxmit_urb = usb_alloc_urb(0, GFP_KERNEL); + if (!pxmitbuf->pxmit_urb) + return _FAIL; + return _SUCCESS; } void rtw_os_xmit_resource_free(struct adapter *padapter, struct xmit_buf *pxmitbuf, u32 free_sz) { - int i; - - for (i = 0; i < 8; i++) - usb_free_urb(pxmitbuf->pxmit_urb[i]); + usb_free_urb(pxmitbuf->pxmit_urb); kfree(pxmitbuf->pallocated_buf); } diff --git a/drivers/staging/rtl8192e/rtl8192e/r8190P_rtl8256.c b/drivers/staging/rtl8192e/rtl8192e/r8190P_rtl8256.c index 52eeb56c5c76..4abec7b42993 100644 --- a/drivers/staging/rtl8192e/rtl8192e/r8190P_rtl8256.c +++ b/drivers/staging/rtl8192e/rtl8192e/r8190P_rtl8256.c @@ -185,10 +185,10 @@ void rtl92e_set_ofdm_tx_power(struct net_device *dev, u8 powerlevel) for (index = 0; index < 6; index++) { writeVal = (u32)(priv->MCSTxPowerLevelOriginalOffset[index] + ((index < 2) ? powerBase0 : powerBase1)); - byte0 = (u8)(writeVal & 0x7f); - byte1 = (u8)((writeVal & 0x7f00)>>8); - byte2 = (u8)((writeVal & 0x7f0000)>>16); - byte3 = (u8)((writeVal & 0x7f000000)>>24); + byte0 = writeVal & 0x7f; + byte1 = (writeVal & 0x7f00) >> 8; + byte2 = (writeVal & 0x7f0000) >> 16; + byte3 = (writeVal & 0x7f000000) >> 24; if (byte0 > 0x24) byte0 = 0x24; if (byte1 > 0x24) diff --git a/drivers/staging/rtl8192e/rtl8192e/r8192E_cmdpkt.c b/drivers/staging/rtl8192e/rtl8192e/r8192E_cmdpkt.c index c5e44bbe997c..cd8bbc358d01 100644 --- a/drivers/staging/rtl8192e/rtl8192e/r8192E_cmdpkt.c +++ b/drivers/staging/rtl8192e/rtl8192e/r8192E_cmdpkt.c @@ -58,7 +58,7 @@ bool rtl92e_send_cmd_pkt(struct net_device *dev, u32 type, const void *data, memset(pTxFwInfo, 0, sizeof(struct tx_fwinfo_8190pci)); memset(pTxFwInfo, 0x12, 8); } else { - tcb_desc->txbuf_size = (u16)frag_length; + tcb_desc->txbuf_size = frag_length; } seg_ptr = skb_put(skb, frag_length); diff --git a/drivers/staging/rtl8192e/rtl8192e/r8192E_dev.c b/drivers/staging/rtl8192e/rtl8192e/r8192E_dev.c index 7f9dee42a04d..4b9249195b5a 100644 --- a/drivers/staging/rtl8192e/rtl8192e/r8192E_dev.c +++ b/drivers/staging/rtl8192e/rtl8192e/r8192E_dev.c @@ -221,7 +221,7 @@ void rtl92e_set_reg(struct net_device *dev, u8 variable, u8 *val) &priv->rtllib->current_network.qos_data.parameters; u8 pAcParam = *val; u32 eACI = pAcParam; - union aci_aifsn *pAciAifsn = (union aci_aifsn *) & + union aci_aifsn *pAciAifsn = (union aci_aifsn *)& (qos_parameters->aifs[0]); u8 acm = pAciAifsn->f.acm; u8 AcmCtrl = rtl92e_readb(dev, AcmHwCtrl); @@ -320,8 +320,8 @@ static void _rtl92e_read_eeprom_info(struct net_device *dev) priv->eeprom_did = rtl92e_eeprom_read(dev, EEPROM_DID >> 1); usValue = rtl92e_eeprom_read(dev, - (u16)(EEPROM_Customer_ID>>1)) >> 8; - priv->eeprom_CustomerID = (u8)(usValue & 0xff); + (EEPROM_Customer_ID >> 1)) >> 8; + priv->eeprom_CustomerID = usValue & 0xff; usValue = rtl92e_eeprom_read(dev, EEPROM_ICVersion_ChannelPlan>>1); priv->eeprom_ChannelPlan = usValue&0xff; @@ -399,9 +399,9 @@ static void _rtl92e_read_eeprom_info(struct net_device *dev) priv->EEPROMLegacyHTTxPowerDiff); if (!priv->AutoloadFailFlag) - priv->EEPROMThermalMeter = (u8)(((rtl92e_eeprom_read(dev, + priv->EEPROMThermalMeter = ((rtl92e_eeprom_read(dev, (EEPROM_ThermalMeter>>1))) & - 0xff00)>>8); + 0xff00) >> 8; else priv->EEPROMThermalMeter = EEPROM_Default_ThermalMeter; RT_TRACE(COMP_INIT, "ThermalMeter = %d\n", @@ -413,8 +413,8 @@ static void _rtl92e_read_eeprom_info(struct net_device *dev) usValue = rtl92e_eeprom_read(dev, EEPROM_TxPwDiff_CrystalCap >> 1); priv->EEPROMAntPwDiff = usValue & 0x0fff; - priv->EEPROMCrystalCap = (u8)((usValue & 0xf000) - >> 12); + priv->EEPROMCrystalCap = (usValue & 0xf000) + >> 12; } else { priv->EEPROMAntPwDiff = EEPROM_Default_AntTxPowerDiff; @@ -811,7 +811,7 @@ start: rtl92e_config_mac(dev); - if (priv->card_8192_version > (u8) VERSION_8190_BD) { + if (priv->card_8192_version > VERSION_8190_BD) { rtl92e_get_tx_power(dev); rtl92e_set_tx_power(dev, priv->chan); } @@ -894,9 +894,8 @@ start: for (i = 0; i < TxBBGainTableLength; i++) { if (tmpRegA == dm_tx_bb_gain[i]) { - priv->rfa_txpowertrackingindex = (u8)i; - priv->rfa_txpowertrackingindex_real = - (u8)i; + priv->rfa_txpowertrackingindex = i; + priv->rfa_txpowertrackingindex_real = i; priv->rfa_txpowertracking_default = priv->rfa_txpowertrackingindex; break; @@ -908,7 +907,7 @@ start: for (i = 0; i < CCKTxBBGainTableLength; i++) { if (TempCCk == dm_cck_tx_bb_gain[i][0]) { - priv->CCKPresentAttentuation_20Mdefault = (u8)i; + priv->CCKPresentAttentuation_20Mdefault = i; break; } } @@ -1176,7 +1175,7 @@ void rtl92e_fill_tx_desc(struct net_device *dev, struct tx_desc *pdesc, pTxFwInfo = (struct tx_fwinfo_8190pci *)skb->data; memset(pTxFwInfo, 0, sizeof(struct tx_fwinfo_8190pci)); pTxFwInfo->TxHT = (cb_desc->data_rate & 0x80) ? 1 : 0; - pTxFwInfo->TxRate = _rtl92e_rate_mgn_to_hw((u8)cb_desc->data_rate); + pTxFwInfo->TxRate = _rtl92e_rate_mgn_to_hw(cb_desc->data_rate); pTxFwInfo->EnableCPUDur = cb_desc->bTxEnableFwCalcDur; pTxFwInfo->Short = _rtl92e_query_is_short(pTxFwInfo->TxHT, pTxFwInfo->TxRate, cb_desc); @@ -1195,7 +1194,7 @@ void rtl92e_fill_tx_desc(struct net_device *dev, struct tx_desc *pdesc, pTxFwInfo->CtsEnable = (cb_desc->bCTSEnable) ? 1 : 0; pTxFwInfo->RtsSTBC = (cb_desc->bRTSSTBC) ? 1 : 0; pTxFwInfo->RtsHT = (cb_desc->rts_rate&0x80) ? 1 : 0; - pTxFwInfo->RtsRate = _rtl92e_rate_mgn_to_hw((u8)cb_desc->rts_rate); + pTxFwInfo->RtsRate = _rtl92e_rate_mgn_to_hw(cb_desc->rts_rate); pTxFwInfo->RtsBandwidth = 0; pTxFwInfo->RtsSubcarrier = cb_desc->RTSSC; pTxFwInfo->RtsShort = (pTxFwInfo->RtsHT == 0) ? @@ -1226,7 +1225,7 @@ void rtl92e_fill_tx_desc(struct net_device *dev, struct tx_desc *pdesc, pdesc->LINIP = 0; pdesc->CmdInit = 1; pdesc->Offset = sizeof(struct tx_fwinfo_8190pci) + 8; - pdesc->PktSize = (u16)skb->len-sizeof(struct tx_fwinfo_8190pci); + pdesc->PktSize = skb->len - sizeof(struct tx_fwinfo_8190pci); pdesc->SecCAMID = 0; pdesc->RATid = cb_desc->RATRIndex; @@ -1299,11 +1298,10 @@ void rtl92e_fill_tx_cmd_desc(struct net_device *dev, struct tx_desc_cmd *entry, entry_tmp->CmdInit = DESC_PACKET_TYPE_NORMAL; entry_tmp->Offset = sizeof(struct tx_fwinfo_8190pci) + 8; - entry_tmp->PktSize = (u16)(cb_desc->pkt_size + - entry_tmp->Offset); + entry_tmp->PktSize = cb_desc->pkt_size + entry_tmp->Offset; entry_tmp->QueueSelect = QSLT_CMD; entry_tmp->TxFWInfoSize = 0x08; - entry_tmp->RATid = (u8)DESC_PACKET_TYPE_INIT; + entry_tmp->RATid = DESC_PACKET_TYPE_INIT; } entry->TxBufferSize = skb->len; entry->TxBuffAddr = mapping; @@ -1613,9 +1611,8 @@ static void _rtl92e_query_rxphystatus( total_rssi += RSSI; if (bpacket_match_bssid) { - pstats->RxMIMOSignalStrength[i] = (u8) RSSI; - precord_stats->RxMIMOSignalStrength[i] = - (u8) RSSI; + pstats->RxMIMOSignalStrength[i] = RSSI; + precord_stats->RxMIMOSignalStrength[i] = RSSI; } } @@ -1661,14 +1658,14 @@ static void _rtl92e_query_rxphystatus( if (is_cck_rate) { pstats->SignalStrength = precord_stats->SignalStrength = - (u8)(_rtl92e_signal_scale_mapping(priv, - (long)pwdb_all)); + _rtl92e_signal_scale_mapping(priv, + (long)pwdb_all); } else { if (rf_rx_num != 0) pstats->SignalStrength = precord_stats->SignalStrength = - (u8)(_rtl92e_signal_scale_mapping(priv, - (long)(total_rssi /= rf_rx_num))); + _rtl92e_signal_scale_mapping(priv, + (long)(total_rssi /= rf_rx_num)); } } @@ -1709,8 +1706,7 @@ static void _rtl92e_process_phyinfo(struct r8192_priv *priv, u8 *buffer, slide_rssi_index = 0; tmp_val = priv->stats.slide_rssi_total/slide_rssi_statistics; - priv->stats.signal_strength = rtl92e_translate_to_dbm(priv, - (u8)tmp_val); + priv->stats.signal_strength = rtl92e_translate_to_dbm(priv, tmp_val); curr_st->rssi = priv->stats.signal_strength; if (!prev_st->bPacketMatchBSSID) { if (!prev_st->bToSelfBA) @@ -2036,7 +2032,7 @@ bool rtl92e_get_rx_stats(struct net_device *dev, struct rtllib_rx_stats *stats, pDrvInfo = (struct rx_fwinfo *)(skb->data + stats->RxBufShift); stats->rate = _rtl92e_rate_hw_to_mgn((bool)pDrvInfo->RxHT, - (u8)pDrvInfo->RxRate); + pDrvInfo->RxRate); stats->bShortPreamble = pDrvInfo->SPLCP; _rtl92e_update_received_rate_histogram_stats(dev, stats); diff --git a/drivers/staging/rtl8192e/rtl8192e/r8192E_firmware.c b/drivers/staging/rtl8192e/rtl8192e/r8192E_firmware.c index 9b025b9fa7ab..38110fa4f36d 100644 --- a/drivers/staging/rtl8192e/rtl8192e/r8192E_firmware.c +++ b/drivers/staging/rtl8192e/rtl8192e/r8192E_firmware.c @@ -34,8 +34,7 @@ static bool _rtl92e_fw_boot_cpu(struct net_device *dev) netdev_dbg(dev, "Download Firmware: Put code ok!\n"); CPU_status = rtl92e_readl(dev, CPU_GEN); - rtl92e_writeb(dev, CPU_GEN, - (u8)((CPU_status|CPU_GEN_PWR_STB_CPU)&0xff)); + rtl92e_writeb(dev, CPU_GEN, (CPU_status | CPU_GEN_PWR_STB_CPU) & 0xff); mdelay(1); if (!_rtl92e_wait_for_fw(dev, CPU_GEN_BOOT_RDY, 200)) { diff --git a/drivers/staging/rtl8192e/rtl8192e/r8192E_phy.c b/drivers/staging/rtl8192e/rtl8192e/r8192E_phy.c index 411138102948..f92551094738 100644 --- a/drivers/staging/rtl8192e/rtl8192e/r8192E_phy.c +++ b/drivers/staging/rtl8192e/rtl8192e/r8192E_phy.c @@ -919,7 +919,7 @@ static u8 _rtl92e_phy_switch_channel_step(struct net_device *dev, u8 channel, continue; switch (CurrentCmd->CmdID) { case CmdID_SetTxPowerLevel: - if (priv->IC_Cut > (u8)VERSION_8190_BD) + if (priv->IC_Cut > VERSION_8190_BD) _rtl92e_set_tx_power_level(dev, channel); break; @@ -929,11 +929,11 @@ static u8 _rtl92e_phy_switch_channel_step(struct net_device *dev, u8 channel, break; case CmdID_WritePortUshort: rtl92e_writew(dev, CurrentCmd->Para1, - (u16)CurrentCmd->Para2); + CurrentCmd->Para2); break; case CmdID_WritePortUchar: rtl92e_writeb(dev, CurrentCmd->Para1, - (u8)CurrentCmd->Para2); + CurrentCmd->Para2); break; case CmdID_RF_WriteReg: for (eRFPath = 0; eRFPath < @@ -1299,17 +1299,17 @@ void rtl92e_init_gain(struct net_device *dev, u8 Operation) DIG_ALGO_BY_FALSE_ALARM) rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8); priv->initgain_backup.xaagccore1 = - (u8)rtl92e_get_bb_reg(dev, rOFDM0_XAAGCCore1, - BitMask); + rtl92e_get_bb_reg(dev, rOFDM0_XAAGCCore1, + BitMask); priv->initgain_backup.xbagccore1 = - (u8)rtl92e_get_bb_reg(dev, rOFDM0_XBAGCCore1, - BitMask); + rtl92e_get_bb_reg(dev, rOFDM0_XBAGCCore1, + BitMask); priv->initgain_backup.xcagccore1 = - (u8)rtl92e_get_bb_reg(dev, rOFDM0_XCAGCCore1, - BitMask); + rtl92e_get_bb_reg(dev, rOFDM0_XCAGCCore1, + BitMask); priv->initgain_backup.xdagccore1 = - (u8)rtl92e_get_bb_reg(dev, rOFDM0_XDAGCCore1, - BitMask); + rtl92e_get_bb_reg(dev, rOFDM0_XDAGCCore1, + BitMask); BitMask = bMaskByte2; priv->initgain_backup.cca = (u8)rtl92e_get_bb_reg(dev, rCCK0_CCA, BitMask); diff --git a/drivers/staging/rtl8192e/rtl8192e/rtl_dm.c b/drivers/staging/rtl8192e/rtl8192e/rtl_dm.c index 756d8db51937..d58800d06e8f 100644 --- a/drivers/staging/rtl8192e/rtl8192e/rtl_dm.c +++ b/drivers/staging/rtl8192e/rtl8192e/rtl_dm.c @@ -633,7 +633,7 @@ static void _rtl92e_dm_tx_power_tracking_callback_tssi(struct net_device *dev) rtl92e_writeb(dev, FW_Busy_Flag, 0); priv->rtllib->bdynamic_txpower_enable = false; - powerlevelOFDM24G = (u8)(priv->Pwr_Track>>24); + powerlevelOFDM24G = priv->Pwr_Track >> 24; RF_Type = priv->rf_type; Value = (RF_Type<<8) | powerlevelOFDM24G; @@ -833,7 +833,7 @@ static void _rtl92e_dm_tx_power_tracking_cb_thermal(struct net_device *dev) bMaskDWord); for (i = 0; i < OFDM_Table_Length; i++) { if (tmpRegA == OFDMSwingTable[i]) { - priv->OFDM_index[0] = (u8)i; + priv->OFDM_index[0] = i; RT_TRACE(COMP_POWER_TRACKING, "Initial reg0x%x = 0x%x, OFDM_index = 0x%x\n", rOFDM0_XATxIQImbalance, tmpRegA, @@ -844,7 +844,7 @@ static void _rtl92e_dm_tx_power_tracking_cb_thermal(struct net_device *dev) TempCCk = rtl92e_get_bb_reg(dev, rCCK0_TxFilter1, bMaskByte2); for (i = 0; i < CCK_Table_length; i++) { if (TempCCk == (u32)CCKSwingTable_Ch1_Ch13[i][0]) { - priv->CCK_index = (u8) i; + priv->CCK_index = i; RT_TRACE(COMP_POWER_TRACKING, "Initial reg0x%x = 0x%x, CCK_index = 0x%x\n", rCCK0_TxFilter1, TempCCk, @@ -1041,7 +1041,7 @@ static void _rtl92e_dm_cck_tx_power_adjust_tssi(struct net_device *dev, { u32 TempVal; struct r8192_priv *priv = rtllib_priv(dev); - u8 attenuation = (u8)priv->CCKPresentAttentuation; + u8 attenuation = priv->CCKPresentAttentuation; TempVal = 0; if (!bInCH14) { @@ -1245,10 +1245,10 @@ void rtl92e_dm_backup_state(struct net_device *dev) return; rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8); - priv->initgain_backup.xaagccore1 = (u8)rtl92e_get_bb_reg(dev, rOFDM0_XAAGCCore1, bit_mask); - priv->initgain_backup.xbagccore1 = (u8)rtl92e_get_bb_reg(dev, rOFDM0_XBAGCCore1, bit_mask); - priv->initgain_backup.xcagccore1 = (u8)rtl92e_get_bb_reg(dev, rOFDM0_XCAGCCore1, bit_mask); - priv->initgain_backup.xdagccore1 = (u8)rtl92e_get_bb_reg(dev, rOFDM0_XDAGCCore1, bit_mask); + priv->initgain_backup.xaagccore1 = rtl92e_get_bb_reg(dev, rOFDM0_XAAGCCore1, bit_mask); + priv->initgain_backup.xbagccore1 = rtl92e_get_bb_reg(dev, rOFDM0_XBAGCCore1, bit_mask); + priv->initgain_backup.xcagccore1 = rtl92e_get_bb_reg(dev, rOFDM0_XCAGCCore1, bit_mask); + priv->initgain_backup.xdagccore1 = rtl92e_get_bb_reg(dev, rOFDM0_XDAGCCore1, bit_mask); bit_mask = bMaskByte2; priv->initgain_backup.cca = (u8)rtl92e_get_bb_reg(dev, rCCK0_CCA, bit_mask); @@ -1535,7 +1535,7 @@ static void _rtl92e_dm_initial_gain(struct net_device *dev) if ((dm_digtable.pre_ig_value != dm_digtable.cur_ig_value) || !initialized || force_write) { - initial_gain = (u8)dm_digtable.cur_ig_value; + initial_gain = dm_digtable.cur_ig_value; rtl92e_writeb(dev, rOFDM0_XAAGCCore1, initial_gain); rtl92e_writeb(dev, rOFDM0_XBAGCCore1, initial_gain); rtl92e_writeb(dev, rOFDM0_XCAGCCore1, initial_gain); @@ -2513,5 +2513,5 @@ static void _rtl92e_dm_send_rssi_to_fw(struct net_device *dev) { struct r8192_priv *priv = rtllib_priv(dev); - rtl92e_writeb(dev, DRIVER_RSSI, (u8)priv->undecorated_smoothed_pwdb); + rtl92e_writeb(dev, DRIVER_RSSI, priv->undecorated_smoothed_pwdb); } diff --git a/drivers/staging/rtl8192e/rtl819x_BAProc.c b/drivers/staging/rtl8192e/rtl819x_BAProc.c index 97afea4c3511..7d04966afdd9 100644 --- a/drivers/staging/rtl8192e/rtl819x_BAProc.c +++ b/drivers/staging/rtl8192e/rtl819x_BAProc.c @@ -238,7 +238,7 @@ int rtllib_rx_ADDBAReq(struct rtllib_device *ieee, struct sk_buff *skb) skb->data, skb->len); #endif - req = (struct rtllib_hdr_3addr *) skb->data; + req = (struct rtllib_hdr_3addr *)skb->data; tag = (u8 *)req; dst = (u8 *)(&req->addr2[0]); tag += sizeof(struct rtllib_hdr_3addr); @@ -343,7 +343,6 @@ int rtllib_rx_ADDBARsp(struct rtllib_device *ieee, struct sk_buff *skb) goto OnADDBARsp_Reject; } - if (!GetTs(ieee, (struct ts_common_info **)(&pTS), dst, (u8)(pBaParamSet->field.tid), TX_DIR, false)) { netdev_warn(ieee->dev, "%s(): can't get TS\n", __func__); @@ -355,7 +354,6 @@ int rtllib_rx_ADDBARsp(struct rtllib_device *ieee, struct sk_buff *skb) pPendingBA = &pTS->TxPendingBARecord; pAdmittedBA = &pTS->TxAdmittedBARecord; - if (pAdmittedBA->b_valid) { netdev_dbg(ieee->dev, "%s(): ADDBA response already admitted\n", __func__); @@ -374,7 +372,6 @@ int rtllib_rx_ADDBARsp(struct rtllib_device *ieee, struct sk_buff *skb) DeActivateBAEntry(ieee, pPendingBA); } - if (*pStatusCode == ADDBA_STATUS_SUCCESS) { if (pBaParamSet->field.ba_policy == BA_POLICY_DELAYED) { pTS->bAddBaReqDelayed = true; diff --git a/drivers/staging/rtl8192e/rtllib.h b/drivers/staging/rtl8192e/rtllib.h index c985e4ebc545..0ecd81a81866 100644 --- a/drivers/staging/rtl8192e/rtllib.h +++ b/drivers/staging/rtl8192e/rtllib.h @@ -1585,7 +1585,7 @@ struct rtllib_device { short sta_sleep; int ps_timeout; int ps_period; - struct tasklet_struct ps_task; + struct work_struct ps_task; u64 ps_time; bool polling; diff --git a/drivers/staging/rtl8192e/rtllib_crypt_ccmp.c b/drivers/staging/rtl8192e/rtllib_crypt_ccmp.c index ed968c01c7ff..a8d22da8bc9a 100644 --- a/drivers/staging/rtl8192e/rtllib_crypt_ccmp.c +++ b/drivers/staging/rtl8192e/rtllib_crypt_ccmp.c @@ -103,7 +103,7 @@ static int ccmp_init_iv_and_aad(struct rtllib_hdr_4addr *hdr, if (a4_included) aad_len += 6; if (qc_included) { - pos = (u8 *) &hdr->addr4; + pos = (u8 *)&hdr->addr4; if (a4_included) pos += 6; qc = *pos & 0x0f; @@ -130,13 +130,13 @@ static int ccmp_init_iv_and_aad(struct rtllib_hdr_4addr *hdr, * A4 (if present) * QC (if present) */ - pos = (u8 *) hdr; + pos = (u8 *)hdr; aad[0] = pos[0] & 0x8f; aad[1] = pos[1] & 0xc7; memcpy(&aad[2], &hdr->addr1, ETH_ALEN); memcpy(&aad[8], &hdr->addr2, ETH_ALEN); memcpy(&aad[14], &hdr->addr3, ETH_ALEN); - pos = (u8 *) &hdr->seq_ctl; + pos = (u8 *)&hdr->seq_ctl; aad[20] = pos[0] & 0x0f; aad[21] = 0; /* all bits masked */ memset(aad + 22, 0, 8); @@ -186,7 +186,7 @@ static int rtllib_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv) *pos++ = key->tx_pn[1]; *pos++ = key->tx_pn[0]; - hdr = (struct rtllib_hdr_4addr *) skb->data; + hdr = (struct rtllib_hdr_4addr *)skb->data; if (!tcb_desc->bHwSec) { struct aead_request *req; struct scatterlist sg[2]; @@ -235,7 +235,7 @@ static int rtllib_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) return -1; } - hdr = (struct rtllib_hdr_4addr *) skb->data; + hdr = (struct rtllib_hdr_4addr *)skb->data; pos = skb->data + hdr_len; keyidx = pos[3]; if (!(keyidx & (1 << 5))) { diff --git a/drivers/staging/rtl8192e/rtllib_crypt_tkip.c b/drivers/staging/rtl8192e/rtllib_crypt_tkip.c index 4a760ecbc31e..8bc95651e384 100644 --- a/drivers/staging/rtl8192e/rtllib_crypt_tkip.c +++ b/drivers/staging/rtl8192e/rtllib_crypt_tkip.c @@ -136,7 +136,7 @@ static inline u16 Hi16(u32 val) static inline u16 Mk16(u8 hi, u8 lo) { - return lo | (((u16) hi) << 8); + return lo | (hi << 8); } @@ -220,7 +220,7 @@ static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, /* Make temporary area overlap WEP seed so that the final copy can be * avoided on little endian hosts. */ - u16 *PPK = (u16 *) &WEPSeed[4]; + u16 *PPK = (u16 *)&WEPSeed[4]; /* Step 1 - make copy of TTAK and bring in TSC */ PPK[0] = TTAK[0]; @@ -231,15 +231,15 @@ static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, PPK[5] = TTAK[4] + IV16; /* Step 2 - 96-bit bijective mixing using S-box */ - PPK[0] += _S_(PPK[5] ^ Mk16_le((u16 *) &TK[0])); - PPK[1] += _S_(PPK[0] ^ Mk16_le((u16 *) &TK[2])); - PPK[2] += _S_(PPK[1] ^ Mk16_le((u16 *) &TK[4])); - PPK[3] += _S_(PPK[2] ^ Mk16_le((u16 *) &TK[6])); - PPK[4] += _S_(PPK[3] ^ Mk16_le((u16 *) &TK[8])); - PPK[5] += _S_(PPK[4] ^ Mk16_le((u16 *) &TK[10])); - - PPK[0] += RotR1(PPK[5] ^ Mk16_le((u16 *) &TK[12])); - PPK[1] += RotR1(PPK[0] ^ Mk16_le((u16 *) &TK[14])); + PPK[0] += _S_(PPK[5] ^ Mk16_le((u16 *)&TK[0])); + PPK[1] += _S_(PPK[0] ^ Mk16_le((u16 *)&TK[2])); + PPK[2] += _S_(PPK[1] ^ Mk16_le((u16 *)&TK[4])); + PPK[3] += _S_(PPK[2] ^ Mk16_le((u16 *)&TK[6])); + PPK[4] += _S_(PPK[3] ^ Mk16_le((u16 *)&TK[8])); + PPK[5] += _S_(PPK[4] ^ Mk16_le((u16 *)&TK[10])); + + PPK[0] += RotR1(PPK[5] ^ Mk16_le((u16 *)&TK[12])); + PPK[1] += RotR1(PPK[0] ^ Mk16_le((u16 *)&TK[14])); PPK[2] += RotR1(PPK[1]); PPK[3] += RotR1(PPK[2]); PPK[4] += RotR1(PPK[3]); @@ -251,7 +251,7 @@ static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, WEPSeed[0] = Hi8(IV16); WEPSeed[1] = (Hi8(IV16) | 0x20) & 0x7F; WEPSeed[2] = Lo8(IV16); - WEPSeed[3] = Lo8((PPK[5] ^ Mk16_le((u16 *) &TK[0])) >> 1); + WEPSeed[3] = Lo8((PPK[5] ^ Mk16_le((u16 *)&TK[0])) >> 1); #ifdef __BIG_ENDIAN { @@ -280,7 +280,7 @@ static int rtllib_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) skb->len < hdr_len) return -1; - hdr = (struct rtllib_hdr_4addr *) skb->data; + hdr = (struct rtllib_hdr_4addr *)skb->data; if (!tcb_desc->bHwSec) { if (!tkey->tx_phase1_done) { @@ -357,7 +357,7 @@ static int rtllib_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) if (skb->len < hdr_len + 8 + 4) return -1; - hdr = (struct rtllib_hdr_4addr *) skb->data; + hdr = (struct rtllib_hdr_4addr *)skb->data; pos = skb->data + hdr_len; keyidx = pos[3]; if (!(keyidx & (1 << 5))) { @@ -485,7 +485,7 @@ static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr) { struct rtllib_hdr_4addr *hdr11; - hdr11 = (struct rtllib_hdr_4addr *) skb->data; + hdr11 = (struct rtllib_hdr_4addr *)skb->data; switch (le16_to_cpu(hdr11->frame_ctl) & (RTLLIB_FCTL_FROMDS | RTLLIB_FCTL_TODS)) { case RTLLIB_FCTL_TODS: @@ -518,7 +518,7 @@ static int rtllib_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv) u8 *pos; struct rtllib_hdr_4addr *hdr; - hdr = (struct rtllib_hdr_4addr *) skb->data; + hdr = (struct rtllib_hdr_4addr *)skb->data; if (skb_tailroom(skb) < 8 || skb->len < hdr_len) { netdev_dbg(skb->dev, @@ -558,7 +558,7 @@ static void rtllib_michael_mic_failure(struct net_device *dev, ether_addr_copy(ev.src_addr.sa_data, hdr->addr2); memset(&wrqu, 0, sizeof(wrqu)); wrqu.data.length = sizeof(ev); - wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev); + wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *)&ev); } static int rtllib_michael_mic_verify(struct sk_buff *skb, int keyidx, @@ -568,7 +568,7 @@ static int rtllib_michael_mic_verify(struct sk_buff *skb, int keyidx, u8 mic[8]; struct rtllib_hdr_4addr *hdr; - hdr = (struct rtllib_hdr_4addr *) skb->data; + hdr = (struct rtllib_hdr_4addr *)skb->data; if (!tkey->key_set) return -1; @@ -584,7 +584,7 @@ static int rtllib_michael_mic_verify(struct sk_buff *skb, int keyidx, if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { struct rtllib_hdr_4addr *hdr; - hdr = (struct rtllib_hdr_4addr *) skb->data; + hdr = (struct rtllib_hdr_4addr *)skb->data; netdev_dbg(skb->dev, "Michael MIC verification failed for MSDU from %pM keyidx=%d\n", hdr->addr2, keyidx); diff --git a/drivers/staging/rtl8192e/rtllib_rx.c b/drivers/staging/rtl8192e/rtllib_rx.c index eb904b42f9c6..abe5c153f74e 100644 --- a/drivers/staging/rtl8192e/rtllib_rx.c +++ b/drivers/staging/rtl8192e/rtllib_rx.c @@ -250,7 +250,7 @@ static int rtllib_is_eapol_frame(struct rtllib_device *ieee, if (skb->len < 24) return 0; - hdr = (struct rtllib_hdr_4addr *) skb->data; + hdr = (struct rtllib_hdr_4addr *)skb->data; fc = le16_to_cpu(hdr->frame_ctl); /* check that the frame is unicast frame to us */ @@ -299,7 +299,7 @@ rtllib_rx_frame_decrypt(struct rtllib_device *ieee, struct sk_buff *skb, tcb_desc->bHwSec = 0; } - hdr = (struct rtllib_hdr_4addr *) skb->data; + hdr = (struct rtllib_hdr_4addr *)skb->data; hdrlen = rtllib_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); atomic_inc(&crypt->refcnt); @@ -339,7 +339,7 @@ rtllib_rx_frame_decrypt_msdu(struct rtllib_device *ieee, struct sk_buff *skb, tcb_desc->bHwSec = 0; } - hdr = (struct rtllib_hdr_4addr *) skb->data; + hdr = (struct rtllib_hdr_4addr *)skb->data; hdrlen = rtllib_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); atomic_inc(&crypt->refcnt); @@ -936,7 +936,7 @@ static int rtllib_rx_check_duplicate(struct rtllib_device *ieee, } else { struct rx_ts_record *pRxTS = NULL; - if (GetTs(ieee, (struct ts_common_info **) &pRxTS, hdr->addr2, + if (GetTs(ieee, (struct ts_common_info **)&pRxTS, hdr->addr2, (u8)Frame_QoSTID((u8 *)(skb->data)), RX_DIR, true)) { if ((fc & (1<<11)) && (frag == pRxTS->rx_last_frag_num) && (WLAN_GET_SEQ_SEQ(sc) == pRxTS->rx_last_seq_num)) @@ -1100,7 +1100,7 @@ static int rtllib_rx_decrypt(struct rtllib_device *ieee, struct sk_buff *skb, return -1; } - hdr = (struct rtllib_hdr_4addr *) skb->data; + hdr = (struct rtllib_hdr_4addr *)skb->data; if ((frag != 0 || (fc & RTLLIB_FCTL_MOREFRAGS))) { int flen; struct sk_buff *frag_skb = rtllib_frag_cache_get(ieee, hdr); @@ -1152,7 +1152,7 @@ static int rtllib_rx_decrypt(struct rtllib_device *ieee, struct sk_buff *skb, * delivered, so remove skb from fragment cache */ skb = frag_skb; - hdr = (struct rtllib_hdr_4addr *) skb->data; + hdr = (struct rtllib_hdr_4addr *)skb->data; rtllib_frag_cache_invalidate(ieee, hdr); } @@ -1165,7 +1165,7 @@ static int rtllib_rx_decrypt(struct rtllib_device *ieee, struct sk_buff *skb, return -1; } - hdr = (struct rtllib_hdr_4addr *) skb->data; + hdr = (struct rtllib_hdr_4addr *)skb->data; if (crypt && !(fc & RTLLIB_FCTL_WEP) && !ieee->open_wep) { if (/*ieee->ieee802_1x &&*/ rtllib_is_eapol_frame(ieee, skb, hdrlen)) { @@ -1397,13 +1397,13 @@ static int rtllib_rx_InfraAdhoc(struct rtllib_device *ieee, struct sk_buff *skb, goto rx_exit; /* Get TS for Rx Reorder */ - hdr = (struct rtllib_hdr_4addr *) skb->data; + hdr = (struct rtllib_hdr_4addr *)skb->data; if (ieee->current_network.qos_data.active && IsQoSDataFrame(skb->data) && !is_multicast_ether_addr(hdr->addr1) && (!bToOtherSTA)) { TID = Frame_QoSTID(skb->data); SeqNum = WLAN_GET_SEQ_SEQ(sc); - GetTs(ieee, (struct ts_common_info **) &pTS, hdr->addr2, TID, + GetTs(ieee, (struct ts_common_info **)&pTS, hdr->addr2, TID, RX_DIR, true); if (TID != 0 && TID != 3) ieee->bis_any_nonbepkts = true; @@ -2053,7 +2053,7 @@ int rtllib_parse_info_param(struct rtllib_device *ieee, } network->ssid_len = min(info_element->len, - (u8) IW_ESSID_MAX_SIZE); + (u8)IW_ESSID_MAX_SIZE); memcpy(network->ssid, info_element->data, network->ssid_len); if (network->ssid_len < IW_ESSID_MAX_SIZE) @@ -2721,7 +2721,7 @@ static void rtllib_rx_mgt(struct rtllib_device *ieee, if (ieee->sta_sleep || (ieee->ps != RTLLIB_PS_DISABLED && ieee->iw_mode == IW_MODE_INFRA && ieee->state == RTLLIB_LINKED)) - tasklet_schedule(&ieee->ps_task); + schedule_work(&ieee->ps_task); break; diff --git a/drivers/staging/rtl8192e/rtllib_softmac.c b/drivers/staging/rtl8192e/rtllib_softmac.c index 4b6c2295a3cf..b5f4d35954a9 100644 --- a/drivers/staging/rtl8192e/rtllib_softmac.c +++ b/drivers/staging/rtl8192e/rtllib_softmac.c @@ -202,7 +202,7 @@ inline void softmac_mgmt_xmit(struct sk_buff *skb, struct rtllib_device *ieee) unsigned long flags; short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct rtllib_hdr_3addr *header = - (struct rtllib_hdr_3addr *) skb->data; + (struct rtllib_hdr_3addr *)skb->data; struct cb_desc *tcb_desc = (struct cb_desc *)(skb->cb + 8); @@ -279,7 +279,7 @@ softmac_ps_mgmt_xmit(struct sk_buff *skb, { short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE; struct rtllib_hdr_3addr *header = - (struct rtllib_hdr_3addr *) skb->data; + (struct rtllib_hdr_3addr *)skb->data; u16 fc, type, stype; struct cb_desc *tcb_desc = (struct cb_desc *)(skb->cb + 8); @@ -651,9 +651,9 @@ static void rtllib_beacons_stop(struct rtllib_device *ieee) spin_lock_irqsave(&ieee->beacon_lock, flags); ieee->beacon_txing = 0; - del_timer_sync(&ieee->beacon_timer); spin_unlock_irqrestore(&ieee->beacon_lock, flags); + del_timer_sync(&ieee->beacon_timer); } @@ -856,9 +856,9 @@ static struct sk_buff *rtllib_probe_resp(struct rtllib_device *ieee, encrypt = ieee->host_encrypt && crypt && crypt->ops && ((strcmp(crypt->ops->name, "R-WEP") == 0 || wpa_ie_len)); if (ieee->pHTInfo->bCurrentHTSupport) { - tmp_ht_cap_buf = (u8 *) &(ieee->pHTInfo->SelfHTCap); + tmp_ht_cap_buf = (u8 *)&(ieee->pHTInfo->SelfHTCap); tmp_ht_cap_len = sizeof(ieee->pHTInfo->SelfHTCap); - tmp_ht_info_buf = (u8 *) &(ieee->pHTInfo->SelfHTInfo); + tmp_ht_info_buf = (u8 *)&(ieee->pHTInfo->SelfHTInfo); tmp_ht_info_len = sizeof(ieee->pHTInfo->SelfHTInfo); HTConstructCapabilityElement(ieee, tmp_ht_cap_buf, &tmp_ht_cap_len, encrypt, false); @@ -912,7 +912,7 @@ static struct sk_buff *rtllib_probe_resp(struct rtllib_device *ieee, beacon_buf->info_element[0].id = MFIE_TYPE_SSID; beacon_buf->info_element[0].len = ssid_len; - tag = (u8 *) beacon_buf->info_element[0].data; + tag = (u8 *)beacon_buf->info_element[0].data; memcpy(tag, ssid, ssid_len); @@ -1303,7 +1303,7 @@ rtllib_association_req(struct rtllib_network *beacon, 0x00}; struct octet_string osCcxRmCap; - osCcxRmCap.Octet = (u8 *) CcxRmCapBuf; + osCcxRmCap.Octet = (u8 *)CcxRmCapBuf; osCcxRmCap.Length = sizeof(CcxRmCapBuf); tag = skb_put(skb, ccxrm_ie_len); *tag++ = MFIE_TYPE_GENERIC; @@ -1764,7 +1764,7 @@ static void rtllib_softmac_check_all_nets(struct rtllib_device *ieee) spin_unlock_irqrestore(&ieee->lock, flags); } -static inline u16 auth_parse(struct net_device *dev, struct sk_buff *skb, +static inline int auth_parse(struct net_device *dev, struct sk_buff *skb, u8 **challenge, int *chlen) { struct rtllib_authentication *a; @@ -1773,10 +1773,10 @@ static inline u16 auth_parse(struct net_device *dev, struct sk_buff *skb, if (skb->len < (sizeof(struct rtllib_authentication) - sizeof(struct rtllib_info_element))) { netdev_dbg(dev, "invalid len in auth resp: %d\n", skb->len); - return 0xcafe; + return -EINVAL; } *challenge = NULL; - a = (struct rtllib_authentication *) skb->data; + a = (struct rtllib_authentication *)skb->data; if (skb->len > (sizeof(struct rtllib_authentication) + 3)) { t = skb->data + sizeof(struct rtllib_authentication); @@ -1787,7 +1787,13 @@ static inline u16 auth_parse(struct net_device *dev, struct sk_buff *skb, return -ENOMEM; } } - return le16_to_cpu(a->status); + + if (a->status) { + netdev_dbg(dev, "auth_parse() failed\n"); + return -EINVAL; + } + + return 0; } static int auth_rq_parse(struct net_device *dev, struct sk_buff *skb, u8 *dest) @@ -1799,7 +1805,7 @@ static int auth_rq_parse(struct net_device *dev, struct sk_buff *skb, u8 *dest) netdev_dbg(dev, "invalid len in auth request: %d\n", skb->len); return -1; } - a = (struct rtllib_authentication *) skb->data; + a = (struct rtllib_authentication *)skb->data; ether_addr_copy(dest, a->header.addr2); @@ -1817,7 +1823,7 @@ static short probe_rq_parse(struct rtllib_device *ieee, struct sk_buff *skb, u8 *ssid = NULL; u8 ssidlen = 0; struct rtllib_hdr_3addr *header = - (struct rtllib_hdr_3addr *) skb->data; + (struct rtllib_hdr_3addr *)skb->data; bool bssid_match; if (skb->len < sizeof(struct rtllib_hdr_3addr)) @@ -1865,7 +1871,7 @@ static int assoc_rq_parse(struct net_device *dev, struct sk_buff *skb, u8 *dest) return -1; } - a = (struct rtllib_assoc_request_frame *) skb->data; + a = (struct rtllib_assoc_request_frame *)skb->data; ether_addr_copy(dest, a->header.addr2); @@ -1884,7 +1890,7 @@ static inline u16 assoc_parse(struct rtllib_device *ieee, struct sk_buff *skb, return 0xcafe; } - response_head = (struct rtllib_assoc_response_frame *) skb->data; + response_head = (struct rtllib_assoc_response_frame *)skb->data; *aid = le16_to_cpu(response_head->aid) & 0x3fff; status_code = le16_to_cpu(response_head->status); @@ -2042,13 +2048,15 @@ static short rtllib_sta_ps_sleep(struct rtllib_device *ieee, u64 *time) } -static inline void rtllib_sta_ps(struct tasklet_struct *t) +static inline void rtllib_sta_ps(struct work_struct *work) { - struct rtllib_device *ieee = from_tasklet(ieee, t, ps_task); + struct rtllib_device *ieee; u64 time; short sleep; unsigned long flags, flags2; + ieee = container_of(work, struct rtllib_device, ps_task); + spin_lock_irqsave(&ieee->lock, flags); if ((ieee->ps == RTLLIB_PS_DISABLED || @@ -2167,7 +2175,7 @@ EXPORT_SYMBOL(rtllib_ps_tx_ack); static void rtllib_process_action(struct rtllib_device *ieee, struct sk_buff *skb) { - struct rtllib_hdr_3addr *header = (struct rtllib_hdr_3addr *) skb->data; + struct rtllib_hdr_3addr *header = (struct rtllib_hdr_3addr *)skb->data; u8 *act = rtllib_get_payload((struct rtllib_hdr *)header); u8 category = 0; @@ -2206,7 +2214,7 @@ rtllib_rx_assoc_resp(struct rtllib_device *ieee, struct sk_buff *skb, int aid; u8 *ies; struct rtllib_assoc_response_frame *assoc_resp; - struct rtllib_hdr_3addr *header = (struct rtllib_hdr_3addr *) skb->data; + struct rtllib_hdr_3addr *header = (struct rtllib_hdr_3addr *)skb->data; u16 frame_ctl = le16_to_cpu(header->frame_ctl); netdev_dbg(ieee->dev, "received [RE]ASSOCIATION RESPONSE (%d)\n", @@ -2278,7 +2286,7 @@ rtllib_rx_assoc_resp(struct rtllib_device *ieee, struct sk_buff *skb, static void rtllib_rx_auth_resp(struct rtllib_device *ieee, struct sk_buff *skb) { - u16 errcode; + int errcode; u8 *challenge; int chlen = 0; bool bSupportNmode = true, bHalfSupportNmode = false; @@ -2288,8 +2296,7 @@ static void rtllib_rx_auth_resp(struct rtllib_device *ieee, struct sk_buff *skb) if (errcode) { ieee->softmac_stats.rx_auth_rs_err++; netdev_info(ieee->dev, - "Authentication response status code 0x%x", - errcode); + "Authentication response status code %d", errcode); rtllib_associate_abort(ieee); return; } @@ -2351,7 +2358,7 @@ rtllib_rx_auth(struct rtllib_device *ieee, struct sk_buff *skb, static inline int rtllib_rx_deauth(struct rtllib_device *ieee, struct sk_buff *skb) { - struct rtllib_hdr_3addr *header = (struct rtllib_hdr_3addr *) skb->data; + struct rtllib_hdr_3addr *header = (struct rtllib_hdr_3addr *)skb->data; u16 frame_ctl; if (memcmp(header->addr3, ieee->current_network.bssid, ETH_ALEN) != 0) @@ -2391,7 +2398,7 @@ inline int rtllib_rx_frame_softmac(struct rtllib_device *ieee, struct rtllib_rx_stats *rx_stats, u16 type, u16 stype) { - struct rtllib_hdr_3addr *header = (struct rtllib_hdr_3addr *) skb->data; + struct rtllib_hdr_3addr *header = (struct rtllib_hdr_3addr *)skb->data; u16 frame_ctl; if (!ieee->proto_started) @@ -2811,7 +2818,7 @@ static struct sk_buff *rtllib_get_beacon_(struct rtllib_device *ieee) if (!skb) return NULL; - b = (struct rtllib_probe_response *) skb->data; + b = (struct rtllib_probe_response *)skb->data; b->header.frame_ctl = cpu_to_le16(RTLLIB_STYPE_BEACON); return skb; @@ -2827,7 +2834,7 @@ struct sk_buff *rtllib_get_beacon(struct rtllib_device *ieee) if (!skb) return NULL; - b = (struct rtllib_probe_response *) skb->data; + b = (struct rtllib_probe_response *)skb->data; b->header.seq_ctl = cpu_to_le16(ieee->seq_ctrl[0] << 4); if (ieee->seq_ctrl[0] == 0xFFF) @@ -3028,7 +3035,7 @@ int rtllib_softmac_init(struct rtllib_device *ieee) spin_lock_init(&ieee->mgmt_tx_lock); spin_lock_init(&ieee->beacon_lock); - tasklet_setup(&ieee->ps_task, rtllib_sta_ps); + INIT_WORK(&ieee->ps_task, rtllib_sta_ps); return 0; } @@ -3050,8 +3057,8 @@ void rtllib_softmac_free(struct rtllib_device *ieee) cancel_work_sync(&ieee->associate_complete_wq); cancel_work_sync(&ieee->ips_leave_wq); cancel_work_sync(&ieee->wx_sync_scan_wq); + cancel_work_sync(&ieee->ps_task); mutex_unlock(&ieee->wx_mutex); - tasklet_kill(&ieee->ps_task); } static inline struct sk_buff * diff --git a/drivers/staging/rtl8192e/rtllib_softmac_wx.c b/drivers/staging/rtl8192e/rtllib_softmac_wx.c index 57a6d1130b6a..70a62ca0f69a 100644 --- a/drivers/staging/rtl8192e/rtllib_softmac_wx.c +++ b/drivers/staging/rtl8192e/rtllib_softmac_wx.c @@ -41,8 +41,8 @@ int rtllib_wx_set_freq(struct rtllib_device *ieee, struct iw_request_info *a, /* if setting by freq convert to channel */ if (fwrq->e == 1) { - if ((fwrq->m >= (int) 2.412e8 && - fwrq->m <= (int) 2.487e8)) { + if ((fwrq->m >= (int)2.412e8 && + fwrq->m <= (int)2.487e8)) { int f = fwrq->m / 100000; int c = 0; diff --git a/drivers/staging/rtl8192e/rtllib_wx.c b/drivers/staging/rtl8192e/rtllib_wx.c index 0d67d5880377..cf9a240924f2 100644 --- a/drivers/staging/rtl8192e/rtllib_wx.c +++ b/drivers/staging/rtl8192e/rtllib_wx.c @@ -660,7 +660,7 @@ int rtllib_wx_set_mlme(struct rtllib_device *ieee, { u8 i = 0; bool deauth = false; - struct iw_mlme *mlme = (struct iw_mlme *) extra; + struct iw_mlme *mlme = (struct iw_mlme *)extra; if (ieee->state != RTLLIB_LINKED) return -ENOLINK; diff --git a/drivers/staging/rtl8192u/ieee80211/ieee80211.h b/drivers/staging/rtl8192u/ieee80211/ieee80211.h index 68c0bf9a191a..b577f9c81f85 100644 --- a/drivers/staging/rtl8192u/ieee80211/ieee80211.h +++ b/drivers/staging/rtl8192u/ieee80211/ieee80211.h @@ -1790,7 +1790,7 @@ struct ieee80211_device { short sta_sleep; int ps_timeout; int ps_period; - struct tasklet_struct ps_task; + struct work_struct ps_task; u32 ps_th; u32 ps_tl; diff --git a/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c b/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c index 101c28265e91..f17d07dad56d 100644 --- a/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c +++ b/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_ccmp.c @@ -362,7 +362,7 @@ static int ieee80211_ccmp_get_key(void *key, int len, u8 *seq, void *priv) struct ieee80211_ccmp_data *data = priv; if (len < CCMP_TK_LEN) - return -1; + return 0; if (!data->key_set) return 0; diff --git a/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_tkip.c b/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_tkip.c index 689d8843f538..7b120b8cb982 100644 --- a/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_tkip.c +++ b/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_tkip.c @@ -637,7 +637,7 @@ static int ieee80211_tkip_get_key(void *key, int len, u8 *seq, void *priv) struct ieee80211_tkip_data *tkey = priv; if (len < TKIP_KEY_LEN) - return -1; + return 0; if (!tkey->key_set) return 0; diff --git a/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_wep.c b/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_wep.c index 8a51ea1dd6e5..a2cdf3bfd1a4 100644 --- a/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_wep.c +++ b/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_wep.c @@ -201,7 +201,7 @@ static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv) struct prism2_wep_data *wep = priv; if (len < wep->key_len) - return -1; + return 0; memcpy(key, wep->key, wep->key_len); diff --git a/drivers/staging/rtl8192u/ieee80211/ieee80211_softmac.c b/drivers/staging/rtl8192u/ieee80211/ieee80211_softmac.c index 1a43979939a8..92001cb36730 100644 --- a/drivers/staging/rtl8192u/ieee80211/ieee80211_softmac.c +++ b/drivers/staging/rtl8192u/ieee80211/ieee80211_softmac.c @@ -528,9 +528,9 @@ static void ieee80211_beacons_stop(struct ieee80211_device *ieee) spin_lock_irqsave(&ieee->beacon_lock, flags); ieee->beacon_txing = 0; - del_timer_sync(&ieee->beacon_timer); spin_unlock_irqrestore(&ieee->beacon_lock, flags); + del_timer_sync(&ieee->beacon_timer); } void ieee80211_stop_send_beacons(struct ieee80211_device *ieee) @@ -1461,13 +1461,13 @@ void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee) spin_unlock_irqrestore(&ieee->lock, flags); } -static inline u16 auth_parse(struct sk_buff *skb, u8 **challenge, int *chlen) +static inline int auth_parse(struct sk_buff *skb, u8 **challenge, int *chlen) { struct ieee80211_authentication *a; u8 *t; if (skb->len < (sizeof(struct ieee80211_authentication) - sizeof(struct ieee80211_info_element))) { IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n", skb->len); - return 0xcafe; + return -EINVAL; } *challenge = NULL; a = (struct ieee80211_authentication *)skb->data; @@ -1482,7 +1482,12 @@ static inline u16 auth_parse(struct sk_buff *skb, u8 **challenge, int *chlen) } } - return le16_to_cpu(a->status); + if (a->status) { + IEEE80211_DEBUG_MGMT("auth_parse() failed\n"); + return -EINVAL; + } + + return 0; } static int auth_rq_parse(struct sk_buff *skb, u8 *dest) @@ -1687,14 +1692,15 @@ static short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, return 1; } -static inline void ieee80211_sta_ps(struct tasklet_struct *t) +static inline void ieee80211_sta_ps(struct work_struct *work) { - struct ieee80211_device *ieee = from_tasklet(ieee, t, ps_task); + struct ieee80211_device *ieee; u32 th, tl; short sleep; - unsigned long flags, flags2; + ieee = container_of(work, struct ieee80211_device, ps_task); + spin_lock_irqsave(&ieee->lock, flags); if ((ieee->ps == IEEE80211_PS_DISABLED || @@ -1826,7 +1832,7 @@ static void ieee80211_check_auth_response(struct ieee80211_device *ieee, { /* default support N mode, disable halfNmode */ bool bSupportNmode = true, bHalfSupportNmode = false; - u16 errcode; + int errcode; u8 *challenge; int chlen = 0; u32 iotAction; @@ -1875,7 +1881,7 @@ static void ieee80211_check_auth_response(struct ieee80211_device *ieee, } } else { ieee->softmac_stats.rx_auth_rs_err++; - IEEE80211_DEBUG_MGMT("Auth response status code 0x%x", errcode); + IEEE80211_DEBUG_MGMT("Auth response status code %d\n", errcode); ieee80211_associate_abort(ieee); } } @@ -1897,7 +1903,7 @@ ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb, if (ieee->sta_sleep || (ieee->ps != IEEE80211_PS_DISABLED && ieee->iw_mode == IW_MODE_INFRA && ieee->state == IEEE80211_LINKED)) - tasklet_schedule(&ieee->ps_task); + schedule_work(&ieee->ps_task); if (WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_PROBE_RESP && WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_BEACON) @@ -2602,7 +2608,7 @@ void ieee80211_softmac_init(struct ieee80211_device *ieee) spin_lock_init(&ieee->mgmt_tx_lock); spin_lock_init(&ieee->beacon_lock); - tasklet_setup(&ieee->ps_task, ieee80211_sta_ps); + INIT_WORK(&ieee->ps_task, ieee80211_sta_ps); } void ieee80211_softmac_free(struct ieee80211_device *ieee) @@ -2613,7 +2619,7 @@ void ieee80211_softmac_free(struct ieee80211_device *ieee) del_timer_sync(&ieee->associate_timer); cancel_delayed_work(&ieee->associate_retry_wq); - + cancel_work_sync(&ieee->ps_task); mutex_unlock(&ieee->wx_mutex); } diff --git a/drivers/staging/rtl8192u/ieee80211/ieee80211_wx.c b/drivers/staging/rtl8192u/ieee80211/ieee80211_wx.c index 78cc8f357bbc..d6829cf6f7e3 100644 --- a/drivers/staging/rtl8192u/ieee80211/ieee80211_wx.c +++ b/drivers/staging/rtl8192u/ieee80211/ieee80211_wx.c @@ -470,7 +470,9 @@ int ieee80211_wx_get_encode(struct ieee80211_device *ieee, return 0; } len = crypt->ops->get_key(keybuf, SCM_KEY_LEN, NULL, crypt->priv); - erq->length = (len >= 0 ? len : 0); + if (len < 0) + len = 0; + erq->length = len; erq->flags |= IW_ENCODE_ENABLED; @@ -686,9 +688,9 @@ int ieee80211_wx_get_encode_ext(struct ieee80211_device *ieee, } else { if (strcmp(crypt->ops->name, "WEP") == 0) ext->alg = IW_ENCODE_ALG_WEP; - else if (strcmp(crypt->ops->name, "TKIP")) + else if (strcmp(crypt->ops->name, "TKIP") == 0) ext->alg = IW_ENCODE_ALG_TKIP; - else if (strcmp(crypt->ops->name, "CCMP")) + else if (strcmp(crypt->ops->name, "CCMP") == 0) ext->alg = IW_ENCODE_ALG_CCMP; else return -EINVAL; diff --git a/drivers/staging/rtl8192u/ieee80211/rtl819x_HTProc.c b/drivers/staging/rtl8192u/ieee80211/rtl819x_HTProc.c index dba3f2db9f48..a93f09033d9d 100644 --- a/drivers/staging/rtl8192u/ieee80211/rtl819x_HTProc.c +++ b/drivers/staging/rtl8192u/ieee80211/rtl819x_HTProc.c @@ -480,7 +480,7 @@ void HTConstructCapabilityElement(struct ieee80211_device *ieee, u8 *posHTCap, u } memset(posHTCap, 0, *len); if (pHT->ePeerHTSpecVer == HT_SPEC_VER_EWC) { - u8 EWC11NHTCap[] = {0x00, 0x90, 0x4c, 0x33}; // For 11n EWC definition, 2007.07.17, by Emily + static const u8 EWC11NHTCap[] = {0x00, 0x90, 0x4c, 0x33}; memcpy(posHTCap, EWC11NHTCap, sizeof(EWC11NHTCap)); pCapELE = (struct ht_capability_ele *)&posHTCap[4]; @@ -940,10 +940,8 @@ void HTOnAssocRsp(struct ieee80211_device *ieee) else pHTInfo->CurrentAMPDUFactor = HT_AGG_SIZE_64K; } else { - if (pPeerHTCap->MaxRxAMPDUFactor < HT_AGG_SIZE_32K) - pHTInfo->CurrentAMPDUFactor = pPeerHTCap->MaxRxAMPDUFactor; - else - pHTInfo->CurrentAMPDUFactor = HT_AGG_SIZE_32K; + pHTInfo->CurrentAMPDUFactor = min_t(u32, pPeerHTCap->MaxRxAMPDUFactor, + HT_AGG_SIZE_32K); } } @@ -951,10 +949,9 @@ void HTOnAssocRsp(struct ieee80211_device *ieee) * <2> Set AMPDU Minimum MPDU Start Spacing * 802.11n 3.0 section 9.7d.3 */ - if (pHTInfo->MPDU_Density > pPeerHTCap->MPDUDensity) - pHTInfo->CurrentMPDUDensity = pHTInfo->MPDU_Density; - else - pHTInfo->CurrentMPDUDensity = pPeerHTCap->MPDUDensity; + pHTInfo->CurrentMPDUDensity = max_t(u32, pHTInfo->MPDU_Density, + pPeerHTCap->MPDUDensity); + if (ieee->pairwise_key_type != KEY_TYPE_NA) pHTInfo->CurrentMPDUDensity = 7; // 8us // Force TX AMSDU diff --git a/drivers/staging/rtl8192u/r8192U_core.c b/drivers/staging/rtl8192u/r8192U_core.c index ce807c9d4219..2ca925f35830 100644 --- a/drivers/staging/rtl8192u/r8192U_core.c +++ b/drivers/staging/rtl8192u/r8192U_core.c @@ -2537,7 +2537,7 @@ static short rtl8192_init(struct net_device *dev) } #else { - const u8 queuetopipe[] = {3, 2, 1, 0, 4, 4, 0, 4, 4}; + static const u8 queuetopipe[] = {3, 2, 1, 0, 4, 4, 0, 4, 4}; memcpy(priv->txqueue_to_outpipemap, queuetopipe, 9); } diff --git a/drivers/staging/rtl8712/drv_types.h b/drivers/staging/rtl8712/drv_types.h index a44d04effc8b..76ac798642bd 100644 --- a/drivers/staging/rtl8712/drv_types.h +++ b/drivers/staging/rtl8712/drv_types.h @@ -157,12 +157,11 @@ struct _adapter { struct iw_statistics iwstats; int pid; /*process id from UI*/ struct work_struct wk_filter_rx_ff0; - u8 blnEnableRxFF0Filter; - spinlock_t lock_rx_ff0_filter; const struct firmware *fw; struct usb_interface *pusb_intf; struct mutex mutex_start; struct completion rtl8712_fw_ready; + struct completion rx_filter_ready; }; static inline u8 *myid(struct eeprom_priv *peepriv) diff --git a/drivers/staging/rtl8712/ieee80211.c b/drivers/staging/rtl8712/ieee80211.c index f926809b1021..7d8f1a29d18a 100644 --- a/drivers/staging/rtl8712/ieee80211.c +++ b/drivers/staging/rtl8712/ieee80211.c @@ -162,13 +162,13 @@ int r8712_generate_ie(struct registry_priv *registrypriv) uint sz = 0; struct wlan_bssid_ex *dev_network = ®istrypriv->dev_network; u8 *ie = dev_network->IEs; - u16 beaconPeriod = (u16)dev_network->Configuration.BeaconPeriod; + u16 beacon_period = (u16)dev_network->Configuration.BeaconPeriod; /*timestamp will be inserted by hardware*/ sz += 8; ie += sz; /*beacon interval : 2bytes*/ - *(__le16 *)ie = cpu_to_le16(beaconPeriod); + *(__le16 *)ie = cpu_to_le16(beacon_period); sz += 2; ie += 2; /*capability info*/ diff --git a/drivers/staging/rtl8712/os_intfs.c b/drivers/staging/rtl8712/os_intfs.c index d15d52c0d1a7..003e97205124 100644 --- a/drivers/staging/rtl8712/os_intfs.c +++ b/drivers/staging/rtl8712/os_intfs.c @@ -332,7 +332,6 @@ void r8712_free_drv_sw(struct _adapter *padapter) r8712_free_evt_priv(&padapter->evtpriv); r8712_DeInitSwLeds(padapter); r8712_free_mlme_priv(&padapter->mlmepriv); - r8712_free_io_queue(padapter); _free_xmit_priv(&padapter->xmitpriv); _r8712_free_sta_priv(&padapter->stapriv); _r8712_free_recv_priv(&padapter->recvpriv); diff --git a/drivers/staging/rtl8712/rtl8712_cmdctrl_bitdef.h b/drivers/staging/rtl8712/rtl8712_cmdctrl_bitdef.h index e125c7222ab5..68bdec07f51e 100644 --- a/drivers/staging/rtl8712/rtl8712_cmdctrl_bitdef.h +++ b/drivers/staging/rtl8712/rtl8712_cmdctrl_bitdef.h @@ -91,6 +91,5 @@ #define _BCNSPACE_MSK 0x0FFF #define _BCNSPACE_SHT 0 - #endif /* __RTL8712_CMDCTRL_BITDEF_H__*/ diff --git a/drivers/staging/rtl8712/rtl8712_efuse.h b/drivers/staging/rtl8712/rtl8712_efuse.h index 4969d307e978..2e1ea9d7a295 100644 --- a/drivers/staging/rtl8712/rtl8712_efuse.h +++ b/drivers/staging/rtl8712/rtl8712_efuse.h @@ -15,8 +15,8 @@ #define GET_EFUSE_OFFSET(header) ((header & 0xF0) >> 4) #define GET_EFUSE_WORD_EN(header) (header & 0x0F) -#define MAKE_EFUSE_HEADER(offset, word_en) (((offset & 0x0F) << 4) | \ - (word_en & 0x0F)) +#define MAKE_EFUSE_HEADER(offset, word_en) ((((offset) & 0x0F) << 4) | \ + ((word_en) & 0x0F)) /*--------------------------------------------------------------------------*/ struct PGPKT_STRUCT { u8 offset; diff --git a/drivers/staging/rtl8712/rtl8712_macsetting_bitdef.h b/drivers/staging/rtl8712/rtl8712_macsetting_bitdef.h index 3d9f40fa8469..46d758d3f3a4 100644 --- a/drivers/staging/rtl8712/rtl8712_macsetting_bitdef.h +++ b/drivers/staging/rtl8712/rtl8712_macsetting_bitdef.h @@ -7,7 +7,6 @@ #ifndef __RTL8712_MACSETTING_BITDEF_H__ #define __RTL8712_MACSETTING_BITDEF_H__ - /*MACID*/ /*BSSID*/ @@ -28,7 +27,5 @@ /*BUILDUSER*/ - - #endif /* __RTL8712_MACSETTING_BITDEF_H__*/ diff --git a/drivers/staging/rtl8712/rtl8712_macsetting_regdef.h b/drivers/staging/rtl8712/rtl8712_macsetting_regdef.h index e8cb2eee9294..64740d99c252 100644 --- a/drivers/staging/rtl8712/rtl8712_macsetting_regdef.h +++ b/drivers/staging/rtl8712/rtl8712_macsetting_regdef.h @@ -16,7 +16,5 @@ #define BUILDTIME (RTL8712_MACIDSETTING_ + 0x0024) #define BUILDUSER (RTL8712_MACIDSETTING_ + 0x0028) - - #endif /*__RTL8712_MACSETTING_REGDEF_H__*/ diff --git a/drivers/staging/rtl8712/rtl8712_ratectrl_regdef.h b/drivers/staging/rtl8712/rtl8712_ratectrl_regdef.h index a3eaee0e1b69..9ed5653f3f7f 100644 --- a/drivers/staging/rtl8712/rtl8712_ratectrl_regdef.h +++ b/drivers/staging/rtl8712/rtl8712_ratectrl_regdef.h @@ -39,6 +39,5 @@ #define MCS_TXAGC7 (RTL8712_RATECTRL_ + 0x67) #define CCK_TXAGC (RTL8712_RATECTRL_ + 0x68) - #endif /*__RTL8712_RATECTRL_REGDEF_H__*/ diff --git a/drivers/staging/rtl8712/rtl8712_recv.c b/drivers/staging/rtl8712/rtl8712_recv.c index 0ffb30f1af7e..7f1fdd058551 100644 --- a/drivers/staging/rtl8712/rtl8712_recv.c +++ b/drivers/staging/rtl8712/rtl8712_recv.c @@ -56,7 +56,7 @@ void r8712_init_recv_priv(struct recv_priv *precvpriv, precvbuf->ref_cnt = 0; precvbuf->adapter = padapter; list_add_tail(&precvbuf->list, - &(precvpriv->free_recv_buf_queue.queue)); + &precvpriv->free_recv_buf_queue.queue); precvbuf++; } precvpriv->free_recv_buf_queue_cnt = NR_RECVBUFF; @@ -123,8 +123,8 @@ void r8712_free_recvframe(union recv_frame *precvframe, precvframe->u.hdr.pkt = NULL; } spin_lock_irqsave(&pfree_recv_queue->lock, irqL); - list_del_init(&(precvframe->u.hdr.list)); - list_add_tail(&(precvframe->u.hdr.list), &pfree_recv_queue->queue); + list_del_init(&precvframe->u.hdr.list); + list_add_tail(&precvframe->u.hdr.list, &pfree_recv_queue->queue); if (padapter) { if (pfree_recv_queue == &precvpriv->free_recv_queue) precvpriv->free_recvframe_cnt++; @@ -319,7 +319,7 @@ static void amsdu_to_msdu(struct _adapter *padapter, union recv_frame *prframe) struct rx_pkt_attrib *pattrib; _pkt *sub_skb, *subframes[MAX_SUBFRAME_COUNT]; struct recv_priv *precvpriv = &padapter->recvpriv; - struct __queue *pfree_recv_queue = &(precvpriv->free_recv_queue); + struct __queue *pfree_recv_queue = &precvpriv->free_recv_queue; nr_subframes = 0; pattrib = &prframe->u.hdr.attrib; @@ -485,8 +485,8 @@ static int enqueue_reorder_recvframe(struct recv_reorder_ctrl *preorder_ctrl, else break; } - list_del_init(&(prframe->u.hdr.list)); - list_add_tail(&(prframe->u.hdr.list), plist); + list_del_init(&prframe->u.hdr.list); + list_add_tail(&prframe->u.hdr.list, plist); return true; } @@ -520,7 +520,7 @@ int r8712_recv_indicatepkts_in_order(struct _adapter *padapter, pattrib = &prframe->u.hdr.attrib; if (!SN_LESS(preorder_ctrl->indicate_seq, pattrib->seq_num)) { plist = plist->next; - list_del_init(&(prframe->u.hdr.list)); + list_del_init(&prframe->u.hdr.list); if (SN_EQUAL(preorder_ctrl->indicate_seq, pattrib->seq_num)) preorder_ctrl->indicate_seq = @@ -980,7 +980,7 @@ static void recvbuf2recvframe(struct _adapter *padapter, struct sk_buff *pskb) union recv_frame *precvframe = NULL; struct recv_priv *precvpriv = &padapter->recvpriv; - pfree_recv_queue = &(precvpriv->free_recv_queue); + pfree_recv_queue = &precvpriv->free_recv_queue; pbuf = pskb->data; prxstat = (struct recv_stat *)pbuf; pkt_cnt = (le32_to_cpu(prxstat->rxdw2) >> 16) & 0xff; diff --git a/drivers/staging/rtl8712/rtl8712_security_bitdef.h b/drivers/staging/rtl8712/rtl8712_security_bitdef.h index 1c26a7eca64a..44275ef455a0 100644 --- a/drivers/staging/rtl8712/rtl8712_security_bitdef.h +++ b/drivers/staging/rtl8712/rtl8712_security_bitdef.h @@ -30,6 +30,5 @@ #define _RXUSEDK BIT(1) #define _TXUSEDK BIT(0) - #endif /*__RTL8712_SECURITY_BITDEF_H__*/ diff --git a/drivers/staging/rtl8712/rtl8712_spec.h b/drivers/staging/rtl8712/rtl8712_spec.h index c0bab4c49ae9..613a410e5714 100644 --- a/drivers/staging/rtl8712/rtl8712_spec.h +++ b/drivers/staging/rtl8712/rtl8712_spec.h @@ -30,7 +30,6 @@ #define RTL8712_IOBASE_FF 0x10300000 /*IOBASE_FIFO 0x1031000~0x103AFFFF*/ - /*IOREG Offset for 8712*/ #define RTL8712_SYSCFG_ RTL8712_IOBASE_IOREG #define RTL8712_CMDCTRL_ (RTL8712_IOBASE_IOREG + 0x40) @@ -47,7 +46,6 @@ #define RTL8712_DEBUGCTRL_ (RTL8712_IOBASE_IOREG + 0x310) #define RTL8712_OFFLOAD_ (RTL8712_IOBASE_IOREG + 0x2D0) - /*FIFO for 8712*/ #define RTL8712_DMA_BCNQ (RTL8712_IOBASE_FF + 0x10000) #define RTL8712_DMA_MGTQ (RTL8712_IOBASE_FF + 0x20000) @@ -60,7 +58,6 @@ #define RTL8712_DMA_H2CCMD (RTL8712_IOBASE_FF + 0x90000) #define RTL8712_DMA_C2HCMD (RTL8712_IOBASE_FF + 0xA0000) - /*------------------------------*/ /*BIT 16 15*/ diff --git a/drivers/staging/rtl8712/rtl8712_syscfg_bitdef.h b/drivers/staging/rtl8712/rtl8712_syscfg_bitdef.h index a328ca9b340c..d92df3fbd2b1 100644 --- a/drivers/staging/rtl8712/rtl8712_syscfg_bitdef.h +++ b/drivers/staging/rtl8712/rtl8712_syscfg_bitdef.h @@ -117,20 +117,17 @@ * Block's Bandgap. */ - /*--------------------------------------------------------------------------*/ /* SPS1_CTRL bits (Offset 0x18-1E, 56bits)*/ /*--------------------------------------------------------------------------*/ #define SPS1_SWEN BIT(1) /* Enable vsps18 SW Macro Block.*/ #define SPS1_LDEN BIT(0) /* Enable VSPS12 LDO Macro block.*/ - /*----------------------------------------------------------------------------*/ /* LDOA15_CTRL bits (Offset 0x20, 8bits)*/ /*----------------------------------------------------------------------------*/ #define LDA15_EN BIT(0) /* Enable LDOA15 Macro Block*/ - /*----------------------------------------------------------------------------*/ /* 8192S LDOV12D_CTRL bit (Offset 0x21, 8bits)*/ /*----------------------------------------------------------------------------*/ @@ -140,7 +137,6 @@ /*CLK_PS_CTRL*/ #define _CLK_GATE_EN BIT(0) - /* EFUSE_CTRL*/ #define EF_FLAG BIT(31) /* Access Flag, Write:1; * Read:0 diff --git a/drivers/staging/rtl8712/rtl8712_syscfg_regdef.h b/drivers/staging/rtl8712/rtl8712_syscfg_regdef.h index e95eb5832ec4..da5efcdedabe 100644 --- a/drivers/staging/rtl8712/rtl8712_syscfg_regdef.h +++ b/drivers/staging/rtl8712/rtl8712_syscfg_regdef.h @@ -14,7 +14,6 @@ #ifndef __RTL8712_SYSCFG_REGDEF_H__ #define __RTL8712_SYSCFG_REGDEF_H__ - #define SYS_ISO_CTRL (RTL8712_SYSCFG_ + 0x0000) #define SYS_FUNC_EN (RTL8712_SYSCFG_ + 0x0002) #define PMC_FSM (RTL8712_SYSCFG_ + 0x0004) @@ -39,6 +38,5 @@ #define RCLK_MON (RTL8712_SYSCFG_ + 0x003E) #define EFUSE_CLK_CTRL (RTL8712_SYSCFG_ + 0x02F8) - #endif /*__RTL8712_SYSCFG_REGDEF_H__*/ diff --git a/drivers/staging/rtl8712/rtl8712_timectrl_bitdef.h b/drivers/staging/rtl8712/rtl8712_timectrl_bitdef.h index 1af5f1dd3c20..d7bc9dd5cecd 100644 --- a/drivers/staging/rtl8712/rtl8712_timectrl_bitdef.h +++ b/drivers/staging/rtl8712/rtl8712_timectrl_bitdef.h @@ -45,6 +45,5 @@ /*BCNERRTH*/ /*MLT*/ - #endif /* __RTL8712_TIMECTRL_BITDEF_H__*/ diff --git a/drivers/staging/rtl8712/rtl8712_wmac_bitdef.h b/drivers/staging/rtl8712/rtl8712_wmac_bitdef.h index d3b45c6cd855..ea164e482347 100644 --- a/drivers/staging/rtl8712/rtl8712_wmac_bitdef.h +++ b/drivers/staging/rtl8712/rtl8712_wmac_bitdef.h @@ -45,6 +45,5 @@ #define _RPT_CNT_MSK 0x000FFFFF #define _RPT_CNT_SHT 0 - #endif /*__RTL8712_WMAC_BITDEF_H__*/ diff --git a/drivers/staging/rtl8712/rtl871x_cmd.c b/drivers/staging/rtl8712/rtl871x_cmd.c index acda930722b2..4be96df5a329 100644 --- a/drivers/staging/rtl8712/rtl871x_cmd.c +++ b/drivers/staging/rtl8712/rtl871x_cmd.c @@ -202,7 +202,7 @@ u8 r8712_sitesurvey_cmd(struct _adapter *padapter, mod_timer(&pmlmepriv->scan_to_timer, jiffies + msecs_to_jiffies(SCANNING_TIMEOUT)); padapter->ledpriv.LedControlHandler(padapter, LED_CTL_SITE_SURVEY); - padapter->blnEnableRxFF0Filter = 0; + complete(&padapter->rx_filter_ready); return _SUCCESS; } @@ -536,7 +536,7 @@ void r8712_setstakey_cmd(struct _adapter *padapter, u8 *psta, u8 unicast_key) return; } init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_); - ph2c->rsp = (u8 *) psetstakey_rsp; + ph2c->rsp = (u8 *)psetstakey_rsp; ph2c->rspsz = sizeof(struct set_stakey_rsp); ether_addr_copy(psetstakey_para->addr, sta->hwaddr); if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) diff --git a/drivers/staging/rtl8712/rtl871x_cmd.h b/drivers/staging/rtl8712/rtl871x_cmd.h index 95e9ea5b2d98..8453d8de8248 100644 --- a/drivers/staging/rtl8712/rtl871x_cmd.h +++ b/drivers/staging/rtl8712/rtl871x_cmd.h @@ -66,7 +66,6 @@ struct evt_priv { u8 *evt_buf; /*shall be non-paged, and 4 bytes aligned*/ u8 *evt_allocated_buf; u32 evt_done_cnt; - struct tasklet_struct event_tasklet; }; #define init_h2fwcmd_w_parm_no_rsp(pcmd, pparm, code) \ @@ -316,7 +315,6 @@ enum _RT_CHANNEL_DOMAIN { RT_CHANNEL_DOMAIN_MAX, }; - struct SetChannelPlan_param { enum _RT_CHANNEL_DOMAIN ChannelPlan; }; @@ -338,7 +336,6 @@ struct getdatarate_rsp { u8 datarates[NumRates]; }; - /* * Caller Mode: Any * AP: AP can use the info for the contents of beacon frame diff --git a/drivers/staging/rtl8712/rtl871x_ioctl.h b/drivers/staging/rtl8712/rtl871x_ioctl.h index 634e67461712..d6332a8c7f4f 100644 --- a/drivers/staging/rtl8712/rtl871x_ioctl.h +++ b/drivers/staging/rtl8712/rtl871x_ioctl.h @@ -13,7 +13,6 @@ #define OID_802_11_PMKID 0x0d010123 #endif - /* For DDK-defined OIDs*/ #define OID_NDIS_SEG1 0x00010100 #define OID_NDIS_SEG2 0x00010200 diff --git a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c index 3b6926613257..36f6904d25ab 100644 --- a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c +++ b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c @@ -82,9 +82,9 @@ static inline void handle_pairwise_key(struct sta_info *psta, (param->u.crypt. key_len > 16 ? 16 : param->u.crypt.key_len)); if (strcmp(param->u.crypt.alg, "TKIP") == 0) { /* set mic key */ memcpy(psta->tkiptxmickey. skey, - &(param->u.crypt.key[16]), 8); + ¶m->u.crypt.key[16], 8); memcpy(psta->tkiprxmickey. skey, - &(param->u.crypt.key[24]), 8); + ¶m->u.crypt.key[24], 8); padapter->securitypriv. busetkipkey = false; mod_timer(&padapter->securitypriv.tkip_timer, jiffies + msecs_to_jiffies(50)); @@ -600,7 +600,7 @@ static int r8711_wx_get_name(struct net_device *dev, u32 ht_ielen = 0; char *p; u8 ht_cap = false; - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct wlan_bssid_ex *pcur_bss = &pmlmepriv->cur_network.network; u8 *prates; @@ -659,8 +659,8 @@ static int r8711_wx_set_freq(struct net_device *dev, /* If setting by frequency, convert to a channel */ if ((fwrq->e == 1) && - (fwrq->m >= (int) 2.412e8) && - (fwrq->m <= (int) 2.487e8)) { + (fwrq->m >= 241200000) && + (fwrq->m <= 248700000)) { int f = fwrq->m / 100000; int c = 0; @@ -1494,7 +1494,7 @@ static int r8711_wx_set_enc(struct net_device *dev, u32 keyindex_provided; struct NDIS_802_11_WEP wep; enum NDIS_802_11_AUTHENTICATION_MODE authmode; - struct iw_point *erq = &(wrqu->encoding); + struct iw_point *erq = &wrqu->encoding; struct _adapter *padapter = netdev_priv(dev); key = erq->flags & IW_ENCODE_INDEX; @@ -1589,8 +1589,8 @@ static int r8711_wx_get_enc(struct net_device *dev, { uint key; struct _adapter *padapter = netdev_priv(dev); - struct iw_point *erq = &(wrqu->encoding); - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); + struct iw_point *erq = &wrqu->encoding; + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; union Keytype *dk = padapter->securitypriv.DefKey; if (!check_fwstate(pmlmepriv, _FW_LINKED)) { @@ -1670,7 +1670,7 @@ static int r871x_wx_set_auth(struct net_device *dev, union iwreq_data *wrqu, char *extra) { struct _adapter *padapter = netdev_priv(dev); - struct iw_param *param = (struct iw_param *)&(wrqu->param); + struct iw_param *param = (struct iw_param *)&wrqu->param; int paramid; int paramval; int ret = 0; @@ -1964,7 +1964,7 @@ static int r871x_get_ap_info(struct net_device *dev, return -EINVAL; data[32] = 0; - spin_lock_irqsave(&(pmlmepriv->scanned_queue.lock), irqL); + spin_lock_irqsave(&pmlmepriv->scanned_queue.lock, irqL); phead = &queue->queue; plist = phead->next; while (1) { @@ -1974,7 +1974,7 @@ static int r871x_get_ap_info(struct net_device *dev, if (!mac_pton(data, bssid)) { netdev_info(dev, "r8712u: Invalid BSSID '%s'.\n", (u8 *)data); - spin_unlock_irqrestore(&(pmlmepriv->scanned_queue.lock), + spin_unlock_irqrestore(&pmlmepriv->scanned_queue.lock, irqL); return -EINVAL; } @@ -1996,7 +1996,7 @@ static int r871x_get_ap_info(struct net_device *dev, } plist = plist->next; } - spin_unlock_irqrestore(&(pmlmepriv->scanned_queue.lock), irqL); + spin_unlock_irqrestore(&pmlmepriv->scanned_queue.lock, irqL); if (pdata->length >= 34) { if (copy_to_user((u8 __user *)pdata->pointer + 32, (u8 *)&pdata->flags, 1)) diff --git a/drivers/staging/rtl8712/rtl871x_ioctl_rtl.c b/drivers/staging/rtl8712/rtl871x_ioctl_rtl.c index b78101afc93d..2b539335206a 100644 --- a/drivers/staging/rtl8712/rtl871x_ioctl_rtl.c +++ b/drivers/staging/rtl8712/rtl871x_ioctl_rtl.c @@ -367,7 +367,6 @@ uint oid_rt_get_scan_in_progress_hdl(struct oid_par_priv *poid_par_priv) return RNDIS_STATUS_SUCCESS; } - uint oid_rt_forced_data_rate_hdl(struct oid_par_priv *poid_par_priv) { return RNDIS_STATUS_SUCCESS; diff --git a/drivers/staging/rtl8712/rtl871x_ioctl_set.c b/drivers/staging/rtl8712/rtl871x_ioctl_set.c index 6cdc6f1a6bc6..34c9a52b4c42 100644 --- a/drivers/staging/rtl8712/rtl871x_ioctl_set.c +++ b/drivers/staging/rtl8712/rtl871x_ioctl_set.c @@ -22,7 +22,6 @@ #include "usb_osintf.h" #include "usb_ops.h" - static u8 validate_ssid(struct ndis_802_11_ssid *ssid) { u8 i; @@ -76,7 +75,7 @@ static u8 do_join(struct _adapter *padapter) * acquired by caller... */ struct wlan_bssid_ex *pdev_network = - &(padapter->registrypriv.dev_network); + &padapter->registrypriv.dev_network; pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE; pibss = padapter->registrypriv.dev_network.MacAddress; memcpy(&pdev_network->Ssid, diff --git a/drivers/staging/rtl8712/rtl871x_mlme.c b/drivers/staging/rtl8712/rtl871x_mlme.c index 92b7c9c07df6..63e12b157001 100644 --- a/drivers/staging/rtl8712/rtl871x_mlme.c +++ b/drivers/staging/rtl8712/rtl871x_mlme.c @@ -431,8 +431,7 @@ static int is_desired_network(struct _adapter *adapter, bselected = false; if (check_fwstate(&adapter->mlmepriv, WIFI_ADHOC_STATE)) { if (pnetwork->network.InfrastructureMode != - adapter->mlmepriv.cur_network.network. - InfrastructureMode) + adapter->mlmepriv.cur_network.network.InfrastructureMode) bselected = false; } return bselected; @@ -539,8 +538,7 @@ void r8712_surveydone_event_callback(struct _adapter *adapter, u8 *pbuf) struct wlan_bssid_ex *pdev_network = &(adapter->registrypriv.dev_network); u8 *pibss = - adapter->registrypriv. - dev_network.MacAddress; + adapter->registrypriv.dev_network.MacAddress; pmlmepriv->fw_state ^= _FW_UNDER_SURVEY; memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, @@ -688,11 +686,9 @@ void r8712_joinbss_event_callback(struct _adapter *adapter, u8 *pbuf) pnetwork->network.Configuration.DSConfig = le32_to_cpu(pnetwork->network.Configuration.DSConfig); pnetwork->network.Configuration.FHConfig.DwellTime = - le32_to_cpu(pnetwork->network.Configuration.FHConfig. - DwellTime); + le32_to_cpu(pnetwork->network.Configuration.FHConfig.DwellTime); pnetwork->network.Configuration.FHConfig.HopPattern = - le32_to_cpu(pnetwork->network.Configuration. - FHConfig.HopPattern); + le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopPattern); pnetwork->network.Configuration.FHConfig.HopSet = le32_to_cpu(pnetwork->network.Configuration.FHConfig.HopSet); pnetwork->network.Configuration.FHConfig.Length = @@ -717,36 +713,29 @@ void r8712_joinbss_event_callback(struct _adapter *adapter, u8 *pbuf) if (check_fwstate(pmlmepriv, _FW_LINKED)) { if (the_same_macaddr) { ptarget_wlan = - r8712_find_network(&pmlmepriv-> - scanned_queue, + r8712_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); } else { pcur_wlan = - r8712_find_network(&pmlmepriv-> - scanned_queue, + r8712_find_network(&pmlmepriv->scanned_queue, cur_network->network.MacAddress); if (pcur_wlan) pcur_wlan->fixed = false; pcur_sta = r8712_get_stainfo(pstapriv, cur_network->network.MacAddress); - spin_lock_irqsave(&pstapriv-> - sta_hash_lock, irqL2); + spin_lock_irqsave(&pstapriv->sta_hash_lock, irqL2); r8712_free_stainfo(adapter, pcur_sta); - spin_unlock_irqrestore(&(pstapriv-> - sta_hash_lock), irqL2); + spin_unlock_irqrestore(&(pstapriv->sta_hash_lock), irqL2); ptarget_wlan = - r8712_find_network(&pmlmepriv-> - scanned_queue, - pnetwork->network. - MacAddress); + r8712_find_network(&pmlmepriv->scanned_queue, + pnetwork->network.MacAddress); if (ptarget_wlan) ptarget_wlan->fixed = true; } } else { - ptarget_wlan = r8712_find_network(&pmlmepriv-> - scanned_queue, + ptarget_wlan = r8712_find_network(&pmlmepriv->scanned_queue, pnetwork->network.MacAddress); if (ptarget_wlan) ptarget_wlan->fixed = true; @@ -779,39 +768,25 @@ void r8712_joinbss_event_callback(struct _adapter *adapter, u8 *pbuf) ptarget_sta->aid = pnetwork->join_res; ptarget_sta->qos_option = 1; ptarget_sta->mac_id = 5; - if (adapter->securitypriv. - AuthAlgrthm == 2) { - adapter->securitypriv. - binstallGrpkey = - false; - adapter->securitypriv. - busetkipkey = - false; - adapter->securitypriv. - bgrpkey_handshake = - false; - ptarget_sta->ieee8021x_blocked - = true; - ptarget_sta->XPrivacy = - adapter->securitypriv. - PrivacyAlgrthm; - memset((u8 *)&ptarget_sta-> - x_UncstKey, + if (adapter->securitypriv.AuthAlgrthm == 2) { + adapter->securitypriv.binstallGrpkey = false; + adapter->securitypriv.busetkipkey = false; + adapter->securitypriv.bgrpkey_handshake = false; + ptarget_sta->ieee8021x_blocked = true; + ptarget_sta->XPrivacy = adapter-> + securitypriv.PrivacyAlgrthm; + memset((u8 *)&ptarget_sta->x_UncstKey, 0, sizeof(union Keytype)); - memset((u8 *)&ptarget_sta-> - tkiprxmickey, + memset((u8 *)&ptarget_sta->tkiprxmickey, 0, sizeof(union Keytype)); - memset((u8 *)&ptarget_sta-> - tkiptxmickey, + memset((u8 *)&ptarget_sta->tkiptxmickey, 0, sizeof(union Keytype)); - memset((u8 *)&ptarget_sta-> - txpn, 0, + memset((u8 *)&ptarget_sta->txpn, 0, sizeof(union pn48)); - memset((u8 *)&ptarget_sta-> - rxpn, 0, + memset((u8 *)&ptarget_sta->rxpn, 0, sizeof(union pn48)); } } else { @@ -942,8 +917,7 @@ void r8712_stadel_event_callback(struct _adapter *adapter, u8 *pbuf) pdev_network = &(adapter->registrypriv.dev_network); pibss = adapter->registrypriv.dev_network.MacAddress; memcpy(pdev_network, &tgt_network->network, - r8712_get_wlan_bssid_ex_sz(&tgt_network-> - network)); + r8712_get_wlan_bssid_ex_sz(&tgt_network->network)); memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(struct ndis_802_11_ssid)); @@ -1092,8 +1066,7 @@ int r8712_select_and_join_from_scan(struct mlme_priv *pmlmepriv) src_ssid = pmlmepriv->assoc_bssid; if (!memcmp(dst_ssid, src_ssid, ETH_ALEN)) { if (check_fwstate(pmlmepriv, _FW_LINKED)) { - if (is_same_network(&pmlmepriv-> - cur_network.network, + if (is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network)) { _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); @@ -1284,26 +1257,13 @@ int r8712_restruct_wmm_ie(struct _adapter *adapter, u8 *in_ie, u8 *out_ie, */ static int SecIsInPMKIDList(struct _adapter *Adapter, u8 *bssid) { - struct security_priv *psecuritypriv = &Adapter->securitypriv; - int i = 0; - - do { - if (psecuritypriv->PMKIDList[i].bUsed && - (!memcmp(psecuritypriv->PMKIDList[i].Bssid, - bssid, ETH_ALEN))) - break; - i++; - - } while (i < NUM_PMKID_CACHE); + struct security_priv *p = &Adapter->securitypriv; + int i; - if (i == NUM_PMKID_CACHE) { - i = -1; /* Could not find. */ - } else { - ; /* There is one Pre-Authentication Key for the - * specific BSSID. - */ - } - return i; + for (i = 0; i < NUM_PMKID_CACHE; i++) + if (p->PMKIDList[i].bUsed && !memcmp(p->PMKIDList[i].Bssid, bssid, ETH_ALEN)) + return i; + return -1; } sint r8712_restruct_sec_ie(struct _adapter *adapter, u8 *in_ie, diff --git a/drivers/staging/rtl8712/rtl871x_mp_ioctl.h b/drivers/staging/rtl8712/rtl871x_mp_ioctl.h index 98204493a04c..aa4d5ce471f2 100644 --- a/drivers/staging/rtl8712/rtl871x_mp_ioctl.h +++ b/drivers/staging/rtl8712/rtl871x_mp_ioctl.h @@ -148,7 +148,6 @@ extern struct oid_obj_priv oid_rtl_seg_87_12_00[32]; #endif /* _RTL871X_MP_IOCTL_C_ */ - enum MP_MODE { MP_START_MODE, MP_STOP_MODE, diff --git a/drivers/staging/rtl8712/rtl871x_mp_phy_regdef.h b/drivers/staging/rtl8712/rtl871x_mp_phy_regdef.h index ca5072e11e22..a08c5d2f59e3 100644 --- a/drivers/staging/rtl8712/rtl871x_mp_phy_regdef.h +++ b/drivers/staging/rtl8712/rtl871x_mp_phy_regdef.h @@ -26,7 +26,6 @@ #ifndef __RTL871X_MP_PHY_REGDEF_H #define __RTL871X_MP_PHY_REGDEF_H - /*--------------------------Define Parameters-------------------------------*/ /*============================================================ @@ -1008,7 +1007,6 @@ #define ANTENNA_C 0x4 #define ANTENNA_D 0x8 - /* accept all physical address */ #define RCR_AAP BIT(0) #define RCR_APM BIT(1) /* accept physical match */ @@ -1032,6 +1030,5 @@ /*--------------------------Define Parameters-------------------------------*/ - #endif /*__INC_HAL8192SPHYREG_H */ diff --git a/drivers/staging/rtl8712/rtl871x_recv.c b/drivers/staging/rtl8712/rtl871x_recv.c index 66cc50f24e29..de9a568eaffa 100644 --- a/drivers/staging/rtl8712/rtl871x_recv.c +++ b/drivers/staging/rtl8712/rtl871x_recv.c @@ -455,7 +455,6 @@ static sint validate_recv_mgnt_frame(struct _adapter *adapter, return _FAIL; } - static sint validate_recv_data_frame(struct _adapter *adapter, union recv_frame *precv_frame) { diff --git a/drivers/staging/rtl8712/rtl871x_security.c b/drivers/staging/rtl8712/rtl871x_security.c index e0a1c30a8fe6..e46a5dbc7b65 100644 --- a/drivers/staging/rtl8712/rtl871x_security.c +++ b/drivers/staging/rtl8712/rtl871x_security.c @@ -381,7 +381,6 @@ void seccalctkipmic(u8 *key, u8 *header, u8 *data, u32 data_len, u8 *mic_code, #define P1K_SIZE 10 /* 80-bit Phase1 key */ #define RC4_KEY_SIZE 16 /* 128-bit RC4KEY (104 bits unknown) */ - /* 2-unsigned char by 2-unsigned char subset of the full AES S-box table */ static const unsigned short Sbox1[2][256] = {/* Sbox for hash (can be in ROM) */ { diff --git a/drivers/staging/rtl8712/sta_info.h b/drivers/staging/rtl8712/sta_info.h index 9b7e5ffa380d..6286c622475e 100644 --- a/drivers/staging/rtl8712/sta_info.h +++ b/drivers/staging/rtl8712/sta_info.h @@ -21,7 +21,6 @@ #define NUM_STA 32 #define NUM_ACL 64 - /* if mode ==0, then the sta is allowed once the addr is hit. * if mode ==1, then the sta is rejected once the addr is non-hit. */ diff --git a/drivers/staging/rtl8712/usb_intf.c b/drivers/staging/rtl8712/usb_intf.c index ee4c61f85a07..37364d3101e2 100644 --- a/drivers/staging/rtl8712/usb_intf.c +++ b/drivers/staging/rtl8712/usb_intf.c @@ -265,6 +265,7 @@ static uint r8712_usb_dvobj_init(struct _adapter *padapter) static void r8712_usb_dvobj_deinit(struct _adapter *padapter) { + r8712_free_io_queue(padapter); } void rtl871x_intf_stop(struct _adapter *padapter) @@ -302,9 +303,6 @@ void r871x_dev_unload(struct _adapter *padapter) rtl8712_hal_deinit(padapter); } - /*s6.*/ - if (padapter->dvobj_deinit) - padapter->dvobj_deinit(padapter); padapter->bup = false; } } @@ -538,13 +536,13 @@ static int r871xu_drv_init(struct usb_interface *pusb_intf, } else { AutoloadFail = false; } - if (((mac[0] == 0xff) && (mac[1] == 0xff) && + if ((!AutoloadFail) || + ((mac[0] == 0xff) && (mac[1] == 0xff) && (mac[2] == 0xff) && (mac[3] == 0xff) && (mac[4] == 0xff) && (mac[5] == 0xff)) || ((mac[0] == 0x00) && (mac[1] == 0x00) && (mac[2] == 0x00) && (mac[3] == 0x00) && - (mac[4] == 0x00) && (mac[5] == 0x00)) || - (!AutoloadFail)) { + (mac[4] == 0x00) && (mac[5] == 0x00))) { mac[0] = 0x00; mac[1] = 0xe0; mac[2] = 0x4c; @@ -568,7 +566,7 @@ static int r871xu_drv_init(struct usb_interface *pusb_intf, /* step 6. Load the firmware asynchronously */ if (rtl871x_load_fw(padapter)) goto deinit_drv_sw; - spin_lock_init(&padapter->lock_rx_ff0_filter); + init_completion(&padapter->rx_filter_ready); mutex_init(&padapter->mutex_start); return 0; @@ -607,6 +605,8 @@ static void r871xu_dev_remove(struct usb_interface *pusb_intf) /* Stop driver mlme relation timer */ r8712_stop_drv_timers(padapter); r871x_dev_unload(padapter); + if (padapter->dvobj_deinit) + padapter->dvobj_deinit(padapter); r8712_free_drv_sw(padapter); free_netdev(pnetdev); diff --git a/drivers/staging/rtl8712/usb_ops.c b/drivers/staging/rtl8712/usb_ops.c index e64845e6adf3..af9966d03979 100644 --- a/drivers/staging/rtl8712/usb_ops.c +++ b/drivers/staging/rtl8712/usb_ops.c @@ -29,7 +29,8 @@ static u8 usb_read8(struct intf_hdl *intfhdl, u32 addr) u16 wvalue; u16 index; u16 len; - __le32 data; + int status; + __le32 data = 0; struct intf_priv *intfpriv = intfhdl->pintfpriv; request = 0x05; @@ -37,8 +38,10 @@ static u8 usb_read8(struct intf_hdl *intfhdl, u32 addr) index = 0; wvalue = (u16)(addr & 0x0000ffff); len = 1; - r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index, &data, len, - requesttype); + status = r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index, + &data, len, requesttype); + if (status < 0) + return 0; return (u8)(le32_to_cpu(data) & 0x0ff); } @@ -49,7 +52,8 @@ static u16 usb_read16(struct intf_hdl *intfhdl, u32 addr) u16 wvalue; u16 index; u16 len; - __le32 data; + int status; + __le32 data = 0; struct intf_priv *intfpriv = intfhdl->pintfpriv; request = 0x05; @@ -57,8 +61,10 @@ static u16 usb_read16(struct intf_hdl *intfhdl, u32 addr) index = 0; wvalue = (u16)(addr & 0x0000ffff); len = 2; - r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index, &data, len, - requesttype); + status = r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index, + &data, len, requesttype); + if (status < 0) + return 0; return (u16)(le32_to_cpu(data) & 0xffff); } @@ -69,7 +75,8 @@ static u32 usb_read32(struct intf_hdl *intfhdl, u32 addr) u16 wvalue; u16 index; u16 len; - __le32 data; + int status; + __le32 data = 0; struct intf_priv *intfpriv = intfhdl->pintfpriv; request = 0x05; @@ -77,8 +84,10 @@ static u32 usb_read32(struct intf_hdl *intfhdl, u32 addr) index = 0; wvalue = (u16)(addr & 0x0000ffff); len = 4; - r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index, &data, len, - requesttype); + status = r8712_usbctrl_vendorreq(intfpriv, request, wvalue, index, + &data, len, requesttype); + if (status < 0) + return 0; return le32_to_cpu(data); } diff --git a/drivers/staging/rtl8712/usb_ops_linux.c b/drivers/staging/rtl8712/usb_ops_linux.c index f984a5ab2c6f..b2181e1e2d38 100644 --- a/drivers/staging/rtl8712/usb_ops_linux.c +++ b/drivers/staging/rtl8712/usb_ops_linux.c @@ -495,14 +495,21 @@ int r8712_usbctrl_vendorreq(struct intf_priv *pintfpriv, u8 request, u16 value, } status = usb_control_msg(udev, pipe, request, reqtype, value, index, pIo_buf, len, 500); - if (status > 0) { /* Success this control transfer. */ - if (requesttype == 0x01) { - /* For Control read transfer, we have to copy the read - * data from pIo_buf to pdata. - */ - memcpy(pdata, pIo_buf, status); - } + if (status < 0) + goto free; + if (status != len) { + status = -EREMOTEIO; + goto free; + } + /* Success this control transfer. */ + if (requesttype == 0x01) { + /* For Control read transfer, we have to copy the read + * data from pIo_buf to pdata. + */ + memcpy(pdata, pIo_buf, status); } + +free: kfree(palloc_buf); return status; } diff --git a/drivers/staging/rtl8712/wifi.h b/drivers/staging/rtl8712/wifi.h index b8acb9c7395d..498e6dec7e67 100644 --- a/drivers/staging/rtl8712/wifi.h +++ b/drivers/staging/rtl8712/wifi.h @@ -186,7 +186,6 @@ static inline unsigned char *get_hdr_bssid(unsigned char *pframe) #define _CAPABILITY_ 2 #define _TIMESTAMP_ 8 - /*----------------------------------------------------------------------------- * Below is the definition for WMM *------------------------------------------------------------------------------ diff --git a/drivers/staging/rtl8712/xmit_linux.c b/drivers/staging/rtl8712/xmit_linux.c index 90d34cf9d2ff..4a93839bf947 100644 --- a/drivers/staging/rtl8712/xmit_linux.c +++ b/drivers/staging/rtl8712/xmit_linux.c @@ -95,18 +95,12 @@ void r8712_SetFilter(struct work_struct *work) struct _adapter *adapter = container_of(work, struct _adapter, wk_filter_rx_ff0); u8 oldvalue = 0x00, newvalue = 0x00; - unsigned long irqL; oldvalue = r8712_read8(adapter, 0x117); newvalue = oldvalue & 0xfe; r8712_write8(adapter, 0x117, newvalue); - spin_lock_irqsave(&adapter->lock_rx_ff0_filter, irqL); - adapter->blnEnableRxFF0Filter = 1; - spin_unlock_irqrestore(&adapter->lock_rx_ff0_filter, irqL); - do { - msleep(100); - } while (adapter->blnEnableRxFF0Filter == 1); + wait_for_completion(&adapter->rx_filter_ready); r8712_write8(adapter, 0x117, oldvalue); } diff --git a/drivers/staging/rtl8723bs/core/rtw_ap.c b/drivers/staging/rtl8723bs/core/rtw_ap.c index 5478188be991..d30d6e6bcd07 100644 --- a/drivers/staging/rtl8723bs/core/rtw_ap.c +++ b/drivers/staging/rtl8723bs/core/rtw_ap.c @@ -520,12 +520,12 @@ void update_sta_info_apmode(struct adapter *padapter, struct sta_info *psta) /* B0 Config LDPC Coding Capability */ if (TEST_FLAG(phtpriv_ap->ldpc_cap, LDPC_HT_ENABLE_TX) && - GET_HT_CAPABILITY_ELE_LDPC_CAP((u8 *)(&phtpriv_sta->ht_cap))) + GET_HT_CAPABILITY_ELE_LDPC_CAP((u8 *)(&phtpriv_sta->ht_cap))) SET_FLAG(cur_ldpc_cap, (LDPC_HT_ENABLE_TX | LDPC_HT_CAP_TX)); /* B7 B8 B9 Config STBC setting */ if (TEST_FLAG(phtpriv_ap->stbc_cap, STBC_HT_ENABLE_TX) && - GET_HT_CAPABILITY_ELE_RX_STBC((u8 *)(&phtpriv_sta->ht_cap))) + GET_HT_CAPABILITY_ELE_RX_STBC((u8 *)(&phtpriv_sta->ht_cap))) SET_FLAG(cur_stbc_cap, (STBC_HT_ENABLE_TX | STBC_HT_CAP_TX)); } else { phtpriv_sta->ampdu_enable = false; @@ -1065,10 +1065,12 @@ int rtw_check_beacon_data(struct adapter *padapter, u8 *pbuf, int len) ); if ((psecuritypriv->wpa_pairwise_cipher & WPA_CIPHER_CCMP) || - (psecuritypriv->wpa2_pairwise_cipher & WPA_CIPHER_CCMP)) { - pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY & (0x07 << 2)); + (psecuritypriv->wpa2_pairwise_cipher & WPA_CIPHER_CCMP)) { + pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY & + (0x07 << 2)); } else { - pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY & 0x00); + pht_cap->ampdu_params_info |= (IEEE80211_HT_CAP_AMPDU_DENSITY & + 0x00); } rtw_hal_get_def_var( @@ -1116,7 +1118,7 @@ int rtw_check_beacon_data(struct adapter *padapter, u8 *pbuf, int len) pmlmepriv->htpriv.ht_option = false; if ((psecuritypriv->wpa2_pairwise_cipher & WPA_CIPHER_TKIP) || - (psecuritypriv->wpa_pairwise_cipher & WPA_CIPHER_TKIP)) { + (psecuritypriv->wpa_pairwise_cipher & WPA_CIPHER_TKIP)) { /* todo: */ /* ht_cap = false; */ } @@ -1725,7 +1727,7 @@ void bss_cap_update_on_sta_join(struct adapter *padapter, struct sta_info *psta) pmlmepriv->num_sta_no_short_preamble--; if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_preamble == 0)) { + (pmlmepriv->num_sta_no_short_preamble == 0)) { beacon_updated = true; update_beacon(padapter, 0xFF, NULL, true); } @@ -1763,7 +1765,7 @@ void bss_cap_update_on_sta_join(struct adapter *padapter, struct sta_info *psta) pmlmepriv->num_sta_no_short_slot_time++; if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_slot_time == 1)) { + (pmlmepriv->num_sta_no_short_slot_time == 1)) { beacon_updated = true; update_beacon(padapter, 0xFF, NULL, true); } @@ -1775,7 +1777,7 @@ void bss_cap_update_on_sta_join(struct adapter *padapter, struct sta_info *psta) pmlmepriv->num_sta_no_short_slot_time--; if ((pmlmeext->cur_wireless_mode > WIRELESS_11B) && - (pmlmepriv->num_sta_no_short_slot_time == 0)) { + (pmlmepriv->num_sta_no_short_slot_time == 0)) { beacon_updated = true; update_beacon(padapter, 0xFF, NULL, true); } @@ -2024,7 +2026,7 @@ void rtw_ap_restore_network(struct adapter *padapter) start_bss_network(padapter); if ((padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_) || - (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) { + (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) { /* restore group key, WEP keys is restored in ips_leave() */ rtw_set_key( padapter, @@ -2062,7 +2064,7 @@ void rtw_ap_restore_network(struct adapter *padapter) /* pairwise key */ /* per sta pairwise key and settings */ if ((psecuritypriv->dot11PrivacyAlgrthm == _TKIP_) || - (psecuritypriv->dot11PrivacyAlgrthm == _AES_)) { + (psecuritypriv->dot11PrivacyAlgrthm == _AES_)) { rtw_setstakey_cmd(padapter, psta, true, false); } } diff --git a/drivers/staging/rtl8723bs/core/rtw_cmd.c b/drivers/staging/rtl8723bs/core/rtw_cmd.c index 14d37b369273..b4170f64d118 100644 --- a/drivers/staging/rtl8723bs/core/rtw_cmd.c +++ b/drivers/staging/rtl8723bs/core/rtw_cmd.c @@ -1238,7 +1238,7 @@ u8 traffic_status_watchdog(struct adapter *padapter, u8 from_timer) /*&& !MgntInitAdapterInProgress(pMgntInfo)*/) { /* if we raise bBusyTraffic in last watchdog, using lower threshold. */ if (pmlmepriv->LinkDetectInfo.bBusyTraffic) - BusyThreshold = BusyThresholdLow; + BusyThreshold = BusyThresholdLow; if (pmlmepriv->LinkDetectInfo.NumRxOkInPeriod > BusyThreshold || pmlmepriv->LinkDetectInfo.NumTxOkInPeriod > BusyThreshold) { @@ -1885,11 +1885,8 @@ void rtw_survey_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd) { struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - if (pcmd->res == H2C_DROPPED) { + if (pcmd->res != H2C_SUCCESS) { /* TODO: cancel timer and do timeout handler directly... */ - /* need to make timeout handlerOS independent */ - _set_timer(&pmlmepriv->scan_to_timer, 1); - } else if (pcmd->res != H2C_SUCCESS) { _set_timer(&pmlmepriv->scan_to_timer, 1); } @@ -1916,11 +1913,8 @@ void rtw_joinbss_cmd_callback(struct adapter *padapter, struct cmd_obj *pcmd) { struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - if (pcmd->res == H2C_DROPPED) { + if (pcmd->res != H2C_SUCCESS) { /* TODO: cancel timer and do timeout handler directly... */ - /* need to make timeout handlerOS independent */ - _set_timer(&pmlmepriv->assoc_timer, 1); - } else if (pcmd->res != H2C_SUCCESS) { _set_timer(&pmlmepriv->assoc_timer, 1); } diff --git a/drivers/staging/rtl8723bs/core/rtw_efuse.c b/drivers/staging/rtl8723bs/core/rtw_efuse.c index 3d3c77273026..06e727ce9cc2 100644 --- a/drivers/staging/rtl8723bs/core/rtw_efuse.c +++ b/drivers/staging/rtl8723bs/core/rtw_efuse.c @@ -100,7 +100,7 @@ u8 PwrState) u16 Efuse_GetCurrentSize( struct adapter *padapter, - u8 efuseType, + u8 efuseType, bool bPseudoTest) { return padapter->HalFunc.EfuseGetCurrentSize(padapter, efuseType, @@ -124,29 +124,29 @@ Efuse_CalculateWordCnts(u8 word_en) } /* */ -/* Description: */ -/* 1. Execute E-Fuse read byte operation according as map offset and */ -/* save to E-Fuse table. */ -/* 2. Referred from SD1 Richard. */ +/* Description: */ +/* 1. Execute E-Fuse read byte operation according as map offset and */ +/* save to E-Fuse table. */ +/* 2. Referred from SD1 Richard. */ /* */ -/* Assumption: */ -/* 1. Boot from E-Fuse and successfully auto-load. */ -/* 2. PASSIVE_LEVEL (USB interface) */ +/* Assumption: */ +/* 1. Boot from E-Fuse and successfully auto-load. */ +/* 2. PASSIVE_LEVEL (USB interface) */ /* */ -/* Created by Roger, 2008.10.21. */ +/* Created by Roger, 2008.10.21. */ /* */ -/* 2008/12/12 MH 1. Reorganize code flow and reserve bytes. and add description. */ -/* 2. Add efuse utilization collect. */ -/* 2008/12/22 MH Read Efuse must check if we write section 1 data again!!! Sec1 */ -/* write addr must be after sec5. */ +/* 2008/12/12 MH 1. Reorganize code flow and reserve bytes. and add description. */ +/* 2. Add efuse utilization collect. */ +/* 2008/12/22 MH Read Efuse must check if we write section 1 data again!!! Sec1 */ +/* write addr must be after sec5. */ /* */ void efuse_ReadEFuse( struct adapter *Adapter, u8 efuseType, - u16 _offset, - u16 _size_byte, + u16 _offset, + u16 _size_byte, u8 *pbuf, bool bPseudoTest ); @@ -154,8 +154,8 @@ void efuse_ReadEFuse( struct adapter *Adapter, u8 efuseType, - u16 _offset, - u16 _size_byte, + u16 _offset, + u16 _size_byte, u8 *pbuf, bool bPseudoTest ) @@ -168,7 +168,7 @@ EFUSE_GetEfuseDefinition( struct adapter *padapter, u8 efuseType, u8 type, - void *pOut, + void *pOut, bool bPseudoTest ) { @@ -194,7 +194,7 @@ EFUSE_GetEfuseDefinition( u8 EFUSE_Read1Byte( struct adapter *Adapter, -u16 Address) +u16 Address) { u8 Bytetemp = {0x00}; u8 temp = {0x00}; @@ -235,8 +235,8 @@ u16 Address) u8 efuse_OneByteRead( struct adapter *padapter, -u16 addr, -u8 *data, +u16 addr, +u8 *data, bool bPseudoTest) { u32 tmpidx = 0; @@ -324,8 +324,8 @@ u8 efuse_OneByteWrite(struct adapter *padapter, u16 addr, u8 data, bool bPseudoT int Efuse_PgPacketRead(struct adapter *padapter, - u8 offset, - u8 *data, + u8 offset, + u8 *data, bool bPseudoTest) { return padapter->HalFunc.Efuse_PgPacketRead(padapter, offset, data, @@ -334,9 +334,9 @@ Efuse_PgPacketRead(struct adapter *padapter, int Efuse_PgPacketWrite(struct adapter *padapter, - u8 offset, - u8 word_en, - u8 *data, + u8 offset, + u8 word_en, + u8 *data, bool bPseudoTest) { return padapter->HalFunc.Efuse_PgPacketWrite(padapter, offset, word_en, @@ -386,7 +386,7 @@ efuse_WordEnableDataRead(u8 word_en, u8 Efuse_WordEnableDataWrite(struct adapter *padapter, - u16 efuse_addr, + u16 efuse_addr, u8 word_en, u8 *data, bool bPseudoTest) diff --git a/drivers/staging/rtl8723bs/core/rtw_ieee80211.c b/drivers/staging/rtl8723bs/core/rtw_ieee80211.c index b449be537376..68e41d99679d 100644 --- a/drivers/staging/rtl8723bs/core/rtw_ieee80211.c +++ b/drivers/staging/rtl8723bs/core/rtw_ieee80211.c @@ -94,16 +94,14 @@ bool rtw_is_cckratesonly_included(u8 *rate) int rtw_check_network_type(unsigned char *rate, int ratelen, int channel) { - if (channel > 14) { + if (channel > 14) return WIRELESS_INVALID; - } else { /* could be pure B, pure G, or B/G */ - if (rtw_is_cckratesonly_included(rate)) - return WIRELESS_11B; - else if (rtw_is_cckrates_included(rate)) - return WIRELESS_11BG; - else - return WIRELESS_11G; - } + /* could be pure B, pure G, or B/G */ + if (rtw_is_cckratesonly_included(rate)) + return WIRELESS_11B; + if (rtw_is_cckrates_included(rate)) + return WIRELESS_11BG; + return WIRELESS_11G; } u8 *rtw_set_fixed_ie(unsigned char *pbuf, unsigned int len, unsigned char *source, @@ -151,11 +149,10 @@ u8 *rtw_get_ie(u8 *pbuf, signed int index, signed int *len, signed int limit) if (*p == index) { *len = *(p + 1); return p; - } else { - tmp = *(p + 1); - p += (tmp + 2); - i += (tmp + 2); } + tmp = *(p + 1); + p += (tmp + 2); + i += (tmp + 2); if (i >= limit) break; } @@ -199,9 +196,8 @@ u8 *rtw_get_ie_ex(u8 *in_ie, uint in_len, u8 eid, u8 *oui, u8 oui_len, u8 *ie, u *ielen = in_ie[cnt+1]+2; break; - } else { - cnt += in_ie[cnt+1]+2; /* goto next */ } + cnt += in_ie[cnt+1]+2; /* goto next */ } return target_ie; @@ -339,9 +335,8 @@ int rtw_generate_ie(struct registry_priv *pregistrypriv) ie = rtw_set_ie(ie, WLAN_EID_IBSS_PARAMS, 2, (u8 *)&(pdev_network->configuration.atim_window), &sz); - if (rateLen > 8) { + if (rateLen > 8) ie = rtw_set_ie(ie, WLAN_EID_EXT_SUPP_RATES, (rateLen - 8), (pdev_network->supported_rates + 8), &sz); - } /* HT Cap. */ if ((pregistrypriv->wireless_mode & WIRELESS_11_24N) && @@ -370,9 +365,8 @@ unsigned char *rtw_get_wpa_ie(unsigned char *pie, int *wpa_ie_len, int limit) if (pbuf) { /* check if oui matches... */ - if (memcmp((pbuf + 2), wpa_oui_type, sizeof(wpa_oui_type))) { + if (memcmp((pbuf + 2), wpa_oui_type, sizeof(wpa_oui_type))) goto check_next_ie; - } /* check version... */ memcpy((u8 *)&le_tmp, (pbuf + 6), sizeof(val16)); @@ -497,9 +491,8 @@ int rtw_parse_wpa_ie(u8 *wpa_ie, int wpa_ie_len, int *group_cipher, int *pairwis if (is_8021x) { if (left >= 6) { pos += 2; - if (!memcmp(pos, SUITE_1X, 4)) { + if (!memcmp(pos, SUITE_1X, 4)) *is_8021x = 1; - } } } @@ -518,9 +511,8 @@ int rtw_parse_wpa2_ie(u8 *rsn_ie, int rsn_ie_len, int *group_cipher, int *pairwi return _FAIL; } - if ((*rsn_ie != WLAN_EID_RSN) || (*(rsn_ie+1) != (u8)(rsn_ie_len - 2))) { + if ((*rsn_ie != WLAN_EID_RSN) || (*(rsn_ie+1) != (u8)(rsn_ie_len - 2))) return _FAIL; - } pos = rsn_ie; pos += 4; @@ -697,9 +689,8 @@ u8 *rtw_get_wps_ie(u8 *in_ie, uint in_len, u8 *wps_ie, uint *wps_ielen) cnt += in_ie[cnt+1]+2; break; - } else { - cnt += in_ie[cnt+1]+2; /* goto next */ } + cnt += in_ie[cnt+1]+2; /* goto next */ } return wpsie_ptr; @@ -748,9 +739,8 @@ u8 *rtw_get_wps_attr(u8 *wps_ie, uint wps_ielen, u16 target_attr_id, u8 *buf_att *len_attr = attr_len; break; - } else { - attr_ptr += attr_len; /* goto next */ } + attr_ptr += attr_len; /* goto next */ } return target_attr_ptr; diff --git a/drivers/staging/rtl8723bs/core/rtw_mlme.c b/drivers/staging/rtl8723bs/core/rtw_mlme.c index ed2d3b7d44d9..f2242cf2dfb4 100644 --- a/drivers/staging/rtl8723bs/core/rtw_mlme.c +++ b/drivers/staging/rtl8723bs/core/rtw_mlme.c @@ -751,7 +751,9 @@ void rtw_surveydone_event_callback(struct adapter *adapter, u8 *pbuf) } if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) { + spin_unlock_bh(&pmlmepriv->lock); del_timer_sync(&pmlmepriv->scan_to_timer); + spin_lock_bh(&pmlmepriv->lock); _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); } @@ -792,7 +794,7 @@ void rtw_surveydone_event_callback(struct adapter *adapter, u8 *pbuf) set_fwstate(pmlmepriv, _FW_UNDER_LINKING); pmlmepriv->to_join = false; s_ret = rtw_select_and_join_from_scanned_queue(pmlmepriv); - if (_SUCCESS == s_ret) { + if (s_ret == _SUCCESS) { _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT); } else if (s_ret == 2) {/* there is no need to wait for join */ _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING); @@ -1238,8 +1240,10 @@ void rtw_joinbss_event_prehandle(struct adapter *adapter, u8 *pbuf) spin_unlock_bh(&pmlmepriv->scanned_queue.lock); + spin_unlock_bh(&pmlmepriv->lock); /* s5. Cancel assoc_timer */ del_timer_sync(&pmlmepriv->assoc_timer); + spin_lock_bh(&pmlmepriv->lock); } else { spin_unlock_bh(&(pmlmepriv->scanned_queue.lock)); } @@ -1545,7 +1549,7 @@ void _rtw_join_timeout_handler(struct timer_list *t) if (adapter->bDriverStopped || adapter->bSurpriseRemoved) return; - spin_lock_bh(&pmlmepriv->lock); + spin_lock_irq(&pmlmepriv->lock); if (rtw_to_roam(adapter) > 0) { /* join timeout caused by roaming */ while (1) { @@ -1554,7 +1558,7 @@ void _rtw_join_timeout_handler(struct timer_list *t) int do_join_r; do_join_r = rtw_do_join(adapter); - if (_SUCCESS != do_join_r) { + if (do_join_r != _SUCCESS) { continue; } break; @@ -1573,7 +1577,7 @@ void _rtw_join_timeout_handler(struct timer_list *t) } - spin_unlock_bh(&pmlmepriv->lock); + spin_unlock_irq(&pmlmepriv->lock); } /* @@ -1586,11 +1590,11 @@ void rtw_scan_timeout_handler(struct timer_list *t) mlmepriv.scan_to_timer); struct mlme_priv *pmlmepriv = &adapter->mlmepriv; - spin_lock_bh(&pmlmepriv->lock); + spin_lock_irq(&pmlmepriv->lock); _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); - spin_unlock_bh(&pmlmepriv->lock); + spin_unlock_irq(&pmlmepriv->lock); rtw_indicate_scan_done(adapter, true); } @@ -2036,28 +2040,14 @@ int rtw_restruct_wmm_ie(struct adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_ static int SecIsInPMKIDList(struct adapter *Adapter, u8 *bssid) { - struct security_priv *psecuritypriv = &Adapter->securitypriv; - int i = 0; - - do { - if ((psecuritypriv->PMKIDList[i].bUsed) && - (!memcmp(psecuritypriv->PMKIDList[i].Bssid, bssid, ETH_ALEN))) { - break; - } else { - i++; - /* continue; */ - } - - } while (i < NUM_PMKID_CACHE); - - if (i == NUM_PMKID_CACHE) { - i = -1;/* Could not find. */ - } else { - /* There is one Pre-Authentication Key for the specific BSSID. */ - } - - return i; + struct security_priv *p = &Adapter->securitypriv; + int i; + for (i = 0; i < NUM_PMKID_CACHE; i++) + if ((p->PMKIDList[i].bUsed) && + (!memcmp(p->PMKIDList[i].Bssid, bssid, ETH_ALEN))) + return i; + return -1; } /* */ @@ -2558,7 +2548,7 @@ void rtw_issue_addbareq_cmd(struct adapter *padapter, struct xmit_frame *pxmitfr issued = (phtpriv->agg_enable_bitmap>>priority)&0x1; issued |= (phtpriv->candidate_tid_bitmap>>priority)&0x1; - if (0 == issued) { + if (issued == 0) { psta->htpriv.candidate_tid_bitmap |= BIT((u8)priority); rtw_addbareq_cmd(padapter, (u8) priority, pattrib->ra); } @@ -2608,30 +2598,20 @@ void _rtw_roaming(struct adapter *padapter, struct wlan_network *tgt_network) { struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct wlan_network *cur_network = &pmlmepriv->cur_network; - int do_join_r; - if (0 < rtw_to_roam(padapter)) { + if (rtw_to_roam(padapter) > 0) { memcpy(&pmlmepriv->assoc_ssid, &cur_network->network.ssid, sizeof(struct ndis_802_11_ssid)); pmlmepriv->assoc_by_bssid = false; - while (1) { - do_join_r = rtw_do_join(padapter); - if (_SUCCESS == do_join_r) { + while (rtw_do_join(padapter) != _SUCCESS) { + rtw_dec_to_roam(padapter); + if (rtw_to_roam(padapter) <= 0) { + rtw_indicate_disconnect(padapter); break; - } else { - rtw_dec_to_roam(padapter); - - if (rtw_to_roam(padapter) > 0) { - continue; - } else { - rtw_indicate_disconnect(padapter); - break; - } } } } - } signed int rtw_linked_check(struct adapter *padapter) diff --git a/drivers/staging/rtl8723bs/core/rtw_mlme_ext.c b/drivers/staging/rtl8723bs/core/rtw_mlme_ext.c index 49a3f45cb771..1bdbd0971f73 100644 --- a/drivers/staging/rtl8723bs/core/rtw_mlme_ext.c +++ b/drivers/staging/rtl8723bs/core/rtw_mlme_ext.c @@ -271,11 +271,9 @@ static int has_channel(struct rt_channel_info *channel_set, { int i; - for (i = 0; i < chanset_size; i++) { - if (channel_set[i].ChannelNum == chan) { + for (i = 0; i < chanset_size; i++) + if (channel_set[i].ChannelNum == chan) return 1; - } - } return 0; } @@ -311,11 +309,11 @@ static void init_channel_list(struct adapter *padapter, struct rt_channel_info * if (!has_channel(channel_set, chanset_size, ch)) continue; - if ((0 == padapter->registrypriv.ht_enable) && (8 == o->inc)) + if ((padapter->registrypriv.ht_enable == 0) && (o->inc == 8)) continue; if ((0 < (padapter->registrypriv.bw_mode & 0xf0)) && - ((BW40MINUS == o->bw) || (BW40PLUS == o->bw))) + ((o->bw == BW40MINUS) || (o->bw == BW40PLUS))) continue; if (!reg) { @@ -345,7 +343,7 @@ static u8 init_channel_set(struct adapter *padapter, u8 ChannelPlan, struct rt_c if (is_supported_24g(padapter->registrypriv.wireless_mode)) { b2_4GBand = true; - if (RT_CHANNEL_DOMAIN_REALTEK_DEFINE == ChannelPlan) + if (ChannelPlan == RT_CHANNEL_DOMAIN_REALTEK_DEFINE) Index2G = RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE.Index2G; else Index2G = RTW_ChannelPlanMap[ChannelPlan].Index2G; @@ -355,14 +353,14 @@ static u8 init_channel_set(struct adapter *padapter, u8 ChannelPlan, struct rt_c for (index = 0; index < RTW_ChannelPlan2G[Index2G].Len; index++) { channel_set[chanset_size].ChannelNum = RTW_ChannelPlan2G[Index2G].Channel[index]; - if ((RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN == ChannelPlan) ||/* Channel 1~11 is active, and 12~14 is passive */ - (RT_CHANNEL_DOMAIN_GLOBAL_NULL == ChannelPlan)) { + if ((ChannelPlan == RT_CHANNEL_DOMAIN_GLOBAL_DOAMIN) ||/* Channel 1~11 is active, and 12~14 is passive */ + (ChannelPlan == RT_CHANNEL_DOMAIN_GLOBAL_NULL)) { if (channel_set[chanset_size].ChannelNum >= 1 && channel_set[chanset_size].ChannelNum <= 11) channel_set[chanset_size].ScanType = SCAN_ACTIVE; else if ((channel_set[chanset_size].ChannelNum >= 12 && channel_set[chanset_size].ChannelNum <= 14)) channel_set[chanset_size].ScanType = SCAN_PASSIVE; - } else if (RT_CHANNEL_DOMAIN_WORLD_WIDE_13 == ChannelPlan || - RT_CHANNEL_DOMAIN_2G_WORLD == Index2G) { /* channel 12~13, passive scan */ + } else if (ChannelPlan == RT_CHANNEL_DOMAIN_WORLD_WIDE_13 || + Index2G == RT_CHANNEL_DOMAIN_2G_WORLD) { /* channel 12~13, passive scan */ if (channel_set[chanset_size].ChannelNum <= 11) channel_set[chanset_size].ScanType = SCAN_ACTIVE; else @@ -649,9 +647,8 @@ unsigned int OnBeacon(struct adapter *padapter, union recv_frame *precv_frame) if (psta) { /* update WMM, ERP in the beacon */ /* todo: the timer is used instead of the number of the beacon received */ - if ((sta_rx_pkts(psta) & 0xf) == 0) { + if ((sta_rx_pkts(psta) & 0xf) == 0) update_beacon_info(padapter, pframe, len, psta); - } } else { /* allocate a new CAM entry for IBSS station */ cam_idx = allocate_fw_sta_entry(padapter); @@ -911,16 +908,14 @@ unsigned int OnAuthClient(struct adapter *padapter, union recv_frame *precv_fram set_link_timer(pmlmeext, REAUTH_TO); return _SUCCESS; - } else { - /* open system */ - go2asoc = 1; } + /* open system */ + go2asoc = 1; } else if (seq == 4) { - if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) { + if (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) go2asoc = 1; - } else { + else goto authclnt_fail; - } } else { /* this is also illegal */ goto authclnt_fail; @@ -1331,7 +1326,7 @@ unsigned int OnAssocReq(struct adapter *padapter, union recv_frame *precv_frame) spin_unlock_bh(&pstapriv->asoc_list_lock); /* now the station is qualified to join our BSS... */ - if (pstat && (pstat->state & WIFI_FW_ASSOC_SUCCESS) && (WLAN_STATUS_SUCCESS == status)) { + if (pstat && (pstat->state & WIFI_FW_ASSOC_SUCCESS) && (status == WLAN_STATUS_SUCCESS)) { /* 1 bss_cap_update & sta_info_update */ bss_cap_update_on_sta_join(padapter, pstat); sta_info_update(padapter, pstat); @@ -1455,11 +1450,10 @@ unsigned int OnAssocRsp(struct adapter *padapter, union recv_frame *precv_frame) UpdateBrateTbl(padapter, pmlmeinfo->network.supported_rates); report_assoc_result: - if (res > 0) { + if (res > 0) rtw_buf_update(&pmlmepriv->assoc_rsp, &pmlmepriv->assoc_rsp_len, pframe, pkt_len); - } else { + else rtw_buf_free(&pmlmepriv->assoc_rsp, &pmlmepriv->assoc_rsp_len); - } report_join_res(padapter, res); @@ -1473,6 +1467,7 @@ unsigned int OnDeAuth(struct adapter *padapter, union recv_frame *precv_frame) struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); u8 *pframe = precv_frame->u.hdr.rx_data; + int ignore_received_deauth = 0; /* check A3 */ if (memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN)) @@ -1508,36 +1503,33 @@ unsigned int OnDeAuth(struct adapter *padapter, union recv_frame *precv_frame) return _SUCCESS; - } else { - int ignore_received_deauth = 0; - - /* Commented by Albert 20130604 */ - /* Before sending the auth frame to start the STA/GC mode connection with AP/GO, */ - /* we will send the deauth first. */ - /* However, the Win8.1 with BRCM Wi-Fi will send the deauth with reason code 6 to us after receieving our deauth. */ - /* Added the following code to avoid this case. */ - if ((pmlmeinfo->state & WIFI_FW_AUTH_STATE) || - (pmlmeinfo->state & WIFI_FW_ASSOC_STATE)) { - if (reason == WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA) { - ignore_received_deauth = 1; - } else if (WLAN_REASON_PREV_AUTH_NOT_VALID == reason) { - /* TODO: 802.11r */ - ignore_received_deauth = 1; - } - } - - netdev_dbg(padapter->pnetdev, - "sta recv deauth reason code(%d) sta:%pM, ignore = %d\n", - reason, GetAddr3Ptr(pframe), - ignore_received_deauth); + } - if (0 == ignore_received_deauth) { - receive_disconnect(padapter, GetAddr3Ptr(pframe), reason); + /* Commented by Albert 20130604 */ + /* Before sending the auth frame to start the STA/GC mode connection with AP/GO, */ + /* we will send the deauth first. */ + /* However, the Win8.1 with BRCM Wi-Fi will send the deauth with reason code 6 to us after receieving our deauth. */ + /* Added the following code to avoid this case. */ + if ((pmlmeinfo->state & WIFI_FW_AUTH_STATE) || + (pmlmeinfo->state & WIFI_FW_ASSOC_STATE)) { + if (reason == WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA) { + ignore_received_deauth = 1; + } else if (reason == WLAN_REASON_PREV_AUTH_NOT_VALID) { + /* TODO: 802.11r */ + ignore_received_deauth = 1; } } + + netdev_dbg(padapter->pnetdev, + "sta recv deauth reason code(%d) sta:%pM, ignore = %d\n", + reason, GetAddr3Ptr(pframe), + ignore_received_deauth); + + if (ignore_received_deauth == 0) + receive_disconnect(padapter, GetAddr3Ptr(pframe), reason); + pmlmepriv->LinkDetectInfo.bBusyTraffic = false; return _SUCCESS; - } unsigned int OnDisassoc(struct adapter *padapter, union recv_frame *precv_frame) @@ -1581,13 +1573,13 @@ unsigned int OnDisassoc(struct adapter *padapter, union recv_frame *precv_frame) } return _SUCCESS; - } else { - netdev_dbg(padapter->pnetdev, - "sta recv disassoc reason code(%d) sta:%pM\n", - reason, GetAddr3Ptr(pframe)); - - receive_disconnect(padapter, GetAddr3Ptr(pframe), reason); } + netdev_dbg(padapter->pnetdev, + "sta recv disassoc reason code(%d) sta:%pM\n", + reason, GetAddr3Ptr(pframe)); + + receive_disconnect(padapter, GetAddr3Ptr(pframe), reason); + pmlmepriv->LinkDetectInfo.bBusyTraffic = false; return _SUCCESS; @@ -1674,11 +1666,10 @@ unsigned int OnAction_back(struct adapter *padapter, union recv_frame *precv_fra /* process_addba_req(padapter, (u8 *)&(pmlmeinfo->ADDBA_req), GetAddr3Ptr(pframe)); */ process_addba_req(padapter, (u8 *)&(pmlmeinfo->ADDBA_req), addr); - if (pmlmeinfo->accept_addba_req) { + if (pmlmeinfo->accept_addba_req) issue_action_BA(padapter, addr, WLAN_ACTION_ADDBA_RESP, 0); - } else { + else issue_action_BA(padapter, addr, WLAN_ACTION_ADDBA_RESP, 37);/* reject ADDBA Req */ - } break; @@ -1774,9 +1765,8 @@ static unsigned int on_action_public_vendor(union recv_frame *precv_frame) u8 *pframe = precv_frame->u.hdr.rx_data; u8 *frame_body = pframe + sizeof(struct ieee80211_hdr_3addr); - if (!memcmp(frame_body + 2, P2P_OUI, 4)) { + if (!memcmp(frame_body + 2, P2P_OUI, 4)) ret = on_action_public_p2p(precv_frame); - } return ret; } @@ -2187,9 +2177,8 @@ void issue_beacon(struct adapter *padapter, int timeout_ms) wps_ie = rtw_get_wps_ie(pmgntframe->buf_addr+TXDESC_OFFSET+sizeof(struct ieee80211_hdr_3addr)+_BEACON_IE_OFFSET_, pattrib->pktlen-sizeof(struct ieee80211_hdr_3addr)-_BEACON_IE_OFFSET_, NULL, &wps_ielen); - if (wps_ie && wps_ielen > 0) { + if (wps_ie && wps_ielen > 0) rtw_get_wps_attr_content(wps_ie, wps_ielen, WPS_ATTR_SELECTED_REGISTRAR, (u8 *)(&sr), NULL); - } if (sr != 0) set_fwstate(pmlmepriv, WIFI_UNDER_WPS); else @@ -2245,9 +2234,8 @@ void issue_beacon(struct adapter *padapter, int timeout_ms) /* EXTERNDED SUPPORTED RATE */ - if (rate_len > 8) { + if (rate_len > 8) pframe = rtw_set_ie(pframe, WLAN_EID_EXT_SUPP_RATES, (rate_len - 8), (cur_network->supported_rates + 8), &pattrib->pktlen); - } /* todo:HT for adhoc */ @@ -2400,7 +2388,7 @@ void issue_probersp(struct adapter *padapter, unsigned char *da, u8 is_valid_p2p pframe += ssid_ielen_diff; pattrib->pktlen += ssid_ielen_diff; } - kfree (buf); + kfree(buf); } } else { /* timestamp will be inserted by hardware */ @@ -2447,9 +2435,8 @@ void issue_probersp(struct adapter *padapter, unsigned char *da, u8 is_valid_p2p /* EXTERNDED SUPPORTED RATE */ - if (rate_len > 8) { + if (rate_len > 8) pframe = rtw_set_ie(pframe, WLAN_EID_EXT_SUPP_RATES, (rate_len - 8), (cur_network->supported_rates + 8), &pattrib->pktlen); - } /* todo:HT for adhoc */ @@ -2674,9 +2661,8 @@ void issue_auth(struct adapter *padapter, struct sta_info *psta, unsigned short /* setting auth algo number */ val16 = (pmlmeinfo->auth_algo == dot11AuthAlgrthm_Shared) ? 1 : 0;/* 0:OPEN System, 1:Shared key */ - if (val16) { + if (val16) use_shared_key = 1; - } le_tmp = cpu_to_le16(val16); /* setting IV for auth seq #3 */ @@ -2831,16 +2817,14 @@ void issue_asocrsp(struct adapter *padapter, unsigned short status, struct sta_i break; } - if (!pbuf || ie_len == 0) { + if (!pbuf || ie_len == 0) break; - } } } - if (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK) { + if (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK) pframe = rtw_set_ie(pframe, WLAN_EID_VENDOR_SPECIFIC, 6, REALTEK_96B_IE, &(pattrib->pktlen)); - } /* add WPS IE ie for wps 2.0 */ if (pmlmepriv->wps_assoc_resp_ie && pmlmepriv->wps_assoc_resp_ie_len > 0) { @@ -3301,9 +3285,8 @@ static int _issue_deauth(struct adapter *padapter, unsigned char *da, __le16 le_tmp; pmgntframe = alloc_mgtxmitframe(pxmitpriv); - if (!pmgntframe) { + if (!pmgntframe) goto exit; - } /* update attribute */ pattrib = &pmgntframe->attrib; @@ -3552,13 +3535,13 @@ void issue_action_BA(struct adapter *padapter, unsigned char *raddr, unsigned ch rtw_hal_get_def_var(padapter, HW_VAR_MAX_RX_AMPDU_FACTOR, &max_rx_ampdu_factor); - if (IEEE80211_HT_MAX_AMPDU_64K == max_rx_ampdu_factor) + if (max_rx_ampdu_factor == IEEE80211_HT_MAX_AMPDU_64K) BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x1000); /* 64 buffer size */ - else if (IEEE80211_HT_MAX_AMPDU_32K == max_rx_ampdu_factor) + else if (max_rx_ampdu_factor == IEEE80211_HT_MAX_AMPDU_32K) BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x0800); /* 32 buffer size */ - else if (IEEE80211_HT_MAX_AMPDU_16K == max_rx_ampdu_factor) + else if (max_rx_ampdu_factor == IEEE80211_HT_MAX_AMPDU_16K) BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x0400); /* 16 buffer size */ - else if (IEEE80211_HT_MAX_AMPDU_8K == max_rx_ampdu_factor) + else if (max_rx_ampdu_factor == IEEE80211_HT_MAX_AMPDU_8K) BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x0200); /* 8 buffer size */ else BA_para_set = ((le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f) | 0x1000); /* 64 buffer size */ @@ -3627,9 +3610,8 @@ static void issue_action_BSSCoexistPacket(struct adapter *padapter) action = ACT_PUBLIC_BSSCOEXIST; pmgntframe = alloc_mgtxmitframe(pxmitpriv); - if (!pmgntframe) { + if (!pmgntframe) return; - } /* update attribute */ pattrib = &pmgntframe->attrib; @@ -3802,10 +3784,8 @@ unsigned int send_beacon(struct adapter *padapter) } while (false == bxmitok && issue < 100 && !padapter->bSurpriseRemoved && !padapter->bDriverStopped); - if (padapter->bSurpriseRemoved || padapter->bDriverStopped) { + if (padapter->bSurpriseRemoved || padapter->bDriverStopped) return _FAIL; - } - if (!bxmitok) return _FAIL; @@ -4388,9 +4368,8 @@ static void process_80211d(struct adapter *padapter, struct wlan_bssid_ex *bssid } /* skip AP 2.4G channel plan */ - while ((j < chplan_ap.Len) && (chplan_ap.Channel[j] <= 14)) { + while ((j < chplan_ap.Len) && (chplan_ap.Channel[j] <= 14)) j++; - } } pmlmeext->update_channel_plan_by_ap_done = 1; @@ -4402,9 +4381,8 @@ static void process_80211d(struct adapter *padapter, struct wlan_bssid_ex *bssid i = 0; while ((i < MAX_CHANNEL_NUM) && (chplan_new[i].ChannelNum != 0)) { if (chplan_new[i].ChannelNum == channel) { - if (chplan_new[i].ScanType == SCAN_PASSIVE) { + if (chplan_new[i].ScanType == SCAN_PASSIVE) chplan_new[i].ScanType = SCAN_ACTIVE; - } break; } i++; @@ -4629,9 +4607,8 @@ void report_del_sta_event(struct adapter *padapter, unsigned char *MacAddr, unsi struct cmd_priv *pcmdpriv = &padapter->cmdpriv; pcmd_obj = rtw_zmalloc(sizeof(struct cmd_obj)); - if (!pcmd_obj) { + if (!pcmd_obj) return; - } cmdsz = (sizeof(struct stadel_event) + sizeof(struct C2HEvent_Header)); pevtcmd = rtw_zmalloc(cmdsz); @@ -5086,7 +5063,7 @@ void linked_status_chk(struct adapter *padapter) if (pmlmeinfo->FW_sta_info[i].status == 1) { psta = pmlmeinfo->FW_sta_info[i].psta; - if (NULL == psta) + if (psta == NULL) continue; if (pmlmeinfo->FW_sta_info[i].rx_pkt == sta_rx_pkts(psta)) { @@ -5124,9 +5101,8 @@ void survey_timer_hdl(struct timer_list *t) /* issue rtw_sitesurvey_cmd */ if (pmlmeext->sitesurvey_res.state > SCAN_START) { - if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) { + if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) pmlmeext->sitesurvey_res.channel_idx++; - } if (pmlmeext->scan_abort) { pmlmeext->sitesurvey_res.channel_idx = pmlmeext->sitesurvey_res.ch_num; @@ -5135,24 +5111,18 @@ void survey_timer_hdl(struct timer_list *t) } ph2c = rtw_zmalloc(sizeof(struct cmd_obj)); - if (!ph2c) { - goto exit_survey_timer_hdl; - } + if (!ph2c) + return; psurveyPara = rtw_zmalloc(sizeof(struct sitesurvey_parm)); if (!psurveyPara) { kfree(ph2c); - goto exit_survey_timer_hdl; + return; } init_h2fwcmd_w_parm_no_rsp(ph2c, psurveyPara, GEN_CMD_CODE(_SiteSurvey)); rtw_enqueue_cmd(pcmdpriv, ph2c); } - - -exit_survey_timer_hdl: - - return; } void link_timer_hdl(struct timer_list *t) @@ -5173,17 +5143,9 @@ void link_timer_hdl(struct timer_list *t) } else if (pmlmeinfo->state & WIFI_FW_AUTH_STATE) { /* re-auth timer */ if (++pmlmeinfo->reauth_count > REAUTH_LIMIT) { - /* if (pmlmeinfo->auth_algo != dot11AuthAlgrthm_Auto) */ - /* */ - pmlmeinfo->state = 0; - report_join_res(padapter, -1); - return; - /* */ - /* else */ - /* */ - /* pmlmeinfo->auth_algo = dot11AuthAlgrthm_Shared; */ - /* pmlmeinfo->reauth_count = 0; */ - /* */ + pmlmeinfo->state = 0; + report_join_res(padapter, -1); + return; } pmlmeinfo->auth_seq = 1; @@ -5348,9 +5310,8 @@ u8 join_cmd_hdl(struct adapter *padapter, u8 *pbuf) /* check already connecting to AP or not */ if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) { - if (pmlmeinfo->state & WIFI_FW_STATION_STATE) { + if (pmlmeinfo->state & WIFI_FW_STATION_STATE) issue_deauth_ex(padapter, pnetwork->mac_address, WLAN_REASON_DEAUTH_LEAVING, 1, 100); - } pmlmeinfo->state = WIFI_FW_NULL_STATE; /* clear CAM */ @@ -5485,9 +5446,8 @@ u8 disconnect_hdl(struct adapter *padapter, unsigned char *pbuf) struct wlan_bssid_ex *pnetwork = (struct wlan_bssid_ex *)(&(pmlmeinfo->network)); u8 val8; - if (is_client_associated_to_ap(padapter)) { + if (is_client_associated_to_ap(padapter)) issue_deauth_ex(padapter, pnetwork->mac_address, WLAN_REASON_DEAUTH_LEAVING, param->deauth_timeout_ms/100, 100); - } if (((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) { /* Stop BCN */ @@ -6073,7 +6033,7 @@ u8 run_in_thread_hdl(struct adapter *padapter, u8 *pbuf) struct RunInThread_param *p; - if (NULL == pbuf) + if (pbuf == NULL) return H2C_PARAMETERS_ERROR; p = (struct RunInThread_param *)pbuf; diff --git a/drivers/staging/rtl8723bs/core/rtw_rf.c b/drivers/staging/rtl8723bs/core/rtw_rf.c index 96eb8ca38003..4f120c894998 100644 --- a/drivers/staging/rtl8723bs/core/rtw_rf.c +++ b/drivers/staging/rtl8723bs/core/rtw_rf.c @@ -8,47 +8,27 @@ #include <drv_types.h> #include <linux/kernel.h> - -struct ch_freq { - u32 channel; - u32 frequency; -}; - -static struct ch_freq ch_freq_map[] = { - {1, 2412}, {2, 2417}, {3, 2422}, {4, 2427}, {5, 2432}, - {6, 2437}, {7, 2442}, {8, 2447}, {9, 2452}, {10, 2457}, - {11, 2462}, {12, 2467}, {13, 2472}, {14, 2484}, - /* UNII */ - {36, 5180}, {40, 5200}, {44, 5220}, {48, 5240}, {52, 5260}, - {56, 5280}, {60, 5300}, {64, 5320}, {149, 5745}, {153, 5765}, - {157, 5785}, {161, 5805}, {165, 5825}, {167, 5835}, {169, 5845}, - {171, 5855}, {173, 5865}, - /* HiperLAN2 */ - {100, 5500}, {104, 5520}, {108, 5540}, {112, 5560}, {116, 5580}, - {120, 5600}, {124, 5620}, {128, 5640}, {132, 5660}, {136, 5680}, - {140, 5700}, - /* Japan MMAC */ - {34, 5170}, {38, 5190}, {42, 5210}, {46, 5230}, - /* Japan */ - {184, 4920}, {188, 4940}, {192, 4960}, {196, 4980}, - {208, 5040},/* Japan, means J08 */ - {212, 5060},/* Japan, means J12 */ - {216, 5080},/* Japan, means J16 */ +static const u32 ch_freq_map[] = { + 2412, + 2417, + 2422, + 2427, + 2432, + 2437, + 2442, + 2447, + 2452, + 2457, + 2462, + 2467, + 2472, + 2484 }; u32 rtw_ch2freq(u32 channel) { - u8 i; - u32 freq = 0; - - for (i = 0; i < ARRAY_SIZE(ch_freq_map); i++) { - if (channel == ch_freq_map[i].channel) { - freq = ch_freq_map[i].frequency; - break; - } - } - if (i == ARRAY_SIZE(ch_freq_map)) - freq = 2412; + if (channel == 0 || channel > ARRAY_SIZE(ch_freq_map)) + return 2412; - return freq; + return ch_freq_map[channel - 1]; } diff --git a/drivers/staging/rtl8723bs/hal/HalBtcOutSrc.h b/drivers/staging/rtl8723bs/hal/HalBtcOutSrc.h index af50674b2a65..9091f2f75fe1 100644 --- a/drivers/staging/rtl8723bs/hal/HalBtcOutSrc.h +++ b/drivers/staging/rtl8723bs/hal/HalBtcOutSrc.h @@ -68,16 +68,6 @@ enum btc_chip_interface { BTC_INTF_MAX }; -enum { - BTC_CHIP_UNDEF = 0, - BTC_CHIP_CSR_BC4 = 1, - BTC_CHIP_CSR_BC8 = 2, - BTC_CHIP_RTL8723A = 3, - BTC_CHIP_RTL8821 = 4, - BTC_CHIP_RTL8723B = 5, - BTC_CHIP_MAX -}; - /* following is for wifi link status */ #define WIFI_STA_CONNECTED BIT0 #define WIFI_AP_CONNECTED BIT1 @@ -87,7 +77,6 @@ enum { struct btc_board_info { /* The following is some board information */ - u8 btChipType; u8 pgAntNum; /* pg ant number */ u8 btdmAntNum; /* ant number for btdm */ u8 btdmAntPos; /* Bryant Add to indicate Antenna Position for (pgAntNum = 2) && (btdmAntNum = 1) (DPDT+1Ant case) */ diff --git a/drivers/staging/rtl8723bs/hal/hal_btcoex.c b/drivers/staging/rtl8723bs/hal/hal_btcoex.c index f4b3e8b28712..9acd49323c7c 100644 --- a/drivers/staging/rtl8723bs/hal/hal_btcoex.c +++ b/drivers/staging/rtl8723bs/hal/hal_btcoex.c @@ -1113,11 +1113,6 @@ void EXhalbtcoutsrc_Periodical(struct btc_coexist *pBtCoexist) /* halbtcoutsrc_NormalLowPower(pBtCoexist); */ } -void EXhalbtcoutsrc_SetChipType(u8 chipType) -{ - GLBtCoexist.boardInfo.btChipType = BTC_CHIP_RTL8723B; -} - void EXhalbtcoutsrc_SetAntNum(u8 type, u8 antNum) { if (BT_COEX_ANT_TYPE_PG == type) { @@ -1188,9 +1183,6 @@ void hal_btcoex_SetChipType(struct adapter *padapter, u8 chipType) pHalData = GET_HAL_DATA(padapter); - pHalData->bt_coexist.btChipType = chipType; - - EXhalbtcoutsrc_SetChipType(chipType); } void hal_btcoex_SetPgAntNum(struct adapter *padapter, u8 antNum) diff --git a/drivers/staging/rtl8723bs/hal/sdio_ops.c b/drivers/staging/rtl8723bs/hal/sdio_ops.c index a545832a468e..107f427ee4aa 100644 --- a/drivers/staging/rtl8723bs/hal/sdio_ops.c +++ b/drivers/staging/rtl8723bs/hal/sdio_ops.c @@ -811,17 +811,14 @@ static struct recv_buf *sd_recv_rxfifo(struct adapter *adapter, u32 size) SIZE_PTR alignment = 0; recvbuf->pskb = rtw_skb_alloc(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ); - - if (recvbuf->pskb) { - recvbuf->pskb->dev = adapter->pnetdev; - - tmpaddr = (SIZE_PTR)recvbuf->pskb->data; - alignment = tmpaddr & (RECVBUFF_ALIGN_SZ - 1); - skb_reserve(recvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment)); - } - if (!recvbuf->pskb) return NULL; + + recvbuf->pskb->dev = adapter->pnetdev; + + tmpaddr = (SIZE_PTR)recvbuf->pskb->data; + alignment = tmpaddr & (RECVBUFF_ALIGN_SZ - 1); + skb_reserve(recvbuf->pskb, (RECVBUFF_ALIGN_SZ - alignment)); } /* 3 3. read data from rxfifo */ diff --git a/drivers/staging/rtl8723bs/include/HalVerDef.h b/drivers/staging/rtl8723bs/include/HalVerDef.h index 8f654a49fb9d..d0ce21ccc1cc 100644 --- a/drivers/staging/rtl8723bs/include/HalVerDef.h +++ b/drivers/staging/rtl8723bs/include/HalVerDef.h @@ -9,16 +9,7 @@ /* hal_ic_type_e */ enum hal_ic_type_e { /* tag_HAL_IC_Type_Definition */ - CHIP_8192S = 0, - CHIP_8188C = 1, - CHIP_8192C = 2, - CHIP_8192D = 3, - CHIP_8723A = 4, - CHIP_8188E = 5, - CHIP_8812 = 6, - CHIP_8821 = 7, CHIP_8723B = 8, - CHIP_8192E = 9, }; /* hal_chip_type_e */ @@ -58,7 +49,6 @@ struct hal_version { /* tag_HAL_VERSION */ u8 ROMVer; }; -/* VERSION_8192C VersionID; */ /* hal_version VersionID; */ /* Get element */ diff --git a/drivers/staging/rtl8723bs/include/drv_types.h b/drivers/staging/rtl8723bs/include/drv_types.h index 0ce08c2a0755..0bbbdebdf157 100644 --- a/drivers/staging/rtl8723bs/include/drv_types.h +++ b/drivers/staging/rtl8723bs/include/drv_types.h @@ -42,7 +42,6 @@ #include <rtw_mlme.h> #include <mlme_osdep.h> #include <rtw_io.h> -#include <rtw_ioctl.h> #include <rtw_ioctl_set.h> #include <osdep_intf.h> #include <rtw_eeprom.h> diff --git a/drivers/staging/rtl8723bs/include/hal_com_reg.h b/drivers/staging/rtl8723bs/include/hal_com_reg.h index 8213dcf48b34..d8d03752dc2e 100644 --- a/drivers/staging/rtl8723bs/include/hal_com_reg.h +++ b/drivers/staging/rtl8723bs/include/hal_com_reg.h @@ -72,13 +72,9 @@ #define REG_MULTI_FUNC_CTRL 0x0068 /* RTL8723 WIFI/BT/GPS Multi-Function control source. */ #define REG_GSSR 0x006c #define REG_AFE_XTAL_CTRL_EXT 0x0078 /* RTL8188E */ -#define REG_XCK_OUT_CTRL 0x007c /* RTL8188E */ #define REG_MCUFWDL 0x0080 -#define REG_WOL_EVENT 0x0081 /* RTL8188E */ #define REG_MCUTSTCFG 0x0084 #define REG_FDHM0 0x0088 -#define REG_HOST_SUSP_CNT 0x00BC /* RTL8192C Host suspend counter on FPGA platform */ -#define REG_SYSTEM_ON_CTRL 0x00CC /* For 8723AE Reset after S3 */ #define REG_EFUSE_ACCESS 0x00CF /* Efuse access protection for RTL8723 */ #define REG_BIST_SCAN 0x00D0 #define REG_BIST_RPT 0x00D4 @@ -117,7 +113,6 @@ #define REG_FWIMR 0x0130 #define REG_FWISR 0x0134 #define REG_FTIMR 0x0138 -#define REG_FTISR 0x013C /* RTL8192C */ #define REG_PKTBUF_DBG_CTRL 0x0140 #define REG_RXPKTBUF_CTRL (REG_PKTBUF_DBG_CTRL+2) #define REG_PKTBUF_DBG_DATA_L 0x0144 @@ -132,11 +127,9 @@ #define REG_MBIST_START 0x0174 #define REG_MBIST_DONE 0x0178 #define REG_MBIST_FAIL 0x017C -#define REG_32K_CTRL 0x0194 /* RTL8188E */ #define REG_C2HEVT_MSG_NORMAL 0x01A0 #define REG_C2HEVT_CLEAR 0x01AF #define REG_MCUTST_1 0x01c0 -#define REG_MCUTST_WOWLAN 0x01C7 /* Defined after 8188E series. */ #define REG_FMETHR 0x01C8 #define REG_HMETFR 0x01CC #define REG_HMEBOX_0 0x01D0 @@ -526,44 +519,6 @@ #define MAX_MSS_DENSITY_1T 0x0A /* */ -/* 8192C Cmd9346CR bits (Offset 0xA, 16bit) */ -/* */ -#define CmdEEPROM_En BIT5 /* EEPROM enable when set 1 */ -#define CmdEERPOMSEL BIT4 /* System EEPROM select, 0: boot from E-FUSE, 1: The EEPROM used is 9346 */ -#define Cmd9346CR_9356SEL BIT4 - -/* */ -/* 8192C GPIO MUX Configuration Register (offset 0x40, 4 byte) */ -/* */ -#define GPIOSEL_GPIO 0 -#define GPIOSEL_ENBT BIT5 - -/* */ -/* 8192C GPIO PIN Control Register (offset 0x44, 4 byte) */ -/* */ -#define GPIO_IN REG_GPIO_PIN_CTRL /* GPIO pins input value */ -#define GPIO_OUT (REG_GPIO_PIN_CTRL+1) /* GPIO pins output value */ -#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2) /* GPIO pins output enable when a bit is set to "1"; otherwise, input is configured. */ -#define GPIO_MOD (REG_GPIO_PIN_CTRL+3) - -/* */ -/* 8811A GPIO PIN Control Register (offset 0x60, 4 byte) */ -/* */ -#define GPIO_IN_8811A REG_GPIO_PIN_CTRL_2 /* GPIO pins input value */ -#define GPIO_OUT_8811A (REG_GPIO_PIN_CTRL_2+1) /* GPIO pins output value */ -#define GPIO_IO_SEL_8811A (REG_GPIO_PIN_CTRL_2+2) /* GPIO pins output enable when a bit is set to "1"; otherwise, input is configured. */ -#define GPIO_MOD_8811A (REG_GPIO_PIN_CTRL_2+3) - -/* */ -/* 8723/8188E Host System Interrupt Mask Register (offset 0x58, 32 byte) */ -/* */ -#define HSIMR_GPIO12_0_INT_EN BIT0 -#define HSIMR_SPS_OCP_INT_EN BIT5 -#define HSIMR_RON_INT_EN BIT6 -#define HSIMR_PDN_INT_EN BIT7 -#define HSIMR_GPIO9_INT_EN BIT25 - -/* */ /* 8723/8188E Host System Interrupt Status Register (offset 0x5C, 32 byte) */ /* */ #define HSISR_GPIO12_0_INT BIT0 @@ -573,22 +528,6 @@ #define HSISR_GPIO9_INT BIT25 /* */ -/* 8192C (MSR) Media Status Register (Offset 0x4C, 8 bits) */ -/* */ -/* -Network Type -00: No link -01: Link in ad hoc network -10: Link in infrastructure network -11: AP mode -Default: 00b. -*/ -#define MSR_NOLINK 0x00 -#define MSR_ADHOC 0x01 -#define MSR_INFRA 0x02 -#define MSR_AP 0x03 - -/* */ /* USB INTR CONTENT */ /* */ #define USB_C2H_CMDID_OFFSET 0 @@ -787,206 +726,6 @@ Default: 00b. #define IMR_WLANOFF BIT0 /* */ -/* 8723E series PCIE Host IMR/ISR bit */ -/* */ -/* IMR DW0 Bit 0-31 */ -#define PHIMR_TIMEOUT2 BIT31 -#define PHIMR_TIMEOUT1 BIT30 -#define PHIMR_PSTIMEOUT BIT29 -#define PHIMR_GTINT4 BIT28 -#define PHIMR_GTINT3 BIT27 -#define PHIMR_TXBCNERR BIT26 -#define PHIMR_TXBCNOK BIT25 -#define PHIMR_TSF_BIT32_TOGGLE BIT24 -#define PHIMR_BCNDMAINT3 BIT23 -#define PHIMR_BCNDMAINT2 BIT22 -#define PHIMR_BCNDMAINT1 BIT21 -#define PHIMR_BCNDMAINT0 BIT20 -#define PHIMR_BCNDOK3 BIT19 -#define PHIMR_BCNDOK2 BIT18 -#define PHIMR_BCNDOK1 BIT17 -#define PHIMR_BCNDOK0 BIT16 -#define PHIMR_HSISR_IND_ON BIT15 -#define PHIMR_BCNDMAINT_E BIT14 -#define PHIMR_ATIMEND_E BIT13 -#define PHIMR_ATIM_CTW_END BIT12 -#define PHIMR_HISRE_IND BIT11 /* RO. HISRE Indicator (HISRE & HIMRE is true, this bit is set to 1) */ -#define PHIMR_C2HCMD BIT10 -#define PHIMR_CPWM2 BIT9 -#define PHIMR_CPWM BIT8 -#define PHIMR_HIGHDOK BIT7 /* High Queue DMA OK Interrupt */ -#define PHIMR_MGNTDOK BIT6 /* Management Queue DMA OK Interrupt */ -#define PHIMR_BKDOK BIT5 /* AC_BK DMA OK Interrupt */ -#define PHIMR_BEDOK BIT4 /* AC_BE DMA OK Interrupt */ -#define PHIMR_VIDOK BIT3 /* AC_VI DMA OK Interrupt */ -#define PHIMR_VODOK BIT2 /* AC_VO DMA Interrupt */ -#define PHIMR_RDU BIT1 /* Receive Descriptor Unavailable */ -#define PHIMR_ROK BIT0 /* Receive DMA OK Interrupt */ - -/* PCIE Host Interrupt Status Extension bit */ -#define PHIMR_BCNDMAINT7 BIT23 -#define PHIMR_BCNDMAINT6 BIT22 -#define PHIMR_BCNDMAINT5 BIT21 -#define PHIMR_BCNDMAINT4 BIT20 -#define PHIMR_BCNDOK7 BIT19 -#define PHIMR_BCNDOK6 BIT18 -#define PHIMR_BCNDOK5 BIT17 -#define PHIMR_BCNDOK4 BIT16 -/* bit12 15: RSVD */ -#define PHIMR_TXERR BIT11 -#define PHIMR_RXERR BIT10 -#define PHIMR_TXFOVW BIT9 -#define PHIMR_RXFOVW BIT8 -/* bit2-7: RSVD */ -#define PHIMR_OCPINT BIT1 -/* bit0: RSVD */ - -#define UHIMR_TIMEOUT2 BIT31 -#define UHIMR_TIMEOUT1 BIT30 -#define UHIMR_PSTIMEOUT BIT29 -#define UHIMR_GTINT4 BIT28 -#define UHIMR_GTINT3 BIT27 -#define UHIMR_TXBCNERR BIT26 -#define UHIMR_TXBCNOK BIT25 -#define UHIMR_TSF_BIT32_TOGGLE BIT24 -#define UHIMR_BCNDMAINT3 BIT23 -#define UHIMR_BCNDMAINT2 BIT22 -#define UHIMR_BCNDMAINT1 BIT21 -#define UHIMR_BCNDMAINT0 BIT20 -#define UHIMR_BCNDOK3 BIT19 -#define UHIMR_BCNDOK2 BIT18 -#define UHIMR_BCNDOK1 BIT17 -#define UHIMR_BCNDOK0 BIT16 -#define UHIMR_HSISR_IND BIT15 -#define UHIMR_BCNDMAINT_E BIT14 -/* RSVD BIT13 */ -#define UHIMR_CTW_END BIT12 -/* RSVD BIT11 */ -#define UHIMR_C2HCMD BIT10 -#define UHIMR_CPWM2 BIT9 -#define UHIMR_CPWM BIT8 -#define UHIMR_HIGHDOK BIT7 /* High Queue DMA OK Interrupt */ -#define UHIMR_MGNTDOK BIT6 /* Management Queue DMA OK Interrupt */ -#define UHIMR_BKDOK BIT5 /* AC_BK DMA OK Interrupt */ -#define UHIMR_BEDOK BIT4 /* AC_BE DMA OK Interrupt */ -#define UHIMR_VIDOK BIT3 /* AC_VI DMA OK Interrupt */ -#define UHIMR_VODOK BIT2 /* AC_VO DMA Interrupt */ -#define UHIMR_RDU BIT1 /* Receive Descriptor Unavailable */ -#define UHIMR_ROK BIT0 /* Receive DMA OK Interrupt */ - -/* USB Host Interrupt Status Extension bit */ -#define UHIMR_BCNDMAINT7 BIT23 -#define UHIMR_BCNDMAINT6 BIT22 -#define UHIMR_BCNDMAINT5 BIT21 -#define UHIMR_BCNDMAINT4 BIT20 -#define UHIMR_BCNDOK7 BIT19 -#define UHIMR_BCNDOK6 BIT18 -#define UHIMR_BCNDOK5 BIT17 -#define UHIMR_BCNDOK4 BIT16 -/* bit14-15: RSVD */ -#define UHIMR_ATIMEND_E BIT13 -#define UHIMR_ATIMEND BIT12 -#define UHIMR_TXERR BIT11 -#define UHIMR_RXERR BIT10 -#define UHIMR_TXFOVW BIT9 -#define UHIMR_RXFOVW BIT8 -/* bit2-7: RSVD */ -#define UHIMR_OCPINT BIT1 -/* bit0: RSVD */ - - -#define HAL_NIC_UNPLUG_ISR 0xFFFFFFFF /* The value when the NIC is unplugged for PCI. */ -#define HAL_NIC_UNPLUG_PCI_ISR 0xEAEAEAEA /* The value when the NIC is unplugged for PCI in PCI interrupt (page 3). */ - -/* */ -/* 8188 IMR/ISR bits */ -/* */ -#define IMR_DISABLED_88E 0x0 -/* IMR DW0(0x0060-0063) Bit 0-31 */ -#define IMR_TXCCK_88E BIT30 /* TXRPT interrupt when CCX bit of the packet is set */ -#define IMR_PSTIMEOUT_88E BIT29 /* Power Save Time Out Interrupt */ -#define IMR_GTINT4_88E BIT28 /* When GTIMER4 expires, this bit is set to 1 */ -#define IMR_GTINT3_88E BIT27 /* When GTIMER3 expires, this bit is set to 1 */ -#define IMR_TBDER_88E BIT26 /* Transmit Beacon0 Error */ -#define IMR_TBDOK_88E BIT25 /* Transmit Beacon0 OK */ -#define IMR_TSF_BIT32_TOGGLE_88E BIT24 /* TSF Timer BIT32 toggle indication interrupt */ -#define IMR_BCNDMAINT0_88E BIT20 /* Beacon DMA Interrupt 0 */ -#define IMR_BCNDERR0_88E BIT16 /* Beacon Queue DMA Error 0 */ -#define IMR_HSISR_IND_ON_INT_88E BIT15 /* HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1) */ -#define IMR_BCNDMAINT_E_88E BIT14 /* Beacon DMA Interrupt Extension for Win7 */ -#define IMR_ATIMEND_88E BIT12 /* CTWidnow End or ATIM Window End */ -#define IMR_HISR1_IND_INT_88E BIT11 /* HISR1 Indicator (HISR1 & HIMR1 is true, this bit is set to 1) */ -#define IMR_C2HCMD_88E BIT10 /* CPU to Host Command INT Status, Write 1 clear */ -#define IMR_CPWM2_88E BIT9 /* CPU power Mode exchange INT Status, Write 1 clear */ -#define IMR_CPWM_88E BIT8 /* CPU power Mode exchange INT Status, Write 1 clear */ -#define IMR_HIGHDOK_88E BIT7 /* High Queue DMA OK */ -#define IMR_MGNTDOK_88E BIT6 /* Management Queue DMA OK */ -#define IMR_BKDOK_88E BIT5 /* AC_BK DMA OK */ -#define IMR_BEDOK_88E BIT4 /* AC_BE DMA OK */ -#define IMR_VIDOK_88E BIT3 /* AC_VI DMA OK */ -#define IMR_VODOK_88E BIT2 /* AC_VO DMA OK */ -#define IMR_RDU_88E BIT1 /* Rx Descriptor Unavailable */ -#define IMR_ROK_88E BIT0 /* Receive DMA OK */ - -/* IMR DW1(0x00B4-00B7) Bit 0-31 */ -#define IMR_BCNDMAINT7_88E BIT27 /* Beacon DMA Interrupt 7 */ -#define IMR_BCNDMAINT6_88E BIT26 /* Beacon DMA Interrupt 6 */ -#define IMR_BCNDMAINT5_88E BIT25 /* Beacon DMA Interrupt 5 */ -#define IMR_BCNDMAINT4_88E BIT24 /* Beacon DMA Interrupt 4 */ -#define IMR_BCNDMAINT3_88E BIT23 /* Beacon DMA Interrupt 3 */ -#define IMR_BCNDMAINT2_88E BIT22 /* Beacon DMA Interrupt 2 */ -#define IMR_BCNDMAINT1_88E BIT21 /* Beacon DMA Interrupt 1 */ -#define IMR_BCNDOK7_88E BIT20 /* Beacon Queue DMA OK Interrupt 7 */ -#define IMR_BCNDOK6_88E BIT19 /* Beacon Queue DMA OK Interrupt 6 */ -#define IMR_BCNDOK5_88E BIT18 /* Beacon Queue DMA OK Interrupt 5 */ -#define IMR_BCNDOK4_88E BIT17 /* Beacon Queue DMA OK Interrupt 4 */ -#define IMR_BCNDOK3_88E BIT16 /* Beacon Queue DMA OK Interrupt 3 */ -#define IMR_BCNDOK2_88E BIT15 /* Beacon Queue DMA OK Interrupt 2 */ -#define IMR_BCNDOK1_88E BIT14 /* Beacon Queue DMA OK Interrupt 1 */ -#define IMR_ATIMEND_E_88E BIT13 /* ATIM Window End Extension for Win7 */ -#define IMR_TXERR_88E BIT11 /* Tx Error Flag Interrupt Status, write 1 clear. */ -#define IMR_RXERR_88E BIT10 /* Rx Error Flag INT Status, Write 1 clear */ -#define IMR_TXFOVW_88E BIT9 /* Transmit FIFO Overflow */ -#define IMR_RXFOVW_88E BIT8 /* Receive FIFO Overflow */ - -/*=================================================================== -===================================================================== -Here the register defines are for 92C. When the define is as same with 92C, -we will use the 92C's define for the consistency -So the following defines for 92C is not entire!!!!!! -===================================================================== -=====================================================================*/ -/* -Based on Datasheet V33---090401 -Register Summary -Current IOREG MAP -0x0000h ~ 0x00FFh System Configuration (256 Bytes) -0x0100h ~ 0x01FFh MACTOP General Configuration (256 Bytes) -0x0200h ~ 0x027Fh TXDMA Configuration (128 Bytes) -0x0280h ~ 0x02FFh RXDMA Configuration (128 Bytes) -0x0300h ~ 0x03FFh PCIE EMAC Reserved Region (256 Bytes) -0x0400h ~ 0x04FFh Protocol Configuration (256 Bytes) -0x0500h ~ 0x05FFh EDCA Configuration (256 Bytes) -0x0600h ~ 0x07FFh WMAC Configuration (512 Bytes) -0x2000h ~ 0x3FFFh 8051 FW Download Region (8196 Bytes) -*/ - /* */ - /* 8192C (TXPAUSE) transmission pause (Offset 0x522, 8 bits) */ - /* */ -/* Note: */ -/* The bits of stopping AC(VO/VI/BE/BK) queue in datasheet RTL8192S/RTL8192C are wrong, */ -/* the correct arrangement is VO - Bit0, VI - Bit1, BE - Bit2, and BK - Bit3. */ -/* 8723 and 88E may be not correct either in the earlier version. Confirmed with DD Tim. */ -/* By Bruce, 2011-09-22. */ -#define StopBecon BIT6 -#define StopHigh BIT5 -#define StopMgt BIT4 -#define StopBK BIT3 -#define StopBE BIT2 -#define StopVI BIT1 -#define StopVO BIT0 - -/* */ /* 8192C (RCR) Receive Configuration Register (Offset 0x608, 32 bits) */ /* */ #define RCR_APPFCS BIT31 /* WMAC append FCS after pauload */ @@ -1557,10 +1296,6 @@ Current IOREG MAP #define SDIO_HIMR_ATIMEND_E_MSK BIT26 #define SDIO_HIMR_CTWEND_MSK BIT27 -/* RTL8188E SDIO Specific */ -#define SDIO_HIMR_MCU_ERR_MSK BIT28 -#define SDIO_HIMR_TSF_BIT32_TOGGLE_MSK BIT29 - /* SDIO Host Interrupt Service Routine */ #define SDIO_HISR_RX_REQUEST BIT0 #define SDIO_HISR_AVAL BIT1 @@ -1583,10 +1318,6 @@ Current IOREG MAP #define SDIO_HISR_ATIMEND_E BIT26 #define SDIO_HISR_CTWEND BIT27 -/* RTL8188E SDIO Specific */ -#define SDIO_HISR_MCU_ERR BIT28 -#define SDIO_HISR_TSF_BIT32_TOGGLE BIT29 - #define MASK_SDIO_HISR_CLEAR (SDIO_HISR_TXERR |\ SDIO_HISR_RXERR |\ SDIO_HISR_TXFOVW |\ @@ -1651,39 +1382,13 @@ Current IOREG MAP #define GPS_HWPDN_SL BIT21 /* GPS HW PDn polarity control */ #define GPS_FUNC_EN BIT22 /* GPS function enable */ -/* 3 REG_LIFECTRL_CTRL */ -#define HAL92C_EN_PKT_LIFE_TIME_BK BIT3 -#define HAL92C_EN_PKT_LIFE_TIME_BE BIT2 -#define HAL92C_EN_PKT_LIFE_TIME_VI BIT1 -#define HAL92C_EN_PKT_LIFE_TIME_VO BIT0 - -#define HAL92C_MSDU_LIFE_TIME_UNIT 128 /* in us, said by Tim. */ - -/* 2 8192D PartNo. */ -#define PARTNO_92D_NIC (BIT7|BIT6) -#define PARTNO_92D_NIC_REMARK (BIT5|BIT4) -#define PARTNO_SINGLE_BAND_VS BIT3 -#define PARTNO_SINGLE_BAND_VS_REMARK BIT1 -#define PARTNO_CONCURRENT_BAND_VC (BIT3|BIT2) -#define PARTNO_CONCURRENT_BAND_VC_REMARK (BIT1|BIT0) - /* */ /* General definitions */ /* */ -#define LAST_ENTRY_OF_TX_PKT_BUFFER_8188E 176 -#define LAST_ENTRY_OF_TX_PKT_BUFFER_8812 255 #define LAST_ENTRY_OF_TX_PKT_BUFFER_8723B 255 -#define LAST_ENTRY_OF_TX_PKT_BUFFER_8192C 255 -#define LAST_ENTRY_OF_TX_PKT_BUFFER_DUAL_MAC 127 #define POLLING_LLT_THRESHOLD 20 #define POLLING_READY_TIMEOUT_COUNT 1000 - -/* GPIO BIT */ -#define HAL_8192C_HW_GPIO_WPS_BIT BIT2 -#define HAL_8192EU_HW_GPIO_WPS_BIT BIT7 -#define HAL_8188E_HW_GPIO_WPS_BIT BIT7 - #endif /* __HAL_COMMON_H__ */ diff --git a/drivers/staging/rtl8723bs/include/rtw_ioctl.h b/drivers/staging/rtl8723bs/include/rtw_ioctl.h deleted file mode 100644 index 7179591cb01d..000000000000 --- a/drivers/staging/rtl8723bs/include/rtw_ioctl.h +++ /dev/null @@ -1,72 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. - * - ******************************************************************************/ -#ifndef _RTW_IOCTL_H_ -#define _RTW_IOCTL_H_ - -/* 00 - Success */ -/* 11 - Error */ -#define STATUS_SUCCESS (0x00000000L) -#define STATUS_PENDING (0x00000103L) - -#define STATUS_UNSUCCESSFUL (0xC0000001L) -#define STATUS_INSUFFICIENT_RESOURCES (0xC000009AL) -#define STATUS_NOT_SUPPORTED (0xC00000BBL) - -#define NDIS_STATUS_SUCCESS ((uint)STATUS_SUCCESS) -#define NDIS_STATUS_PENDING ((uint)STATUS_PENDING) -#define NDIS_STATUS_NOT_RECOGNIZED ((uint)0x00010001L) -#define NDIS_STATUS_NOT_COPIED ((uint)0x00010002L) -#define NDIS_STATUS_NOT_ACCEPTED ((uint)0x00010003L) -#define NDIS_STATUS_CALL_ACTIVE ((uint)0x00010007L) - -#define NDIS_STATUS_FAILURE ((uint)STATUS_UNSUCCESSFUL) -#define NDIS_STATUS_RESOURCES ((uint)STATUS_INSUFFICIENT_RESOURCES) -#define NDIS_STATUS_CLOSING ((uint)0xC0010002L) -#define NDIS_STATUS_BAD_VERSION ((uint)0xC0010004L) -#define NDIS_STATUS_BAD_CHARACTERISTICS ((uint)0xC0010005L) -#define NDIS_STATUS_ADAPTER_NOT_FOUND ((uint)0xC0010006L) -#define NDIS_STATUS_OPEN_FAILED ((uint)0xC0010007L) -#define NDIS_STATUS_DEVICE_FAILED ((uint)0xC0010008L) -#define NDIS_STATUS_MULTICAST_FULL ((uint)0xC0010009L) -#define NDIS_STATUS_MULTICAST_EXISTS ((uint)0xC001000AL) -#define NDIS_STATUS_MULTICAST_NOT_FOUND ((uint)0xC001000BL) -#define NDIS_STATUS_REQUEST_ABORTED ((uint)0xC001000CL) -#define NDIS_STATUS_RESET_IN_PROGRESS ((uint)0xC001000DL) -#define NDIS_STATUS_CLOSING_INDICATING ((uint)0xC001000EL) -#define NDIS_STATUS_NOT_SUPPORTED ((uint)STATUS_NOT_SUPPORTED) -#define NDIS_STATUS_INVALID_PACKET ((uint)0xC001000FL) -#define NDIS_STATUS_OPEN_LIST_FULL ((uint)0xC0010010L) -#define NDIS_STATUS_ADAPTER_NOT_READY ((uint)0xC0010011L) -#define NDIS_STATUS_ADAPTER_NOT_OPEN ((uint)0xC0010012L) -#define NDIS_STATUS_NOT_INDICATING ((uint)0xC0010013L) -#define NDIS_STATUS_INVALID_LENGTH ((uint)0xC0010014L) -#define NDIS_STATUS_INVALID_DATA ((uint)0xC0010015L) -#define NDIS_STATUS_BUFFER_TOO_SHORT ((uint)0xC0010016L) -#define NDIS_STATUS_INVALID_OID ((uint)0xC0010017L) -#define NDIS_STATUS_ADAPTER_REMOVED ((uint)0xC0010018L) -#define NDIS_STATUS_UNSUPPORTED_MEDIA ((uint)0xC0010019L) -#define NDIS_STATUS_GROUP_ADDRESS_IN_USE ((uint)0xC001001AL) -#define NDIS_STATUS_FILE_NOT_FOUND ((uint)0xC001001BL) -#define NDIS_STATUS_ERROR_READING_FILE ((uint)0xC001001CL) -#define NDIS_STATUS_ALREADY_MAPPED ((uint)0xC001001DL) -#define NDIS_STATUS_RESOURCE_CONFLICT ((uint)0xC001001EL) -#define NDIS_STATUS_NO_CABLE ((uint)0xC001001FL) - -#define NDIS_STATUS_INVALID_SAP ((uint)0xC0010020L) -#define NDIS_STATUS_SAP_IN_USE ((uint)0xC0010021L) -#define NDIS_STATUS_INVALID_ADDRESS ((uint)0xC0010022L) -#define NDIS_STATUS_VC_NOT_ACTIVATED ((uint)0xC0010023L) -#define NDIS_STATUS_DEST_OUT_OF_ORDER ((uint)0xC0010024L) /* cause 27 */ -#define NDIS_STATUS_VC_NOT_AVAILABLE ((uint)0xC0010025L) /* cause 35, 45 */ -#define NDIS_STATUS_CELLRATE_NOT_AVAILABLE ((uint)0xC0010026L) /* cause 37 */ -#define NDIS_STATUS_INCOMPATABLE_QOS ((uint)0xC0010027L) /* cause 49 */ -#define NDIS_STATUS_AAL_PARAMS_UNSUPPORTED ((uint)0xC0010028L) /* cause 93 */ -#define NDIS_STATUS_NO_ROUTE_TO_DESTINATION ((uint)0xC0010029L) /* cause 3 */ - -extern struct iw_handler_def rtw_handlers_def; - -#endif /* #ifndef __INC_CEINFO_ */ diff --git a/drivers/staging/rtl8723bs/os_dep/os_intfs.c b/drivers/staging/rtl8723bs/os_dep/os_intfs.c index 757efeb49d08..380d8c9e1239 100644 --- a/drivers/staging/rtl8723bs/os_dep/os_intfs.c +++ b/drivers/staging/rtl8723bs/os_dep/os_intfs.c @@ -389,7 +389,7 @@ static int rtw_ndev_notifier_call(struct notifier_block *nb, unsigned long state if (dev->netdev_ops->ndo_do_ioctl != rtw_ioctl) return NOTIFY_DONE; - netdev_info(dev, FUNC_NDEV_FMT " state:%lu\n", FUNC_NDEV_ARG(dev), + netdev_dbg(dev, FUNC_NDEV_FMT " state:%lu\n", FUNC_NDEV_ARG(dev), state); return NOTIFY_DONE; diff --git a/drivers/staging/rts5208/rtsx_transport.c b/drivers/staging/rts5208/rtsx_transport.c index 805dc18fac0a..d5ad49de4c56 100644 --- a/drivers/staging/rts5208/rtsx_transport.c +++ b/drivers/staging/rts5208/rtsx_transport.c @@ -55,9 +55,9 @@ unsigned int rtsx_stor_access_xfer_buf(unsigned char *buffer, *offset += cnt; /* - * Using scatter-gather. We have to go through the list one entry - * at a time. Each s-g entry contains some number of pages, and - * each page has to be kmap()'ed separately. + * Using scatter-gather. We have to go through the list one entry + * at a time. Each s-g entry contains some number of pages which + * have to be copied one at a time. */ } else { struct scatterlist *sg = @@ -92,13 +92,11 @@ unsigned int rtsx_stor_access_xfer_buf(unsigned char *buffer, while (sglen > 0) { unsigned int plen = min(sglen, (unsigned int) PAGE_SIZE - poff); - unsigned char *ptr = kmap(page); if (dir == TO_XFER_BUF) - memcpy(ptr + poff, buffer + cnt, plen); + memcpy_to_page(page, poff, buffer + cnt, plen); else - memcpy(buffer + cnt, ptr + poff, plen); - kunmap(page); + memcpy_from_page(buffer + cnt, page, poff, plen); /* Start at the beginning of the next page */ poff = 0; diff --git a/drivers/staging/sm750fb/sm750_hw.c b/drivers/staging/sm750fb/sm750_hw.c index a7c6eb07b62e..55cb00e8b0d1 100644 --- a/drivers/staging/sm750fb/sm750_hw.c +++ b/drivers/staging/sm750fb/sm750_hw.c @@ -81,6 +81,7 @@ int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev) sm750_dev->pvMem = ioremap_wc(sm750_dev->vidmem_start, sm750_dev->vidmem_size); if (!sm750_dev->pvMem) { + iounmap(sm750_dev->pvReg); pr_err("Map video memory failed\n"); ret = -EFAULT; goto exit; diff --git a/drivers/staging/unisys/Documentation/ABI/sysfs-platform-visorchipset b/drivers/staging/unisys/Documentation/ABI/sysfs-platform-visorchipset deleted file mode 100644 index c2359de17eaf..000000000000 --- a/drivers/staging/unisys/Documentation/ABI/sysfs-platform-visorchipset +++ /dev/null @@ -1,89 +0,0 @@ -This file describes sysfs entries beneath /devices/platform/visorchipset. - -What: install/error -Date: 7/18/2014 -KernelVersion: TBD -Contact: sparmaintainer@unisys.com -Description: used to send the ID of a string that should be displayed on - s-Par's automatic installation progress screen when an error - is encountered during installation. This field has no effect - if not in installation mode. -Users: sparmaintainer@unisys.com - -What: install/remainingsteps -Date: 7/18/2014 -KernelVersion: TBD -Contact: sparmaintainer@unisys.com -Description: used to set the value of the progress bar on the s-Par automatic - installation progress screen. This field has no effect if not in - installation mode. -Users: sparmaintainer@unisys.com - -What: install/textid -Date: 7/18/2014 -KernelVersion: TBD -Contact: sparmaintainer@unisys.com -Description: used to send the ID of a string that should be displayed on - s-Par's automatic installation progress screen. Setting this - field when not in installation mode (boottotool was set on - the previous guest boot) has no effect. -Users: sparmaintainer@unisys.com - -What: install/boottotool -Date: 7/18/2014 -KernelVersion: TBD -Contact: sparmaintainer@unisys.com -Description: The boottotool flag controls s-Par behavior on the next boot of - this guest. Setting the flag will cause the guest to boot from - the utility and installation image, which will use the value in - the toolaction field to determine what operation is being - requested. -Users: sparmaintainer@unisys.com - -What: install/toolaction -Date: 7/18/2014 -KernelVersion: TBD -Contact: sparmaintainer@unisys.com -Description: This field is used to tell s-Par which type of recovery tool - action to perform on the next guest boot-up. The meaning of the - value is dependent on the type of installation software used to - commission the guest. -Users: sparmaintainer@unisys.com - -What: parahotplug/deviceenabled -Date: 7/18/2014 -KernelVersion: TBD -Contact: sparmaintainer@unisys.com -Description: This entry is used by a Unisys support script installed on the - guest, and triggered by a udev event. The support script is - responsible for enabling and disabling SR-IOV devices when the - PF device is being recovered in another guest. - - Some SR-IOV devices have problems when the PF is reset without - first disabling all VFs attached to that PF. s-Par handles this - situation by sending a message to guests using these VFs, and - the script will disable the device. When the PF is recovered, - another message is sent to the guests to re-enable the VFs. - - The parahotplug/deviceenabled interface is used to acknowledge - the recovery message. -Users: sparmaintainer@unisys.com - -What: parahotplug/devicedisabled -Date: 7/18/2014 -KernelVersion: TBD -Contact: sparmaintainer@unisys.com -Description: This entry is used by a Unisys support script installed on the - guest, and triggered by a udev event. The support script is - responsible for enabling and disabling SR-IOV devices when the - PF device is being recovered in another guest. - - Some SR-IOV devices have problems when the PF is reset without - first disabling all VFs attached to that PF. s-Par handles this - situation by sending a message to guests using these VFs, and - the script will disable the device. When the PF is recovered, - another message is sent to the guests to re-enable the VFs. - - The parahotplug/devicedisaabled interface is used to acknowledge - the initial recovery message. -Users: sparmaintainer@unisys.com diff --git a/drivers/staging/unisys/Documentation/overview.txt b/drivers/staging/unisys/Documentation/overview.txt deleted file mode 100644 index cf29f884cbe0..000000000000 --- a/drivers/staging/unisys/Documentation/overview.txt +++ /dev/null @@ -1,337 +0,0 @@ -1. Overview ------------ - -This document describes the driver set for Unisys Secure Partitioning -(s-Par(R)). - -s-Par is firmware that provides hardware partitioning capabilities for -splitting large-scale Intel x86 servers into multiple isolated -partitions. s-Par provides a set of para-virtualized device drivers to -allow guest partitions on the same server to share devices that would -normally be unsharable, specifically: - -* visornic - network interface -* visorhba - scsi disk adapter -* visorinput - keyboard and mouse - -These drivers conform to the standard Linux bus/device model described -within Documentation/driver-api/driver-model/, and utilize a driver named -visorbus to present the virtual busses involved. Drivers in the 'visor*' -driver set are commonly referred to as "guest drivers" or "client drivers". -All drivers except visorbus expose a device of a specific usable class to the -Linux guest environment (e.g., block, network, or input), and are collectively -referred to as "function drivers". - -The back-end for each device is owned and managed by a small, -single-purpose service partition in the s-Par firmware, which communicates -with each guest partition sharing that device through an area of shared memory -called a "channel". In s-Par nomenclature, the back-end is often referred to -as the "service partition", "IO partition" (for virtual network and scsi disk -devices), or "console partition" (for virtual keyboard and mouse devices). - -Each virtual device requires exactly 1 dedicated channel, which the guest -driver and back-end use to communicate. The hypervisor need not intervene -(other than normal interrupt handling) in the interactions that occur across -this channel. - -NOT covered in this document: - -* s-Par also supports sharing physical PCI adapters via SR-IOV, but - because this requires no specific support in the guest partitions, it will - not be discussed in this document. Shared SR-IOV devices should be used - wherever possible for highest performance. - -* Because the s-Par back-end provides a standard EFI framebuffer to each - guest, the already-existing efifb Linux driver is used to provide guest - video access. Thus, the only s-Par-unique support that is necessary to - provide a guest graphics console are for keyboard and mouse (via visorinput). - - -2. Driver Descriptions ----------------------- - -2.1. visorbus -------------- - -2.1.1. Overview ---------------- - -The visorbus driver handles the virtual busses on which all of the virtual -devices reside. It provides a registration function named -visorbus_register_visor_driver() that is called by each of the function -drivers at initialization time, which the function driver uses to tell -visorbus about the device classes (via specifying a list of device type -GUIDs) it wants to handle. For use by function drivers, visorbus provides -implementation for struct visor_driver and struct visor_device, as well -as utility functions for communicating with the back-end. - -visorbus is associated with ACPI id "PNP0A07" in modules.alias, so if built -as a module it will typically be loaded automatically via standard udev or -systemd (God help us) configurations. - -visorbus can similarly force auto-loading of function drivers for virtual -devices it discovers, as it includes a MODALIAS environment variable of this -form in the hotplug uevent environment when each virtual device is -discovered: - - visorbus:<device type GUID> - -visorbus notifies each function driver when a device of its registered class -arrives and departs, by calling the function driver's probe() and remove() -methods. - -The actual struct device objects that correspond to each virtual bus and -each virtual device are created and owned by visorbus. These device objects -are created in response to messages from the s-Par back-end received on a -special control channel called the "controlvm channel" (each guest partition -has access to exactly 1 controlvm channel), and have a lifetime that is -independent of the function drivers that control them. - -2.1.2. "struct visor device" Function Driver Interfaces -------------------------------------------------------- - -The interface between visorbus and its function drivers is defined in -visorbus.h, and described below. - -When a visor function driver loads, it calls visorbus_register_visor_driver() -to register itself with visorbus. The significant information passed in this -exchange is as follows: - -* the GUID(s) of the channel type(s) that are handled by this driver, as - well as a "friendly name" identifying each (this will be published under - /sys/devices/visorbus<x>/dev<y>) - -* the addresses of callback functions to be called whenever a virtual - device/channel with the appropriate channel-type GUID(s) appears or - disappears - -* the address of a "channel_interrupt" function, which will be automatically - called at specific intervals to enable the driver to poll the device - channel for activity - -The following functions implemented within each function driver will be -called automatically by the visorbus driver at appropriate times: - -* The probe() function notifies about the creation of each new virtual - device/channel instance. - -* The remove() function notifies about the destruction of a virtual - device/channel instance. - -* The channel_interrupt() function is called at frequent intervals to - give the function driver an opportunity to poll the virtual device channel - for requests. Information is passed to this function to enable the - function driver to use the visorchannel_signalinsert() and - visorchannel_signalremove() functions to respond to and initiate activity - over the channel. (Note that since it is the visorbus driver that - determines when this is called, it is very easy to switch to - interrupt-driven mechanisms when available for particular virtual device - types.) - -* The pause() function is called should it ever be necessary to direct the - function driver to temporarily stop accessing the device channel. An - example of when this is needed is when the service partition implementing - the back-end of the virtual device needs to be recovered. After a - successful return of pause(), the function driver must not access the - device channel until a subsequent resume() occurs. - -* The resume() function is the "book-end" to pause(), and is described above. - -2.1.3. sysfs Advertised Information ------------------------------------ - -Because visorbus is a standard Linux bus driver in the model described in -Documentation/driver-api/driver-model/, the hierarchy of s-Par virtual devices is -published in the sysfs tree beneath /bus/visorbus/, e.g., -/sys/bus/visorbus/devices/ might look like: - - vbus1:dev1 -> ../../../devices/visorbus1/vbus1:dev1 - vbus1:dev2 -> ../../../devices/visorbus1/vbus1:dev2 - vbus1:dev3 -> ../../../devices/visorbus1/vbus1:dev3 - vbus2:dev0 -> ../../../devices/visorbus2/vbus2:dev0 - vbus2:dev1 -> ../../../devices/visorbus2/vbus2:dev1 - vbus2:dev2 -> ../../../devices/visorbus2/vbus2:dev2 - visorbus1 -> ../../../devices/visorbus1 - visorbus2 -> ../../../devices/visorbus2 - -visor_device notes: - -* Each visorbus<n> entry denotes the existence of a struct visor_device - denoting virtual bus #<n>. A unique s-Par channel exists for each such - virtual bus. - -* Virtual bus numbers uniquely identify s-Par back-end service partitions. - In this example, bus 1 corresponds to the s-Par console partition - (controls keyboard, video, and mouse), whereas bus 2 corresponds to the - s-Par IO partition (controls network and disk). - -* Each vbus<x>:dev<y> entry denotes the existence of a struct visor_device - denoting virtual device #<y> outboard of virtual bus #<x>. A unique s-Par - channel exists for each such virtual device. - -* If a function driver has loaded and claimed a particular device, the - bus/visorbus/devices/vbus<x>:dev<y>/driver symlink will indicate that - function driver. - -Every active visorbus device will have a sysfs subtree under: - - /sys/devices/visorbus<x>/vbus<x>:dev<y>/ - -The following files exist under /sys/devices/visorbus<x>/vbus<x>:dev<y>: - - subsystem link to sysfs tree that describes the - visorbus bus type; e.g.: - ../../../bus/visorbus - - driver link to sysfs tree that describes the - function driver controlling this device; - e.g.: - ../../../bus/visorbus/drivers/visorhba - Note that this "driver" link will not exist - if the appropriate function driver has not - been loaded yet. - - channel properties of the device channel (all in - ascii text format) - - clientpartition handle identifying the guest (client) side - of this channel, e.g. 0x10000000. - - nbytes total size of this channel in bytes - - physaddr the guest physical address for the base of - the channel - - typeguid a GUID identifying the channel type, in - xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx notation - - typename a "friendly name" for this channel type, e.g., - "keyboard". Note that this name is provided by - a particular function driver, so "typename" - will return an empty string until AFTER the - appropriate function driver controlling this - channel type is loaded - - zoneguid a GUID identifying the channel zone, in - xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx notation - - -2.2. visorhba -------------- - -The visorhba driver registers with visorbus as the function driver to -handle virtual scsi disk devices, specified using the -VISOR_VHBA_CHANNEL_GUID type in the visorbus_register_visor_driver() -call. visorhba uses scsi_add_host() to expose a Linux block device -(e.g., /sys/block/) in the guest environment for each s-Par virtual device. - -visorhba provides access to a shared SCSI host bus adapter and one or more -disk devices, by proxying SCSI commands between the guest and the service -partition that owns the shared SCSI adapter, using a channel between the -guest and the service partition. The disks that appear on the shared bus -are defined by the s-Par configuration and enforced by the service partition, -while the guest driver handles sending commands and handling responses. Each -disk is shared as a whole to a guest. Sharing the bus adapter in this way -provides resiliency; should the device encounter an error, only the service -partition is rebooted, and the device is reinitialized. This allows -guests to continue running and to recover from the error. - -When compiled as a module, visorhba can be autoloaded by visorbus in -standard udev/systemd environments, as it includes the modules.alias -definition: - - "visorbus:"+VISOR_VHBA_CHANNEL_GUID_STR - -i.e.: - - alias visorbus:414815ed-c58c-11da-95a9-00e08161165f visorhba - - -2.3. visornic -------------- - -The visornic driver registers with visorbus as the function driver to -handle virtual network devices, specified using the -VISOR_VNIC_CHANNEL_GUID type in the visorbus_register_visor_driver() -call. visornic uses register_netdev() to expose a Linux device of class net -(e.g., /sys/class/net/) in the guest environment for each s-Par virtual -device. - -visornic provides a paravirtualized network interface to a -guest by proxying buffer information between the guest and the service -partition that owns the shared network interface, using a channel -between the guest and the service partition. The connectivity of this -interface with the shared interface and possibly other guest -partitions is defined by the s-Par configuration and enforced by the -service partition; the guest driver handles communication and link -status. - -When compiled as a module, visornic can be autoloaded by visorbus in -standard udev/systemd environments, as it includes the modules.alias -definition: - - "visorbus:"+VISOR_VNIC_CHANNEL_GUID_STR - -i.e.: - - alias visorbus:8cd5994d-c58e-11da-95a9-00e08161165f visornic - - -2.4. visorinput ---------------- - -The visorinput driver registers with visorbus as the function driver to -handle human input devices, specified using the -VISOR_KEYBOARD_CHANNEL_GUID and VISOR_MOUSE_CHANNEL_GUID -types in the visorbus_register_visor_driver() call. visorinput uses -input_register_device() to expose devices of class input -(e.g., /sys/class/input/) for virtual keyboard and virtual mouse devices. -A s-Par virtual keyboard device maps 1-to-1 with a Linux input device -named "visor Keyboard", while a s-Par virtual mouse device has 2 Linux input -devices created for it: 1 named "visor Wheel", and 1 named "visor Mouse". - -By registering as input class devices, modern versions of X will -automatically find and properly use s-Par virtual keyboard and mouse devices. -As the s-Par back-end reports keyboard and mouse activity via events on the -virtual device channel, the visorinput driver delivers the activity to the -Linux environment by calling input_report_key() and input_report_abs(). - -You can interact with the guest console using the usyscon Partition Desktop -(a.k.a., "pd") application, provided as part of s-Par. After installing the -usyscon Partition Desktop into a Linux environment via the -usyscon_partitiondesktop-*.rpm, or into a Windows environment via -PartitionDesktop.msi, you will be able to launch a console for your guest -Linux environment by clicking the console icon in the s-Par web UI. - -When compiled as a module, visorinput can be autoloaded by visorbus in -standard udev/systemd environments, as it includes the modules.alias -definition: - - "visorbus:"+VISOR_MOUSE_CHANNEL_GUID_STR - "visorbus:"+VISOR_KEYBOARD_CHANNEL_GUID_STR - -i.e.: - - alias visorbus:c73416d0-b0b8-44af-b304-9d2ae99f1b3d visorinput - alias visorbus:addf07d4-94a9-46e2-81c3-61abcdbdbd87 visorinput - - -3. Minimum Required Driver Set ------------------------------- - -visorbus is required for every Linux guest running under s-Par. - -visorhba is typically required for a Linux guest running under s-Par, as it -is required if your guest boot disk is a virtual device provided by the s-Par -back-end, which is the default configuration. However, for advanced -configurations where the Linux guest boots via an SR-IOV-provided HBA or -SAN disk for example, visorhba is not technically required. - -visornic is typically required for a Linux guest running under s-Par, as it -is required if your guest network interface is a virtual device provided by -the s-Par back-end, which is the default configuration. However, for -configurations where the Linux guest is provided with an SR-IOV NIC -for example, visornic is not technically required. - -visorinput is only required for a Linux guest running under s-Par if you -require graphics-mode access to your guest console. diff --git a/drivers/staging/unisys/Kconfig b/drivers/staging/unisys/Kconfig deleted file mode 100644 index 43fe1ce538e1..000000000000 --- a/drivers/staging/unisys/Kconfig +++ /dev/null @@ -1,16 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# Unisys SPAR driver configuration -# -menuconfig UNISYSSPAR - bool "Unisys SPAR driver support" - help - Support for the Unisys SPAR drivers - -if UNISYSSPAR - -source "drivers/staging/unisys/visornic/Kconfig" -source "drivers/staging/unisys/visorinput/Kconfig" -source "drivers/staging/unisys/visorhba/Kconfig" - -endif # UNISYSSPAR diff --git a/drivers/staging/unisys/MAINTAINERS b/drivers/staging/unisys/MAINTAINERS deleted file mode 100644 index aaddc619c329..000000000000 --- a/drivers/staging/unisys/MAINTAINERS +++ /dev/null @@ -1,5 +0,0 @@ -Unisys s-Par drivers -M: David Kershner <sparmaintainer@unisys.com> -S: Maintained -F: drivers/staging/unisys/Documentation/overview.txt -F: drivers/staging/unisys/ diff --git a/drivers/staging/unisys/Makefile b/drivers/staging/unisys/Makefile deleted file mode 100644 index c0f76cc196a6..000000000000 --- a/drivers/staging/unisys/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# Makefile for Unisys SPAR drivers -# -obj-$(CONFIG_UNISYS_VISORNIC) += visornic/ -obj-$(CONFIG_UNISYS_VISORINPUT) += visorinput/ -obj-$(CONFIG_UNISYS_VISORHBA) += visorhba/ diff --git a/drivers/staging/unisys/TODO b/drivers/staging/unisys/TODO deleted file mode 100644 index d863f266bf76..000000000000 --- a/drivers/staging/unisys/TODO +++ /dev/null @@ -1,16 +0,0 @@ -TODO: - - enhance visornic to use channel_interrupt() hook instead of a - kernel thread - - enhance visorhba to use channel_interrupt() hook instead of a - kernel thread - - teach visorbus to handle virtual interrupts triggered by s-Par - back-end, and call function driver's channel_interrupt() function - when they occur - - enhance debugfs interfaces (e.g., per device, etc.) - - upgrade/remove deprecated workqueue operations - - move individual drivers into proper driver subsystems - -Patches to: - Greg Kroah-Hartman <gregkh@linuxfoundation.org> - Ken Cox <jkc@redhat.com> - Unisys s-Par maintainer mailing list <sparmaintainer@unisys.com> diff --git a/drivers/staging/unisys/include/iochannel.h b/drivers/staging/unisys/include/iochannel.h deleted file mode 100644 index 9ef812c0bc42..000000000000 --- a/drivers/staging/unisys/include/iochannel.h +++ /dev/null @@ -1,571 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0+ */ -/* - * Copyright (C) 2010 - 2016 UNISYS CORPORATION - * All rights reserved. - */ - -#ifndef __IOCHANNEL_H__ -#define __IOCHANNEL_H__ - -/* - * Everything needed for IOPart-GuestPart communication is define in - * this file. Note: Everything is OS-independent because this file is - * used by Windows, Linux and possible EFI drivers. - * - * Communication flow between the IOPart and GuestPart uses the channel headers - * channel state. The following states are currently being used: - * UNINIT(All Zeroes), CHANNEL_ATTACHING, CHANNEL_ATTACHED, CHANNEL_OPENED - * - * Additional states will be used later. No locking is needed to switch between - * states due to the following rules: - * - * 1. IOPart is only the only partition allowed to change from UNIT - * 2. IOPart is only the only partition allowed to change from - * CHANNEL_ATTACHING - * 3. GuestPart is only the only partition allowed to change from - * CHANNEL_ATTACHED - * - * The state changes are the following: IOPart sees the channel is in UNINIT, - * UNINIT -> CHANNEL_ATTACHING (performed only by IOPart) - * CHANNEL_ATTACHING -> CHANNEL_ATTACHED (performed only by IOPart) - * CHANNEL_ATTACHED -> CHANNEL_OPENED (performed only by GuestPart) - */ - -#include <linux/uuid.h> -#include <linux/skbuff.h> -#include <linux/visorbus.h> - -/* - * Must increment these whenever you insert or delete fields within this channel - * struct. Also increment whenever you change the meaning of fields within this - * channel struct so as to break pre-existing software. Note that you can - * usually add fields to the END of the channel struct without needing to - * increment this. - */ -#define VISOR_VHBA_CHANNEL_VERSIONID 2 -#define VISOR_VNIC_CHANNEL_VERSIONID 2 - -/* - * Everything necessary to handle SCSI & NIC traffic between Guest Partition and - * IO Partition is defined below. - */ - -/* - * Define the two queues per data channel between iopart and ioguestparts. - * IOCHAN_TO_IOPART -- used by guest to 'insert' signals to iopart. - * IOCHAN_FROM_IOPART -- used by guest to 'remove' signals from IO part. - */ -#define IOCHAN_TO_IOPART 0 -#define IOCHAN_FROM_IOPART 1 - -/* Size of cdb - i.e., SCSI cmnd */ -#define MAX_CMND_SIZE 16 - -/* Unisys-specific DMA direction values */ -enum uis_dma_data_direction { - UIS_DMA_BIDIRECTIONAL = 0, - UIS_DMA_TO_DEVICE = 1, - UIS_DMA_FROM_DEVICE = 2, - UIS_DMA_NONE = 3 -}; - -#define MAX_SENSE_SIZE 64 -#define MAX_PHYS_INFO 64 - -/* - * enum net_types - Various types of network packets that can be sent in cmdrsp. - * @NET_RCV_POST: Submit buffer to hold receiving incoming packet. - * @NET_RCV: visornic -> uisnic. Incoming packet received. - * @NET_XMIT: uisnic -> visornic. For outgoing packet. - * @NET_XMIT_DONE: visornic -> uisnic. Outgoing packet xmitted. - * @NET_RCV_ENBDIS: uisnic -> visornic. Enable/Disable packet reception. - * @NET_RCV_ENBDIS_ACK: visornic -> uisnic. Acknowledge enable/disable packet. - * @NET_RCV_PROMISC: uisnic -> visornic. Enable/Disable promiscuous mode. - * @NET_CONNECT_STATUS: visornic -> uisnic. Indicate the loss or restoration of - * a network connection. - * @NET_MACADDR: uisnic -> visornic. Indicates the client has requested - * to update it's MAC address. - * @NET_MACADDR_ACK: MAC address acknowledge. - */ -enum net_types { - NET_RCV_POST = 0, - NET_RCV, - NET_XMIT, - NET_XMIT_DONE, - NET_RCV_ENBDIS, - NET_RCV_ENBDIS_ACK, - /* Reception */ - NET_RCV_PROMISC, - NET_CONNECT_STATUS, - NET_MACADDR, - NET_MACADDR_ACK, -}; - -/* Minimum eth data size */ -#define ETH_MIN_DATA_SIZE 46 -#define ETH_MIN_PACKET_SIZE (ETH_HLEN + ETH_MIN_DATA_SIZE) - -/* Maximum data size */ -#define VISOR_ETH_MAX_MTU 16384 - -#ifndef MAX_MACADDR_LEN -/* Number of bytes in MAC address */ -#define MAX_MACADDR_LEN 6 -#endif - -/* Various types of scsi task mgmt commands. */ -enum task_mgmt_types { - TASK_MGMT_ABORT_TASK = 1, - TASK_MGMT_BUS_RESET, - TASK_MGMT_LUN_RESET, - TASK_MGMT_TARGET_RESET, -}; - -/* Various types of vdisk mgmt commands. */ -enum vdisk_mgmt_types { - VDISK_MGMT_ACQUIRE = 1, - VDISK_MGMT_RELEASE, -}; - -struct phys_info { - u64 pi_pfn; - u16 pi_off; - u16 pi_len; -} __packed; - -#define MIN_NUMSIGNALS 64 - -/* Structs with pragma pack. */ - -struct guest_phys_info { - u64 address; - u64 length; -} __packed; - -/* - * struct uisscsi_dest - * @channel: Bus number. - * @id: Target number. - * @lun: Logical unit number. - */ -struct uisscsi_dest { - u32 channel; - u32 id; - u32 lun; -} __packed; - -struct vhba_wwnn { - u32 wwnn1; - u32 wwnn2; -} __packed; - -/* - * struct vhba_config_max - * @max_channel: Maximum channel for devices attached to this bus. - * @max_id: Maximum SCSI ID for devices attached to bus. - * @max_lun: Maximum SCSI LUN for devices attached to bus. - * @cmd_per_lun: Maximum number of outstanding commands per LUN. - * @max_io_size: Maximum io size for devices attached to this bus. Max io size - * is often determined by the resource of the hba. - * e.g Max scatter gather list length * page size / sector size. - * - * WARNING: Values stored in this structure must contain maximum counts (not - * maximum values). - * - * 20 bytes - */ -struct vhba_config_max { - u32 max_channel; - u32 max_id; - u32 max_lun; - u32 cmd_per_lun; - u32 max_io_size; -} __packed; - -/* - * struct uiscmdrsp_scsi - * - * @handle: The handle to the cmd that was received. Send it back as - * is in the rsp packet. - * @cmnd: The cdb for the command. - * @bufflen: Length of data to be transferred out or in. - * @guest_phys_entries: Number of entries in scatter-gather list. - * @struct gpi_list: Physical address information for each fragment. - * @data_dir: Direction of the data, if any. - * @struct vdest: Identifies the virtual hba, id, channel, lun to which - * cmd was sent. - * @linuxstat: Original Linux status used by Linux vdisk. - * @scsistat: The scsi status. - * @addlstat: Non-scsi status. - * @sensebuf: Sense info in case cmd failed. sensebuf holds the - * sense_data struct. See sense_data struct for more - * details. - * @*vdisk: Pointer to the vdisk to clean up when IO completes. - * @no_disk_result: Used to return no disk inquiry result when - * no_disk_result is set to 1 - * scsi.scsistat is SAM_STAT_GOOD - * scsi.addlstat is 0 - * scsi.linuxstat is SAM_STAT_GOOD - * That is, there is NO error. - */ -struct uiscmdrsp_scsi { - u64 handle; - u8 cmnd[MAX_CMND_SIZE]; - u32 bufflen; - u16 guest_phys_entries; - struct guest_phys_info gpi_list[MAX_PHYS_INFO]; - u32 data_dir; - struct uisscsi_dest vdest; - /* Needed to queue the rsp back to cmd originator. */ - int linuxstat; - u8 scsistat; - u8 addlstat; -#define ADDL_SEL_TIMEOUT 4 - /* The following fields are need to determine the result of command. */ - u8 sensebuf[MAX_SENSE_SIZE]; - void *vdisk; - int no_disk_result; -} __packed; - -/* - * Defines to support sending correct inquiry result when no disk is - * configured. - * - * From SCSI SPC2 - - * - * If the target is not capable of supporting a device on this logical unit, the - * device server shall set this field to 7Fh (PERIPHERAL QUALIFIER set to 011b - * and PERIPHERAL DEVICE TYPE set to 1Fh). - * - * The device server is capable of supporting the specified peripheral device - * type on this logical unit. However, the physical device is not currently - * connected to this logical unit. - */ - -/* - * Peripheral qualifier of 0x3 - * Peripheral type of 0x1f - * Specifies no device but target present - */ -#define DEV_NOT_CAPABLE 0x7f -/* - * Peripheral qualifier of 0x1 - * Peripheral type of 0 - disk - * Specifies device capable, but not present - */ -#define DEV_DISK_CAPABLE_NOT_PRESENT 0x20 -/* HiSup = 1; shows support for report luns must be returned for lun 0. */ -#define DEV_HISUPPORT 0x10 - -/* - * Peripheral qualifier of 0x3 - * Peripheral type of 0x1f - * Specifies no device but target present - */ -#define DEV_NOT_CAPABLE 0x7f -/* - * Peripheral qualifier of 0x1 - * Peripheral type of 0 - disk - * Specifies device capable, but not present - */ -#define DEV_DISK_CAPABLE_NOT_PRESENT 0x20 -/* HiSup = 1; shows support for report luns must be returned for lun 0. */ -#define DEV_HISUPPORT 0x10 - -/* - * NOTE: Linux code assumes inquiry contains 36 bytes. Without checking length - * in buf[4] some Linux code accesses bytes beyond 5 to retrieve vendor, product - * and revision. Yikes! So let us always send back 36 bytes, the minimum for - * inquiry result. - */ -#define NO_DISK_INQUIRY_RESULT_LEN 36 -/* 5 bytes minimum for inquiry result */ -#define MIN_INQUIRY_RESULT_LEN 5 - -/* SCSI device version for no disk inquiry result */ -/* indicates SCSI SPC2 (SPC3 is 5) */ -#define SCSI_SPC2_VER 4 - -/* Struct and Defines to support sense information. */ - -/* - * The following struct is returned in sensebuf field in uiscmdrsp_scsi. It is - * initialized in exactly the manner that is recommended in Windows (hence the - * odd values). - * When set, these fields will have the following values: - * ErrorCode = 0x70 indicates current error - * Valid = 1 indicates sense info is valid - * SenseKey contains sense key as defined by SCSI specs. - * AdditionalSenseCode contains sense key as defined by SCSI specs. - * AdditionalSenseCodeQualifier contains qualifier to sense code as defined by - * scsi docs. - * AdditionalSenseLength contains will be sizeof(sense_data)-8=10. - */ -struct sense_data { - u8 errorcode:7; - u8 valid:1; - u8 segment_number; - u8 sense_key:4; - u8 reserved:1; - u8 incorrect_length:1; - u8 end_of_media:1; - u8 file_mark:1; - u8 information[4]; - u8 additional_sense_length; - u8 command_specific_information[4]; - u8 additional_sense_code; - u8 additional_sense_code_qualifier; - u8 fru_code; - u8 sense_key_specific[3]; -} __packed; - -/* - * struct net_pkt_xmt - * @len: Full length of data in the packet. - * @num_frags: Number of fragments in frags containing data. - * @struct phys_info frags: Physical page information. - * @ethhdr: The ethernet header. - * @struct lincsum: These are needed for csum at uisnic end. - * @valid: 1 = struct is valid - else ignore. - * @hrawoffv: 1 = hwrafoff is valid. - * @nhrawoffv: 1 = nhwrafoff is valid. - * @protocol: Specifies packet protocol. - * @csum: Value used to set skb->csum at IOPart. - * @hrawoff: Value used to set skb->h.raw at IOPart. hrawoff points to - * the start of the TRANSPORT LAYER HEADER. - * @nhrawoff: Value used to set skb->nh.raw at IOPart. nhrawoff points to - * the start of the NETWORK LAYER HEADER. - * - * NOTE: - * The full packet is described in frags but the ethernet header is separately - * kept in ethhdr so that uisnic doesn't have "MAP" the guest memory to get to - * the header. uisnic needs ethhdr to determine how to route the packet. - */ -struct net_pkt_xmt { - int len; - int num_frags; - struct phys_info frags[MAX_PHYS_INFO]; - char ethhdr[ETH_HLEN]; - struct { - u8 valid; - u8 hrawoffv; - u8 nhrawoffv; - __be16 protocol; - __wsum csum; - u32 hrawoff; - u32 nhrawoff; - } lincsum; -} __packed; - -struct net_pkt_xmtdone { - /* Result of NET_XMIT */ - u32 xmt_done_result; -} __packed; - -/* - * RCVPOST_BUF_SIZE must be at most page_size(4096) - cache_line_size (64) The - * reason is because dev_skb_alloc which is used to generate RCV_POST skbs in - * visornic requires that there is "overhead" in the buffer, and pads 16 bytes. - * Use 1 full cache line size for "overhead" so that transfers are optimized. - * IOVM requires that a buffer be represented by 1 phys_info structure - * which can only cover page_size. - */ -#define RCVPOST_BUF_SIZE 4032 -#define MAX_NET_RCV_CHAIN \ - ((VISOR_ETH_MAX_MTU + ETH_HLEN + RCVPOST_BUF_SIZE - 1) \ - / RCVPOST_BUF_SIZE) - -/* rcv buf size must be large enough to include ethernet data len + ethernet - * header len - we are choosing 2K because it is guaranteed to be describable. - */ -struct net_pkt_rcvpost { - /* Physical page information for the single fragment 2K rcv buf */ - struct phys_info frag; - /* - * Ensures that receive posts are returned to the adapter which we sent - * them from originally. - */ - u64 unique_num; - -} __packed; - -/* - * struct net_pkt_rcv - * @rcv_done_len: Length of the received data. - * @numrcvbufs: Contains the incoming data. Guest side MUST chain these - * together. - * @*rcvbuf: List of chained rcvbufa. Each entry is a receive buffer - * provided by NET_RCV_POST. NOTE: First rcvbuf in the - * chain will also be provided in net.buf. - * @unique_num: - * @rcvs_dropped_delta: - * - * The number of rcvbuf that can be chained is based on max mtu and size of each - * rcvbuf. - */ -struct net_pkt_rcv { - u32 rcv_done_len; - u8 numrcvbufs; - void *rcvbuf[MAX_NET_RCV_CHAIN]; - u64 unique_num; - u32 rcvs_dropped_delta; -} __packed; - -struct net_pkt_enbdis { - void *context; - /* 1 = enable, 0 = disable */ - u16 enable; -} __packed; - -struct net_pkt_macaddr { - void *context; - /* 6 bytes */ - u8 macaddr[MAX_MACADDR_LEN]; -} __packed; - -/* - * struct uiscmdrsp_net - cmd rsp packet used for VNIC network traffic. - * @enum type: - * @*buf: - * @union: - * @struct xmt: Used for NET_XMIT. - * @struct xmtdone: Used for NET_XMIT_DONE. - * @struct rcvpost: Used for NET_RCV_POST. - * @struct rcv: Used for NET_RCV. - * @struct enbdis: Used for NET_RCV_ENBDIS, NET_RCV_ENBDIS_ACK, - * NET_RCV_PROMSIC, and NET_CONNECT_STATUS. - * @struct macaddr: - */ -struct uiscmdrsp_net { - enum net_types type; - void *buf; - union { - struct net_pkt_xmt xmt; - struct net_pkt_xmtdone xmtdone; - struct net_pkt_rcvpost rcvpost; - struct net_pkt_rcv rcv; - struct net_pkt_enbdis enbdis; - struct net_pkt_macaddr macaddr; - }; -} __packed; - -/* - * struct uiscmdrsp_scsitaskmgmt - * @enum tasktype: The type of task. - * @struct vdest: The vdisk for which this task mgmt is generated. - * @handle: This is a handle that the guest has saved off for its - * own use. The handle value is preserved by iopart and - * returned as in task mgmt rsp. - * @notify_handle: For Linux guests, this is a pointer to wait_queue_head - * that a thread is waiting on to see if the taskmgmt - * command has completed. When the rsp is received by - * guest, the thread receiving the response uses this to - * notify the thread waiting for taskmgmt command - * completion. It's value is preserved by iopart and - * returned as in the task mgmt rsp. - * @notifyresult_handle: This is a handle to the location in the guest where - * the result of the taskmgmt command (result field) is - * saved to when the response is handled. It's value is - * preserved by iopart and returned as is in the task mgmt - * rsp. - * @result: Result of taskmgmt command - set by IOPart. - */ -struct uiscmdrsp_scsitaskmgmt { - enum task_mgmt_types tasktype; - struct uisscsi_dest vdest; - u64 handle; - u64 notify_handle; - u64 notifyresult_handle; - char result; - -#define TASK_MGMT_FAILED 0 -} __packed; - -/* - * struct uiscmdrsp_disknotify - Used by uissd to send disk add/remove - * notifications to Guest. - * @add: 0-remove, 1-add. - * @*v_hba: Channel info to route msg. - * @channel: SCSI Path of Disk to added or removed. - * @id: SCSI Path of Disk to added or removed. - * @lun: SCSI Path of Disk to added or removed. - * - * Note that the vHba pointer is not used by the Client/Guest side. - */ -struct uiscmdrsp_disknotify { - u8 add; - void *v_hba; - u32 channel, id, lun; -} __packed; - -/* Keeping cmd and rsp info in one structure for now cmd rsp packet for SCSI */ -struct uiscmdrsp { - char cmdtype; - /* Describes what type of information is in the struct */ -#define CMD_SCSI_TYPE 1 -#define CMD_NET_TYPE 2 -#define CMD_SCSITASKMGMT_TYPE 3 -#define CMD_NOTIFYGUEST_TYPE 4 - union { - struct uiscmdrsp_scsi scsi; - struct uiscmdrsp_net net; - struct uiscmdrsp_scsitaskmgmt scsitaskmgmt; - struct uiscmdrsp_disknotify disknotify; - }; - /* Send the response when the cmd is done (scsi and scsittaskmgmt). */ - void *private_data; - /* General Purpose Queue Link */ - struct uiscmdrsp *next; - /* Pointer to the nextactive commands */ - struct uiscmdrsp *activeQ_next; - /* Pointer to the prevactive commands */ - struct uiscmdrsp *activeQ_prev; -} __packed; - -/* total = 28 bytes */ -struct iochannel_vhba { - /* 8 bytes */ - struct vhba_wwnn wwnn; - /* 20 bytes */ - struct vhba_config_max max; -} __packed; - -struct iochannel_vnic { - /* 6 bytes */ - u8 macaddr[6]; - /* 4 bytes */ - u32 num_rcv_bufs; - /* 4 bytes */ - u32 mtu; - /* 16 bytes */ - guid_t zone_guid; -} __packed; - -/* - * This is just the header of the IO channel. It is assumed that directly after - * this header there is a large region of memory which contains the command and - * response queues as specified in cmd_q and rsp_q SIGNAL_QUEUE_HEADERS. - */ -struct visor_io_channel { - struct channel_header channel_header; - struct signal_queue_header cmd_q; - struct signal_queue_header rsp_q; - union { - struct iochannel_vhba vhba; - struct iochannel_vnic vnic; - } __packed; - -#define MAX_CLIENTSTRING_LEN 1024 - /* client_string is NULL termimated so holds max-1 bytes */ - u8 client_string[MAX_CLIENTSTRING_LEN]; -} __packed; - -/* INLINE functions for initializing and accessing I/O data channels. */ -#define SIZEOF_CMDRSP (64 * DIV_ROUND_UP(sizeof(struct uiscmdrsp), 64)) - -/* Use 4K page sizes when passing page info between Guest and IOPartition. */ -#define PI_PAGE_SIZE 0x1000 -#define PI_PAGE_MASK 0x0FFF - -/* __IOCHANNEL_H__ */ -#endif diff --git a/drivers/staging/unisys/visorhba/Kconfig b/drivers/staging/unisys/visorhba/Kconfig deleted file mode 100644 index ed59ac11c322..000000000000 --- a/drivers/staging/unisys/visorhba/Kconfig +++ /dev/null @@ -1,15 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# Unisys visorhba configuration -# - -config UNISYS_VISORHBA - tristate "Unisys visorhba driver" - depends on UNISYSSPAR && UNISYS_VISORBUS && SCSI - help - The Unisys visorhba driver provides support for s-Par HBA - devices exposed on the s-Par visorbus. When a message is sent - to visorbus to create a HBA device, the probe function of - visorhba is called to create the scsi device. - If you say Y here, you will enable the Unisys visorhba driver. - diff --git a/drivers/staging/unisys/visorhba/Makefile b/drivers/staging/unisys/visorhba/Makefile deleted file mode 100644 index b613a7dcdae9..000000000000 --- a/drivers/staging/unisys/visorhba/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# Makefile for Unisys channel -# - -obj-$(CONFIG_UNISYS_VISORHBA) += visorhba.o - -visorhba-y := visorhba_main.o - -ccflags-y += -I $(srctree)/$(src)/../include diff --git a/drivers/staging/unisys/visorhba/visorhba_main.c b/drivers/staging/unisys/visorhba/visorhba_main.c deleted file mode 100644 index 48aa18f8b984..000000000000 --- a/drivers/staging/unisys/visorhba/visorhba_main.c +++ /dev/null @@ -1,1142 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * Copyright (c) 2012 - 2015 UNISYS CORPORATION - * All rights reserved. - */ - -#include <linux/debugfs.h> -#include <linux/kthread.h> -#include <linux/module.h> -#include <linux/seq_file.h> -#include <linux/visorbus.h> -#include <linux/xarray.h> -#include <scsi/scsi.h> -#include <scsi/scsi_host.h> -#include <scsi/scsi_cmnd.h> -#include <scsi/scsi_device.h> - -#include "iochannel.h" - -/* The Send and Receive Buffers of the IO Queue may both be full */ - -#define IOS_ERROR_THRESHOLD 1000 -#define MAX_PENDING_REQUESTS (MIN_NUMSIGNALS * 2) -#define VISORHBA_ERROR_COUNT 30 - -static struct dentry *visorhba_debugfs_dir; - -/* GUIDS for HBA channel type supported by this driver */ -static struct visor_channeltype_descriptor visorhba_channel_types[] = { - /* Note that the only channel type we expect to be reported by the - * bus driver is the VISOR_VHBA channel. - */ - { VISOR_VHBA_CHANNEL_GUID, "sparvhba", sizeof(struct channel_header), - VISOR_VHBA_CHANNEL_VERSIONID }, - {} -}; - -MODULE_DEVICE_TABLE(visorbus, visorhba_channel_types); -MODULE_ALIAS("visorbus:" VISOR_VHBA_CHANNEL_GUID_STR); - -struct visordisk_info { - struct scsi_device *sdev; - u32 valid; - atomic_t ios_threshold; - atomic_t error_count; - struct visordisk_info *next; -}; - -struct scsipending { - struct uiscmdrsp cmdrsp; - /* The Data being tracked */ - void *sent; - /* Type of pointer that is being stored */ - char cmdtype; -}; - -/* Each scsi_host has a host_data area that contains this struct. */ -struct visorhba_devdata { - struct Scsi_Host *scsihost; - struct visor_device *dev; - struct list_head dev_info_list; - /* Tracks the requests that have been forwarded to - * the IOVM and haven't returned yet - */ - struct scsipending pending[MAX_PENDING_REQUESTS]; - /* Start search for next pending free slot here */ - unsigned int nextinsert; - /* lock to protect data in devdata */ - spinlock_t privlock; - bool serverdown; - bool serverchangingstate; - unsigned long long acquire_failed_cnt; - unsigned long long interrupts_rcvd; - unsigned long long interrupts_notme; - unsigned long long interrupts_disabled; - u64 __iomem *flags_addr; - struct visordisk_info head; - unsigned int max_buff_len; - int devnum; - struct uiscmdrsp *cmdrsp; - /* - * allows us to pass int handles back-and-forth between us and - * iovm, instead of raw pointers - */ - struct xarray xa; - struct dentry *debugfs_dir; - struct dentry *debugfs_info; -}; - -struct visorhba_devices_open { - struct visorhba_devdata *devdata; -}; - -/* - * add_scsipending_entry - Save off io command that is pending in - * Service Partition - * @devdata: Pointer to devdata - * @cmdtype: Specifies the type of command pending - * @new: The command to be saved - * - * Saves off the io command that is being handled by the Service - * Partition so that it can be handled when it completes. If new is - * NULL it is assumed the entry refers only to the cmdrsp. - * - * Return: Insert_location where entry was added on success, - * -EBUSY if it can't - */ -static int add_scsipending_entry(struct visorhba_devdata *devdata, - char cmdtype, void *new) -{ - unsigned long flags; - struct scsipending *entry; - int insert_location; - - spin_lock_irqsave(&devdata->privlock, flags); - insert_location = devdata->nextinsert; - while (devdata->pending[insert_location].sent) { - insert_location = (insert_location + 1) % MAX_PENDING_REQUESTS; - if (insert_location == (int)devdata->nextinsert) { - spin_unlock_irqrestore(&devdata->privlock, flags); - return -EBUSY; - } - } - - entry = &devdata->pending[insert_location]; - memset(&entry->cmdrsp, 0, sizeof(entry->cmdrsp)); - entry->cmdtype = cmdtype; - if (new) - entry->sent = new; - /* wants to send cmdrsp */ - else - entry->sent = &entry->cmdrsp; - devdata->nextinsert = (insert_location + 1) % MAX_PENDING_REQUESTS; - spin_unlock_irqrestore(&devdata->privlock, flags); - - return insert_location; -} - -/* - * del_scsipending_ent - Removes an entry from the pending array - * @devdata: Device holding the pending array - * @del: Entry to remove - * - * Removes the entry pointed at by del and returns it. - * - * Return: The scsipending entry pointed to on success, NULL on failure - */ -static void *del_scsipending_ent(struct visorhba_devdata *devdata, int del) -{ - unsigned long flags; - void *sent; - - if (del >= MAX_PENDING_REQUESTS) - return NULL; - - spin_lock_irqsave(&devdata->privlock, flags); - sent = devdata->pending[del].sent; - devdata->pending[del].cmdtype = 0; - devdata->pending[del].sent = NULL; - spin_unlock_irqrestore(&devdata->privlock, flags); - - return sent; -} - -/* - * get_scsipending_cmdrsp - Return the cmdrsp stored in a pending entry - * @ddata: Device holding the pending array - * @ent: Entry that stores the cmdrsp - * - * Each scsipending entry has a cmdrsp in it. The cmdrsp is only valid - * if the "sent" field is not NULL. - * - * Return: A pointer to the cmdrsp, NULL on failure - */ -static struct uiscmdrsp *get_scsipending_cmdrsp(struct visorhba_devdata *ddata, - int ent) -{ - if (ddata->pending[ent].sent) - return &ddata->pending[ent].cmdrsp; - - return NULL; -} - -/* - * setup_scsitaskmgmt_handles - Stash the necessary handles so that the - * completion processing logic for a taskmgmt - * cmd will be able to find who to wake up - * and where to stash the result - * @xa: The data object maintaining the pointer<-->int mappings - * @cmdrsp: Response from the IOVM - * @event: The event handle to associate with an id - * @result: The location to place the result of the event handle into - */ -static int setup_scsitaskmgmt_handles(struct xarray *xa, struct uiscmdrsp *cmdrsp, - wait_queue_head_t *event, int *result) -{ - int ret; - u32 id; - - /* specify the event that has to be triggered when this cmd is complete */ - ret = xa_alloc_irq(xa, &id, event, xa_limit_32b, GFP_KERNEL); - if (ret) - return ret; - cmdrsp->scsitaskmgmt.notify_handle = id; - ret = xa_alloc_irq(xa, &id, result, xa_limit_32b, GFP_KERNEL); - if (ret) { - xa_erase_irq(xa, cmdrsp->scsitaskmgmt.notify_handle); - return ret; - } - cmdrsp->scsitaskmgmt.notifyresult_handle = id; - - return 0; -} - -/* - * cleanup_scsitaskmgmt_handles - Forget handles created by - * setup_scsitaskmgmt_handles() - * @xa: The data object maintaining the pointer<-->int mappings - * @cmdrsp: Response from the IOVM - */ -static void cleanup_scsitaskmgmt_handles(struct xarray *xa, - struct uiscmdrsp *cmdrsp) -{ - xa_erase_irq(xa, cmdrsp->scsitaskmgmt.notify_handle); - xa_erase_irq(xa, cmdrsp->scsitaskmgmt.notifyresult_handle); -} - -/* - * forward_taskmgmt_command - Send taskmegmt command to the Service - * Partition - * @tasktype: Type of taskmgmt command - * @scsidev: Scsidev that issued command - * - * Create a cmdrsp packet and send it to the Service Partition - * that will service this request. - * - * Return: Int representing whether command was queued successfully or not - */ -static int forward_taskmgmt_command(enum task_mgmt_types tasktype, - struct scsi_device *scsidev) -{ - struct uiscmdrsp *cmdrsp; - struct visorhba_devdata *devdata = - (struct visorhba_devdata *)scsidev->host->hostdata; - int notifyresult = 0xffff; - wait_queue_head_t notifyevent; - int scsicmd_id; - int ret; - - if (devdata->serverdown || devdata->serverchangingstate) - return FAILED; - - scsicmd_id = add_scsipending_entry(devdata, CMD_SCSITASKMGMT_TYPE, - NULL); - if (scsicmd_id < 0) - return FAILED; - - cmdrsp = get_scsipending_cmdrsp(devdata, scsicmd_id); - - init_waitqueue_head(¬ifyevent); - - /* issue TASK_MGMT_ABORT_TASK */ - cmdrsp->cmdtype = CMD_SCSITASKMGMT_TYPE; - - ret = setup_scsitaskmgmt_handles(&devdata->xa, cmdrsp, - ¬ifyevent, ¬ifyresult); - if (ret) { - dev_dbg(&scsidev->sdev_gendev, - "visorhba: setup_scsitaskmgmt_handles returned %d\n", ret); - return FAILED; - } - - /* save destination */ - cmdrsp->scsitaskmgmt.tasktype = tasktype; - cmdrsp->scsitaskmgmt.vdest.channel = scsidev->channel; - cmdrsp->scsitaskmgmt.vdest.id = scsidev->id; - cmdrsp->scsitaskmgmt.vdest.lun = scsidev->lun; - cmdrsp->scsitaskmgmt.handle = scsicmd_id; - - dev_dbg(&scsidev->sdev_gendev, - "visorhba: initiating type=%d taskmgmt command\n", tasktype); - if (visorchannel_signalinsert(devdata->dev->visorchannel, - IOCHAN_TO_IOPART, - cmdrsp)) - goto err_del_scsipending_ent; - - /* It can take the Service Partition up to 35 seconds to complete - * an IO in some cases, so wait 45 seconds and error out - */ - if (!wait_event_timeout(notifyevent, notifyresult != 0xffff, - msecs_to_jiffies(45000))) - goto err_del_scsipending_ent; - - dev_dbg(&scsidev->sdev_gendev, - "visorhba: taskmgmt type=%d success; result=0x%x\n", - tasktype, notifyresult); - cleanup_scsitaskmgmt_handles(&devdata->xa, cmdrsp); - return SUCCESS; - -err_del_scsipending_ent: - dev_dbg(&scsidev->sdev_gendev, - "visorhba: taskmgmt type=%d not executed\n", tasktype); - del_scsipending_ent(devdata, scsicmd_id); - cleanup_scsitaskmgmt_handles(&devdata->xa, cmdrsp); - return FAILED; -} - -/* - * visorhba_abort_handler - Send TASK_MGMT_ABORT_TASK - * @scsicmd: The scsicmd that needs aborted - * - * Return: SUCCESS if inserted, FAILED otherwise - */ -static int visorhba_abort_handler(struct scsi_cmnd *scsicmd) -{ - /* issue TASK_MGMT_ABORT_TASK */ - struct scsi_device *scsidev; - struct visordisk_info *vdisk; - int rtn; - - scsidev = scsicmd->device; - vdisk = scsidev->hostdata; - if (atomic_read(&vdisk->error_count) < VISORHBA_ERROR_COUNT) - atomic_inc(&vdisk->error_count); - else - atomic_set(&vdisk->ios_threshold, IOS_ERROR_THRESHOLD); - rtn = forward_taskmgmt_command(TASK_MGMT_ABORT_TASK, scsidev); - if (rtn == SUCCESS) { - scsicmd->result = DID_ABORT << 16; - scsi_done(scsicmd); - } - return rtn; -} - -/* - * visorhba_device_reset_handler - Send TASK_MGMT_LUN_RESET - * @scsicmd: The scsicmd that needs aborted - * - * Return: SUCCESS if inserted, FAILED otherwise - */ -static int visorhba_device_reset_handler(struct scsi_cmnd *scsicmd) -{ - /* issue TASK_MGMT_LUN_RESET */ - struct scsi_device *scsidev; - struct visordisk_info *vdisk; - int rtn; - - scsidev = scsicmd->device; - vdisk = scsidev->hostdata; - if (atomic_read(&vdisk->error_count) < VISORHBA_ERROR_COUNT) - atomic_inc(&vdisk->error_count); - else - atomic_set(&vdisk->ios_threshold, IOS_ERROR_THRESHOLD); - rtn = forward_taskmgmt_command(TASK_MGMT_LUN_RESET, scsidev); - if (rtn == SUCCESS) { - scsicmd->result = DID_RESET << 16; - scsi_done(scsicmd); - } - return rtn; -} - -/* - * visorhba_bus_reset_handler - Send TASK_MGMT_TARGET_RESET for each - * target on the bus - * @scsicmd: The scsicmd that needs aborted - * - * Return: SUCCESS if inserted, FAILED otherwise - */ -static int visorhba_bus_reset_handler(struct scsi_cmnd *scsicmd) -{ - struct scsi_device *scsidev; - struct visordisk_info *vdisk; - int rtn; - - scsidev = scsicmd->device; - shost_for_each_device(scsidev, scsidev->host) { - vdisk = scsidev->hostdata; - if (atomic_read(&vdisk->error_count) < VISORHBA_ERROR_COUNT) - atomic_inc(&vdisk->error_count); - else - atomic_set(&vdisk->ios_threshold, IOS_ERROR_THRESHOLD); - } - rtn = forward_taskmgmt_command(TASK_MGMT_BUS_RESET, scsidev); - if (rtn == SUCCESS) { - scsicmd->result = DID_RESET << 16; - scsi_done(scsicmd); - } - return rtn; -} - -/* - * visorhba_host_reset_handler - Not supported - * @scsicmd: The scsicmd that needs to be aborted - * - * Return: Not supported, return SUCCESS - */ -static int visorhba_host_reset_handler(struct scsi_cmnd *scsicmd) -{ - /* issue TASK_MGMT_TARGET_RESET for each target on each bus for host */ - return SUCCESS; -} - -/* - * visorhba_get_info - Get information about SCSI device - * @shp: Scsi host that is requesting information - * - * Return: String with visorhba information - */ -static const char *visorhba_get_info(struct Scsi_Host *shp) -{ - /* Return version string */ - return "visorhba"; -} - -/* - * dma_data_dir_linux_to_spar - convert dma_data_direction value to - * Unisys-specific equivalent - * @d: dma direction value to convert - * - * Returns the Unisys-specific dma direction value corresponding to @d - */ -static u32 dma_data_dir_linux_to_spar(enum dma_data_direction d) -{ - switch (d) { - case DMA_BIDIRECTIONAL: - return UIS_DMA_BIDIRECTIONAL; - case DMA_TO_DEVICE: - return UIS_DMA_TO_DEVICE; - case DMA_FROM_DEVICE: - return UIS_DMA_FROM_DEVICE; - case DMA_NONE: - return UIS_DMA_NONE; - default: - return UIS_DMA_NONE; - } -} - -/* - * visorhba_queue_command_lck - Queues command to the Service Partition - * @scsicmd: Command to be queued - * @vsiorhba_cmnd_done: Done command to call when scsicmd is returned - * - * Queues to scsicmd to the ServicePartition after converting it to a - * uiscmdrsp structure. - * - * Return: 0 if successfully queued to the Service Partition, otherwise - * error code - */ -static int visorhba_queue_command_lck(struct scsi_cmnd *scsicmd) -{ - void (*visorhba_cmnd_done)(struct scsi_cmnd *) = scsi_done; - struct uiscmdrsp *cmdrsp; - struct scsi_device *scsidev = scsicmd->device; - int insert_location; - unsigned char *cdb = scsicmd->cmnd; - struct Scsi_Host *scsihost = scsidev->host; - unsigned int i; - struct visorhba_devdata *devdata = - (struct visorhba_devdata *)scsihost->hostdata; - struct scatterlist *sg = NULL; - struct scatterlist *sglist = NULL; - - if (devdata->serverdown || devdata->serverchangingstate) - return SCSI_MLQUEUE_DEVICE_BUSY; - - insert_location = add_scsipending_entry(devdata, CMD_SCSI_TYPE, - (void *)scsicmd); - if (insert_location < 0) - return SCSI_MLQUEUE_DEVICE_BUSY; - - cmdrsp = get_scsipending_cmdrsp(devdata, insert_location); - cmdrsp->cmdtype = CMD_SCSI_TYPE; - /* save the pending insertion location. Deletion from pending - * will return the scsicmd pointer for completion - */ - cmdrsp->scsi.handle = insert_location; - - WARN_ON_ONCE(visorhba_cmnd_done != scsi_done); - /* save destination */ - cmdrsp->scsi.vdest.channel = scsidev->channel; - cmdrsp->scsi.vdest.id = scsidev->id; - cmdrsp->scsi.vdest.lun = scsidev->lun; - /* save datadir */ - cmdrsp->scsi.data_dir = - dma_data_dir_linux_to_spar(scsicmd->sc_data_direction); - memcpy(cmdrsp->scsi.cmnd, cdb, MAX_CMND_SIZE); - cmdrsp->scsi.bufflen = scsi_bufflen(scsicmd); - - /* keep track of the max buffer length so far. */ - if (cmdrsp->scsi.bufflen > devdata->max_buff_len) - devdata->max_buff_len = cmdrsp->scsi.bufflen; - - if (scsi_sg_count(scsicmd) > MAX_PHYS_INFO) - goto err_del_scsipending_ent; - - /* convert buffer to phys information */ - /* buffer is scatterlist - copy it out */ - sglist = scsi_sglist(scsicmd); - - for_each_sg(sglist, sg, scsi_sg_count(scsicmd), i) { - cmdrsp->scsi.gpi_list[i].address = sg_phys(sg); - cmdrsp->scsi.gpi_list[i].length = sg->length; - } - cmdrsp->scsi.guest_phys_entries = scsi_sg_count(scsicmd); - - if (visorchannel_signalinsert(devdata->dev->visorchannel, - IOCHAN_TO_IOPART, - cmdrsp)) - /* queue must be full and we aren't going to wait */ - goto err_del_scsipending_ent; - - return 0; - -err_del_scsipending_ent: - del_scsipending_ent(devdata, insert_location); - return SCSI_MLQUEUE_DEVICE_BUSY; -} - -#ifdef DEF_SCSI_QCMD -static DEF_SCSI_QCMD(visorhba_queue_command) -#else -#define visorhba_queue_command visorhba_queue_command_lck -#endif - -/* - * visorhba_slave_alloc - Called when new disk is discovered - * @scsidev: New disk - * - * Create a new visordisk_info structure and add it to our - * list of vdisks. - * - * Return: 0 on success, -ENOMEM on failure. - */ -static int visorhba_slave_alloc(struct scsi_device *scsidev) -{ - /* this is called by the midlayer before scan for new devices -- - * LLD can alloc any struct & do init if needed. - */ - struct visordisk_info *vdisk; - struct visorhba_devdata *devdata; - struct Scsi_Host *scsihost = (struct Scsi_Host *)scsidev->host; - - /* already allocated return success */ - if (scsidev->hostdata) - return 0; - - /* even though we errored, treat as success */ - devdata = (struct visorhba_devdata *)scsihost->hostdata; - if (!devdata) - return 0; - - vdisk = kzalloc(sizeof(*vdisk), GFP_ATOMIC); - if (!vdisk) - return -ENOMEM; - - vdisk->sdev = scsidev; - scsidev->hostdata = vdisk; - return 0; -} - -/* - * visorhba_slave_destroy - Disk is going away, clean up resources. - * @scsidev: Scsi device to destroy - */ -static void visorhba_slave_destroy(struct scsi_device *scsidev) -{ - /* midlevel calls this after device has been quiesced and - * before it is to be deleted. - */ - struct visordisk_info *vdisk; - - vdisk = scsidev->hostdata; - scsidev->hostdata = NULL; - kfree(vdisk); -} - -static struct scsi_host_template visorhba_driver_template = { - .name = "Unisys Visor HBA", - .info = visorhba_get_info, - .queuecommand = visorhba_queue_command, - .eh_abort_handler = visorhba_abort_handler, - .eh_device_reset_handler = visorhba_device_reset_handler, - .eh_bus_reset_handler = visorhba_bus_reset_handler, - .eh_host_reset_handler = visorhba_host_reset_handler, -#define visorhba_MAX_CMNDS 128 - .can_queue = visorhba_MAX_CMNDS, - .sg_tablesize = 64, - .this_id = -1, - .slave_alloc = visorhba_slave_alloc, - .slave_destroy = visorhba_slave_destroy, -}; - -/* - * info_debugfs_show - Debugfs interface to dump visorhba states - * @seq: The sequence file to write information to - * @v: Unused, but needed for use with seq file single_open invocation - * - * Presents a file in the debugfs tree named: /visorhba/vbus<x>:dev<y>/info. - * - * Return: SUCCESS - */ -static int info_debugfs_show(struct seq_file *seq, void *v) -{ - struct visorhba_devdata *devdata = seq->private; - - seq_printf(seq, "max_buff_len = %u\n", devdata->max_buff_len); - seq_printf(seq, "interrupts_rcvd = %llu\n", devdata->interrupts_rcvd); - seq_printf(seq, "interrupts_disabled = %llu\n", - devdata->interrupts_disabled); - seq_printf(seq, "interrupts_notme = %llu\n", - devdata->interrupts_notme); - seq_printf(seq, "flags_addr = %p\n", devdata->flags_addr); - if (devdata->flags_addr) { - u64 phys_flags_addr = - virt_to_phys((__force void *)devdata->flags_addr); - seq_printf(seq, "phys_flags_addr = 0x%016llx\n", - phys_flags_addr); - seq_printf(seq, "FeatureFlags = %llu\n", - (u64)readq(devdata->flags_addr)); - } - seq_printf(seq, "acquire_failed_cnt = %llu\n", - devdata->acquire_failed_cnt); - - return 0; -} -DEFINE_SHOW_ATTRIBUTE(info_debugfs); - -/* - * complete_taskmgmt_command - Complete task management - * @idrtable: The data object maintaining the pointer<-->int mappings - * @cmdrsp: Response from the IOVM - * @result: The result of the task management command - * - * Service Partition returned the result of the task management - * command. Wake up anyone waiting for it. - */ -static void complete_taskmgmt_command(struct xarray *xa, - struct uiscmdrsp *cmdrsp, int result) -{ - wait_queue_head_t *wq = - xa_load(xa, cmdrsp->scsitaskmgmt.notify_handle); - int *scsi_result_ptr = - xa_load(xa, cmdrsp->scsitaskmgmt.notifyresult_handle); - if (unlikely(!(wq && scsi_result_ptr))) { - pr_err("visorhba: no completion context; cmd will time out\n"); - return; - } - - /* copy the result of the taskmgmt and - * wake up the error handler that is waiting for this - */ - pr_debug("visorhba: notifying initiator with result=0x%x\n", result); - *scsi_result_ptr = result; - wake_up_all(wq); -} - -/* - * visorhba_serverdown_complete - Called when we are done cleaning up - * from serverdown - * @devdata: Visorhba instance on which to complete serverdown - * - * Called when we are done cleanning up from serverdown, stop processing - * queue, fail pending IOs. - */ -static void visorhba_serverdown_complete(struct visorhba_devdata *devdata) -{ - int i; - struct scsipending *pendingdel = NULL; - struct scsi_cmnd *scsicmd = NULL; - struct uiscmdrsp *cmdrsp; - unsigned long flags; - - /* Stop using the IOVM response queue (queue should be drained - * by the end) - */ - visorbus_disable_channel_interrupts(devdata->dev); - - /* Fail commands that weren't completed */ - spin_lock_irqsave(&devdata->privlock, flags); - for (i = 0; i < MAX_PENDING_REQUESTS; i++) { - pendingdel = &devdata->pending[i]; - switch (pendingdel->cmdtype) { - case CMD_SCSI_TYPE: - scsicmd = pendingdel->sent; - scsicmd->result = DID_RESET << 16; - scsi_done(scsicmd); - break; - case CMD_SCSITASKMGMT_TYPE: - cmdrsp = pendingdel->sent; - complete_taskmgmt_command(&devdata->xa, cmdrsp, - TASK_MGMT_FAILED); - break; - default: - break; - } - pendingdel->cmdtype = 0; - pendingdel->sent = NULL; - } - spin_unlock_irqrestore(&devdata->privlock, flags); - - devdata->serverdown = true; - devdata->serverchangingstate = false; -} - -/* - * visorhba_serverdown - Got notified that the IOVM is down - * @devdata: Visorhba that is being serviced by downed IOVM - * - * Something happened to the IOVM, return immediately and - * schedule cleanup work. - * - * Return: 0 on success, -EINVAL on failure - */ -static int visorhba_serverdown(struct visorhba_devdata *devdata) -{ - if (!devdata->serverdown && !devdata->serverchangingstate) { - devdata->serverchangingstate = true; - visorhba_serverdown_complete(devdata); - } else if (devdata->serverchangingstate) { - return -EINVAL; - } - return 0; -} - -/* - * do_scsi_linuxstat - Scsi command returned linuxstat - * @cmdrsp: Response from IOVM - * @scsicmd: Command issued - * - * Don't log errors for disk-not-present inquiries. - */ -static void do_scsi_linuxstat(struct uiscmdrsp *cmdrsp, - struct scsi_cmnd *scsicmd) -{ - struct visordisk_info *vdisk; - struct scsi_device *scsidev; - - scsidev = scsicmd->device; - memcpy(scsicmd->sense_buffer, cmdrsp->scsi.sensebuf, MAX_SENSE_SIZE); - - /* Do not log errors for disk-not-present inquiries */ - if (cmdrsp->scsi.cmnd[0] == INQUIRY && - (host_byte(cmdrsp->scsi.linuxstat) == DID_NO_CONNECT) && - cmdrsp->scsi.addlstat == ADDL_SEL_TIMEOUT) - return; - /* Okay see what our error_count is here.... */ - vdisk = scsidev->hostdata; - if (atomic_read(&vdisk->error_count) < VISORHBA_ERROR_COUNT) { - atomic_inc(&vdisk->error_count); - atomic_set(&vdisk->ios_threshold, IOS_ERROR_THRESHOLD); - } -} - -static int set_no_disk_inquiry_result(unsigned char *buf, size_t len, - bool is_lun0) -{ - if (len < NO_DISK_INQUIRY_RESULT_LEN) - return -EINVAL; - memset(buf, 0, NO_DISK_INQUIRY_RESULT_LEN); - buf[2] = SCSI_SPC2_VER; - if (is_lun0) { - buf[0] = DEV_DISK_CAPABLE_NOT_PRESENT; - buf[3] = DEV_HISUPPORT; - } else { - buf[0] = DEV_NOT_CAPABLE; - } - buf[4] = NO_DISK_INQUIRY_RESULT_LEN - 5; - strncpy(buf + 8, "DELLPSEUDO DEVICE .", NO_DISK_INQUIRY_RESULT_LEN - 8); - return 0; -} - -/* - * do_scsi_nolinuxstat - Scsi command didn't have linuxstat - * @cmdrsp: Response from IOVM - * @scsicmd: Command issued - * - * Handle response when no linuxstat was returned. - */ -static void do_scsi_nolinuxstat(struct uiscmdrsp *cmdrsp, - struct scsi_cmnd *scsicmd) -{ - struct scsi_device *scsidev; - unsigned char *buf; - struct scatterlist *sg; - unsigned int i; - char *this_page; - char *this_page_orig; - int bufind = 0; - struct visordisk_info *vdisk; - - scsidev = scsicmd->device; - if (cmdrsp->scsi.cmnd[0] == INQUIRY && - cmdrsp->scsi.bufflen >= MIN_INQUIRY_RESULT_LEN) { - if (cmdrsp->scsi.no_disk_result == 0) - return; - - buf = kzalloc(36, GFP_KERNEL); - if (!buf) - return; - - /* Linux scsi code wants a device at Lun 0 - * to issue report luns, but we don't want - * a disk there so we'll present a processor - * there. - */ - set_no_disk_inquiry_result(buf, (size_t)cmdrsp->scsi.bufflen, - scsidev->lun == 0); - - if (scsi_sg_count(scsicmd) == 0) { - memcpy(scsi_sglist(scsicmd), buf, - cmdrsp->scsi.bufflen); - kfree(buf); - return; - } - - scsi_for_each_sg(scsicmd, sg, scsi_sg_count(scsicmd), i) { - this_page_orig = kmap_atomic(sg_page(sg)); - this_page = (void *)((unsigned long)this_page_orig | - sg->offset); - memcpy(this_page, buf + bufind, sg->length); - kunmap_atomic(this_page_orig); - } - kfree(buf); - } else { - vdisk = scsidev->hostdata; - if (atomic_read(&vdisk->ios_threshold) > 0) { - atomic_dec(&vdisk->ios_threshold); - if (atomic_read(&vdisk->ios_threshold) == 0) - atomic_set(&vdisk->error_count, 0); - } - } -} - -/* - * complete_scsi_command - Complete a scsi command - * @uiscmdrsp: Response from Service Partition - * @scsicmd: The scsi command - * - * Response was returned by the Service Partition. Finish it and send - * completion to the scsi midlayer. - */ -static void complete_scsi_command(struct uiscmdrsp *cmdrsp, - struct scsi_cmnd *scsicmd) -{ - /* take what we need out of cmdrsp and complete the scsicmd */ - scsicmd->result = cmdrsp->scsi.linuxstat; - if (cmdrsp->scsi.linuxstat) - do_scsi_linuxstat(cmdrsp, scsicmd); - else - do_scsi_nolinuxstat(cmdrsp, scsicmd); - - scsi_done(scsicmd); -} - -/* - * drain_queue - Pull responses out of iochannel - * @cmdrsp: Response from the IOSP - * @devdata: Device that owns this iochannel - * - * Pulls responses out of the iochannel and process the responses. - */ -static void drain_queue(struct uiscmdrsp *cmdrsp, - struct visorhba_devdata *devdata) -{ - struct scsi_cmnd *scsicmd; - - while (1) { - /* queue empty */ - if (visorchannel_signalremove(devdata->dev->visorchannel, - IOCHAN_FROM_IOPART, - cmdrsp)) - break; - if (cmdrsp->cmdtype == CMD_SCSI_TYPE) { - /* scsicmd location is returned by the - * deletion - */ - scsicmd = del_scsipending_ent(devdata, - cmdrsp->scsi.handle); - if (!scsicmd) - break; - /* complete the orig cmd */ - complete_scsi_command(cmdrsp, scsicmd); - } else if (cmdrsp->cmdtype == CMD_SCSITASKMGMT_TYPE) { - if (!del_scsipending_ent(devdata, - cmdrsp->scsitaskmgmt.handle)) - break; - complete_taskmgmt_command(&devdata->xa, cmdrsp, - cmdrsp->scsitaskmgmt.result); - } else if (cmdrsp->cmdtype == CMD_NOTIFYGUEST_TYPE) - dev_err_once(&devdata->dev->device, - "ignoring unsupported NOTIFYGUEST\n"); - /* cmdrsp is now available for re-use */ - } -} - -/* - * This is used only when this driver is active as an hba driver in the - * client guest partition. It is called periodically so we can obtain - * and process the command respond from the IO Service Partition periodically. - */ -static void visorhba_channel_interrupt(struct visor_device *dev) -{ - struct visorhba_devdata *devdata = dev_get_drvdata(&dev->device); - - if (!devdata) - return; - - drain_queue(devdata->cmdrsp, devdata); -} - -/* - * visorhba_pause - Function to handle visorbus pause messages - * @dev: Device that is pausing - * @complete_func: Function to call when finished - * - * Something has happened to the IO Service Partition that is - * handling this device. Quiet this device and reset commands - * so that the Service Partition can be corrected. - * - * Return: SUCCESS - */ -static int visorhba_pause(struct visor_device *dev, - visorbus_state_complete_func complete_func) -{ - struct visorhba_devdata *devdata = dev_get_drvdata(&dev->device); - - visorhba_serverdown(devdata); - complete_func(dev, 0); - return 0; -} - -/* - * visorhba_resume - Function called when the IO Service Partition is back - * @dev: Device that is pausing - * @complete_func: Function to call when finished - * - * Yay! The IO Service Partition is back, the channel has been wiped - * so lets re-establish connection and start processing responses. - * - * Return: 0 on success, -EINVAL on failure - */ -static int visorhba_resume(struct visor_device *dev, - visorbus_state_complete_func complete_func) -{ - struct visorhba_devdata *devdata; - - devdata = dev_get_drvdata(&dev->device); - if (!devdata) - return -EINVAL; - - if (devdata->serverdown && !devdata->serverchangingstate) - devdata->serverchangingstate = true; - - visorbus_enable_channel_interrupts(dev); - devdata->serverdown = false; - devdata->serverchangingstate = false; - - return 0; -} - -/* - * visorhba_probe - Device has been discovered; do acquire - * @dev: visor_device that was discovered - * - * A new HBA was discovered; do the initial connections of it. - * - * Return: 0 on success, otherwise error code - */ -static int visorhba_probe(struct visor_device *dev) -{ - struct Scsi_Host *scsihost; - struct vhba_config_max max; - struct visorhba_devdata *devdata = NULL; - int err, channel_offset; - u64 features; - - scsihost = scsi_host_alloc(&visorhba_driver_template, - sizeof(*devdata)); - if (!scsihost) - return -ENODEV; - - channel_offset = offsetof(struct visor_io_channel, vhba.max); - err = visorbus_read_channel(dev, channel_offset, &max, - sizeof(struct vhba_config_max)); - if (err < 0) - goto err_scsi_host_put; - - scsihost->max_id = (unsigned int)max.max_id; - scsihost->max_lun = (unsigned int)max.max_lun; - scsihost->cmd_per_lun = (unsigned int)max.cmd_per_lun; - scsihost->max_sectors = - (unsigned short)(max.max_io_size >> 9); - scsihost->sg_tablesize = - (unsigned short)(max.max_io_size / PAGE_SIZE); - if (scsihost->sg_tablesize > MAX_PHYS_INFO) - scsihost->sg_tablesize = MAX_PHYS_INFO; - err = scsi_add_host(scsihost, &dev->device); - if (err < 0) - goto err_scsi_host_put; - - devdata = (struct visorhba_devdata *)scsihost->hostdata; - devdata->dev = dev; - dev_set_drvdata(&dev->device, devdata); - - devdata->debugfs_dir = debugfs_create_dir(dev_name(&dev->device), - visorhba_debugfs_dir); - if (!devdata->debugfs_dir) { - err = -ENOMEM; - goto err_scsi_remove_host; - } - devdata->debugfs_info = - debugfs_create_file("info", 0440, - devdata->debugfs_dir, devdata, - &info_debugfs_fops); - if (!devdata->debugfs_info) { - err = -ENOMEM; - goto err_debugfs_dir; - } - - spin_lock_init(&devdata->privlock); - devdata->serverdown = false; - devdata->serverchangingstate = false; - devdata->scsihost = scsihost; - - channel_offset = offsetof(struct visor_io_channel, - channel_header.features); - err = visorbus_read_channel(dev, channel_offset, &features, 8); - if (err) - goto err_debugfs_info; - features |= VISOR_CHANNEL_IS_POLLING; - err = visorbus_write_channel(dev, channel_offset, &features, 8); - if (err) - goto err_debugfs_info; - - xa_init(&devdata->xa); - - devdata->cmdrsp = kmalloc(sizeof(*devdata->cmdrsp), GFP_ATOMIC); - visorbus_enable_channel_interrupts(dev); - - scsi_scan_host(scsihost); - - return 0; - -err_debugfs_info: - debugfs_remove(devdata->debugfs_info); - -err_debugfs_dir: - debugfs_remove_recursive(devdata->debugfs_dir); - -err_scsi_remove_host: - scsi_remove_host(scsihost); - -err_scsi_host_put: - scsi_host_put(scsihost); - return err; -} - -/* - * visorhba_remove - Remove a visorhba device - * @dev: Device to remove - * - * Removes the visorhba device. - */ -static void visorhba_remove(struct visor_device *dev) -{ - struct visorhba_devdata *devdata = dev_get_drvdata(&dev->device); - struct Scsi_Host *scsihost = NULL; - - if (!devdata) - return; - - scsihost = devdata->scsihost; - kfree(devdata->cmdrsp); - visorbus_disable_channel_interrupts(dev); - scsi_remove_host(scsihost); - scsi_host_put(scsihost); - - dev_set_drvdata(&dev->device, NULL); - debugfs_remove(devdata->debugfs_info); - debugfs_remove_recursive(devdata->debugfs_dir); -} - -/* This is used to tell the visorbus driver which types of visor devices - * we support, and what functions to call when a visor device that we support - * is attached or removed. - */ -static struct visor_driver visorhba_driver = { - .name = "visorhba", - .owner = THIS_MODULE, - .channel_types = visorhba_channel_types, - .probe = visorhba_probe, - .remove = visorhba_remove, - .pause = visorhba_pause, - .resume = visorhba_resume, - .channel_interrupt = visorhba_channel_interrupt, -}; - -/* - * visorhba_init - Driver init routine - * - * Initialize the visorhba driver and register it with visorbus - * to handle s-Par virtual host bus adapter. - * - * Return: 0 on success, error code otherwise - */ -static int visorhba_init(void) -{ - int rc; - - visorhba_debugfs_dir = debugfs_create_dir("visorhba", NULL); - if (!visorhba_debugfs_dir) - return -ENOMEM; - - rc = visorbus_register_visor_driver(&visorhba_driver); - if (rc) - goto cleanup_debugfs; - - return 0; - -cleanup_debugfs: - debugfs_remove_recursive(visorhba_debugfs_dir); - - return rc; -} - -/* - * visorhba_exit - Driver exit routine - * - * Unregister driver from the bus and free up memory. - */ -static void visorhba_exit(void) -{ - visorbus_unregister_visor_driver(&visorhba_driver); - debugfs_remove_recursive(visorhba_debugfs_dir); -} - -module_init(visorhba_init); -module_exit(visorhba_exit); - -MODULE_AUTHOR("Unisys"); -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("s-Par HBA driver for virtual SCSI host busses"); diff --git a/drivers/staging/unisys/visorinput/Kconfig b/drivers/staging/unisys/visorinput/Kconfig deleted file mode 100644 index 5f036393aee9..000000000000 --- a/drivers/staging/unisys/visorinput/Kconfig +++ /dev/null @@ -1,16 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# Unisys visorinput configuration -# - -config UNISYS_VISORINPUT - tristate "Unisys visorinput driver" - depends on UNISYSSPAR && UNISYS_VISORBUS && INPUT - help - The Unisys s-Par visorinput driver provides a virtualized system - console (keyboard and mouse) that is accessible through the - s-Par firmware's user interface. s-Par provides video using the EFI - GOP protocol, so If this driver is not present, the Linux guest should - still boot with visible output in the partition desktop, but keyboard - and mouse interaction will not be available. - diff --git a/drivers/staging/unisys/visorinput/Makefile b/drivers/staging/unisys/visorinput/Makefile deleted file mode 100644 index 68ced7c8a65f..000000000000 --- a/drivers/staging/unisys/visorinput/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# Makefile for Unisys visorinput -# - -obj-$(CONFIG_UNISYS_VISORINPUT) += visorinput.o - diff --git a/drivers/staging/unisys/visorinput/visorinput.c b/drivers/staging/unisys/visorinput/visorinput.c deleted file mode 100644 index dffa71ac3cc5..000000000000 --- a/drivers/staging/unisys/visorinput/visorinput.c +++ /dev/null @@ -1,788 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Copyright (C) 2011 - 2015 UNISYS CORPORATION - * All rights reserved. - */ - -/* - * This driver lives in a generic guest Linux partition, and registers to - * receive keyboard and mouse channels from the visorbus driver. It reads - * inputs from such channels, and delivers it to the Linux OS in the - * standard way the Linux expects for input drivers. - */ - -#include <linux/fb.h> -#include <linux/input.h> -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/uuid.h> -#include <linux/visorbus.h> - -/* These defines identify mouse and keyboard activity which is specified by the - * firmware to the host using the cmsimpleinput protocol. @ingroup coretypes - */ -/* only motion; arg1=x, arg2=y */ -#define INPUTACTION_XY_MOTION 1 - -/* arg1: 1=left,2=center,3=right */ -#define INPUTACTION_MOUSE_BUTTON_DOWN 2 -#define INPUTACTION_MOUSE_BUTTON_UP 3 -#define INPUTACTION_MOUSE_BUTTON_CLICK 4 -#define INPUTACTION_MOUSE_BUTTON_DCLICK 5 - -/* arg1: wheel rotation away from/toward user */ -#define INPUTACTION_WHEEL_ROTATE_AWAY 6 -#define INPUTACTION_WHEEL_ROTATE_TOWARD 7 - -/* arg1: scancode, as follows: If arg1 <= 0xff, it's a 1-byte scancode and arg1 - * is that scancode. If arg1 > 0xff, it's a 2-byte scanecode, with the 1st - * byte in the low 8 bits, and the 2nd byte in the high 8 bits. - * E.g., the right ALT key would appear as x'38e0'. - */ -#define INPUTACTION_KEY_DOWN 64 -#define INPUTACTION_KEY_UP 65 -#define INPUTACTION_KEY_DOWN_UP 67 - -/* arg1: scancode (in same format as inputaction_keyDown); MUST refer to one of - * the locking keys, like capslock, numlock, or scrolllock. - * arg2: 1 iff locking key should be in the LOCKED position (e.g., light is ON) - */ -#define INPUTACTION_SET_LOCKING_KEY_STATE 66 - -/* Keyboard channel {c73416d0-b0b8-44af-b304-9d2ae99f1b3d} */ -#define VISOR_KEYBOARD_CHANNEL_GUID \ - GUID_INIT(0xc73416d0, 0xb0b8, 0x44af, \ - 0xb3, 0x4, 0x9d, 0x2a, 0xe9, 0x9f, 0x1b, 0x3d) -#define VISOR_KEYBOARD_CHANNEL_GUID_STR "c73416d0-b0b8-44af-b304-9d2ae99f1b3d" - -/* Mouse channel {addf07d4-94a9-46e2-81c3-61abcdbdbd87} */ -#define VISOR_MOUSE_CHANNEL_GUID \ - GUID_INIT(0xaddf07d4, 0x94a9, 0x46e2, \ - 0x81, 0xc3, 0x61, 0xab, 0xcd, 0xbd, 0xbd, 0x87) -#define VISOR_MOUSE_CHANNEL_GUID_STR "addf07d4-94a9-46e2-81c3-61abcdbdbd87" - -#define PIXELS_ACROSS_DEFAULT 1024 -#define PIXELS_DOWN_DEFAULT 768 -#define KEYCODE_TABLE_BYTES 256 - -struct visor_inputactivity { - u16 action; - u16 arg1; - u16 arg2; - u16 arg3; -} __packed; - -struct visor_inputreport { - u64 seq_no; - struct visor_inputactivity activity; -} __packed; - -/* header of keyboard/mouse channels */ -struct visor_input_channel_data { - u32 n_input_reports; - union { - struct { - u16 x_res; - u16 y_res; - } mouse; - struct { - u32 flags; - } keyboard; - }; -} __packed; - -enum visorinput_dev_type { - visorinput_keyboard, - visorinput_mouse, -}; - -/* - * This is the private data that we store for each device. A pointer to this - * struct is maintained via dev_get_drvdata() / dev_set_drvdata() for each - * struct device. - */ -struct visorinput_devdata { - struct visor_device *dev; - /* lock for dev */ - struct mutex lock_visor_dev; - struct input_dev *visorinput_dev; - bool paused; - bool interrupts_enabled; - /* size of following array */ - unsigned int keycode_table_bytes; - /* for keyboard devices: visorkbd_keycode[] + visorkbd_ext_keycode[] */ - unsigned char keycode_table[]; -}; - -static const guid_t visor_keyboard_channel_guid = VISOR_KEYBOARD_CHANNEL_GUID; -static const guid_t visor_mouse_channel_guid = VISOR_MOUSE_CHANNEL_GUID; - -/* - * Borrowed from drivers/input/keyboard/atakbd.c - * This maps 1-byte scancodes to keycodes. - */ -static const unsigned char visorkbd_keycode[KEYCODE_TABLE_BYTES] = { - /* American layout */ - [0] = KEY_GRAVE, - [1] = KEY_ESC, - [2] = KEY_1, - [3] = KEY_2, - [4] = KEY_3, - [5] = KEY_4, - [6] = KEY_5, - [7] = KEY_6, - [8] = KEY_7, - [9] = KEY_8, - [10] = KEY_9, - [11] = KEY_0, - [12] = KEY_MINUS, - [13] = KEY_EQUAL, - [14] = KEY_BACKSPACE, - [15] = KEY_TAB, - [16] = KEY_Q, - [17] = KEY_W, - [18] = KEY_E, - [19] = KEY_R, - [20] = KEY_T, - [21] = KEY_Y, - [22] = KEY_U, - [23] = KEY_I, - [24] = KEY_O, - [25] = KEY_P, - [26] = KEY_LEFTBRACE, - [27] = KEY_RIGHTBRACE, - [28] = KEY_ENTER, - [29] = KEY_LEFTCTRL, - [30] = KEY_A, - [31] = KEY_S, - [32] = KEY_D, - [33] = KEY_F, - [34] = KEY_G, - [35] = KEY_H, - [36] = KEY_J, - [37] = KEY_K, - [38] = KEY_L, - [39] = KEY_SEMICOLON, - [40] = KEY_APOSTROPHE, - [41] = KEY_GRAVE, - [42] = KEY_LEFTSHIFT, - [43] = KEY_BACKSLASH, - [44] = KEY_Z, - [45] = KEY_X, - [46] = KEY_C, - [47] = KEY_V, - [48] = KEY_B, - [49] = KEY_N, - [50] = KEY_M, - [51] = KEY_COMMA, - [52] = KEY_DOT, - [53] = KEY_SLASH, - [54] = KEY_RIGHTSHIFT, - [55] = KEY_KPASTERISK, - [56] = KEY_LEFTALT, - [57] = KEY_SPACE, - [58] = KEY_CAPSLOCK, - [59] = KEY_F1, - [60] = KEY_F2, - [61] = KEY_F3, - [62] = KEY_F4, - [63] = KEY_F5, - [64] = KEY_F6, - [65] = KEY_F7, - [66] = KEY_F8, - [67] = KEY_F9, - [68] = KEY_F10, - [69] = KEY_NUMLOCK, - [70] = KEY_SCROLLLOCK, - [71] = KEY_KP7, - [72] = KEY_KP8, - [73] = KEY_KP9, - [74] = KEY_KPMINUS, - [75] = KEY_KP4, - [76] = KEY_KP5, - [77] = KEY_KP6, - [78] = KEY_KPPLUS, - [79] = KEY_KP1, - [80] = KEY_KP2, - [81] = KEY_KP3, - [82] = KEY_KP0, - [83] = KEY_KPDOT, - /* enables UK backslash+pipe key and FR lessthan+greaterthan key */ - [86] = KEY_102ND, - [87] = KEY_F11, - [88] = KEY_F12, - [90] = KEY_KPLEFTPAREN, - [91] = KEY_KPRIGHTPAREN, - [92] = KEY_KPASTERISK, - [93] = KEY_KPASTERISK, - [94] = KEY_KPPLUS, - [95] = KEY_HELP, - [96] = KEY_KPENTER, - [97] = KEY_RIGHTCTRL, - [98] = KEY_KPSLASH, - [99] = KEY_KPLEFTPAREN, - [100] = KEY_KPRIGHTPAREN, - [101] = KEY_KPSLASH, - [102] = KEY_HOME, - [103] = KEY_UP, - [104] = KEY_PAGEUP, - [105] = KEY_LEFT, - [106] = KEY_RIGHT, - [107] = KEY_END, - [108] = KEY_DOWN, - [109] = KEY_PAGEDOWN, - [110] = KEY_INSERT, - [111] = KEY_DELETE, - [112] = KEY_MACRO, - [113] = KEY_MUTE -}; - -/* - * This maps the <xx> in extended scancodes of the form "0xE0 <xx>" into - * keycodes. - */ -static const unsigned char visorkbd_ext_keycode[KEYCODE_TABLE_BYTES] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */ - 0, 0, 0, 0, KEY_KPENTER, KEY_RIGHTCTRL, 0, 0, /* 0x18 */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */ - KEY_RIGHTALT, 0, 0, 0, 0, 0, 0, 0, /* 0x28 */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */ - KEY_RIGHTALT /* AltGr */, 0, 0, 0, 0, 0, 0, 0, /* 0x38 */ - 0, 0, 0, 0, 0, 0, 0, KEY_HOME, /* 0x40 */ - KEY_UP, KEY_PAGEUP, 0, KEY_LEFT, 0, KEY_RIGHT, 0, KEY_END, /* 0x48 */ - KEY_DOWN, KEY_PAGEDOWN, KEY_INSERT, KEY_DELETE, 0, 0, 0, 0, /* 0x50 */ - 0, 0, 0, 0, 0, 0, 0, 0, /* 0x58 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */ -}; - -static int visorinput_open(struct input_dev *visorinput_dev) -{ - struct visorinput_devdata *devdata = input_get_drvdata(visorinput_dev); - - if (!devdata) { - dev_err(&visorinput_dev->dev, - "%s input_get_drvdata(%p) returned NULL\n", - __func__, visorinput_dev); - return -EINVAL; - } - dev_dbg(&visorinput_dev->dev, "%s opened\n", __func__); - - /* - * If we're not paused, really enable interrupts. Regardless of whether - * we are paused, set a flag indicating interrupts should be enabled so - * when we resume, interrupts will really be enabled. - */ - mutex_lock(&devdata->lock_visor_dev); - devdata->interrupts_enabled = true; - if (devdata->paused) - goto out_unlock; - visorbus_enable_channel_interrupts(devdata->dev); - -out_unlock: - mutex_unlock(&devdata->lock_visor_dev); - return 0; -} - -static void visorinput_close(struct input_dev *visorinput_dev) -{ - struct visorinput_devdata *devdata = input_get_drvdata(visorinput_dev); - - if (!devdata) { - dev_err(&visorinput_dev->dev, - "%s input_get_drvdata(%p) returned NULL\n", - __func__, visorinput_dev); - return; - } - dev_dbg(&visorinput_dev->dev, "%s closed\n", __func__); - - /* - * If we're not paused, really disable interrupts. Regardless of - * whether we are paused, set a flag indicating interrupts should be - * disabled so when we resume we will not re-enable them. - */ - mutex_lock(&devdata->lock_visor_dev); - devdata->interrupts_enabled = false; - if (devdata->paused) - goto out_unlock; - visorbus_disable_channel_interrupts(devdata->dev); - -out_unlock: - mutex_unlock(&devdata->lock_visor_dev); -} - -/* - * setup_client_keyboard() initializes and returns a Linux input node that we - * can use to deliver keyboard inputs to Linux. We of course do this when we - * see keyboard inputs coming in on a keyboard channel. - */ -static struct input_dev *setup_client_keyboard(void *devdata, - unsigned char *keycode_table) - -{ - int i; - struct input_dev *visorinput_dev = input_allocate_device(); - - if (!visorinput_dev) - return NULL; - - visorinput_dev->name = "visor Keyboard"; - visorinput_dev->phys = "visorkbd:input0"; - visorinput_dev->id.bustype = BUS_VIRTUAL; - visorinput_dev->id.vendor = 0x0001; - visorinput_dev->id.product = 0x0001; - visorinput_dev->id.version = 0x0100; - - visorinput_dev->evbit[0] = BIT_MASK(EV_KEY) | - BIT_MASK(EV_REP) | - BIT_MASK(EV_LED); - visorinput_dev->ledbit[0] = BIT_MASK(LED_CAPSL) | - BIT_MASK(LED_SCROLLL) | - BIT_MASK(LED_NUML); - visorinput_dev->keycode = keycode_table; - /* sizeof(unsigned char) */ - visorinput_dev->keycodesize = 1; - visorinput_dev->keycodemax = KEYCODE_TABLE_BYTES; - - for (i = 1; i < visorinput_dev->keycodemax; i++) - set_bit(keycode_table[i], visorinput_dev->keybit); - for (i = 1; i < visorinput_dev->keycodemax; i++) - set_bit(keycode_table[i + KEYCODE_TABLE_BYTES], - visorinput_dev->keybit); - - visorinput_dev->open = visorinput_open; - visorinput_dev->close = visorinput_close; - /* pre input_register! */ - input_set_drvdata(visorinput_dev, devdata); - - return visorinput_dev; -} - -static struct input_dev *setup_client_mouse(void *devdata, unsigned int xres, - unsigned int yres) -{ - struct input_dev *visorinput_dev = input_allocate_device(); - - if (!visorinput_dev) - return NULL; - - visorinput_dev->name = "visor Mouse"; - visorinput_dev->phys = "visormou:input0"; - visorinput_dev->id.bustype = BUS_VIRTUAL; - visorinput_dev->id.vendor = 0x0001; - visorinput_dev->id.product = 0x0002; - visorinput_dev->id.version = 0x0100; - - visorinput_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); - set_bit(BTN_LEFT, visorinput_dev->keybit); - set_bit(BTN_RIGHT, visorinput_dev->keybit); - set_bit(BTN_MIDDLE, visorinput_dev->keybit); - - if (xres == 0) - xres = PIXELS_ACROSS_DEFAULT; - if (yres == 0) - yres = PIXELS_DOWN_DEFAULT; - input_set_abs_params(visorinput_dev, ABS_X, 0, xres, 0, 0); - input_set_abs_params(visorinput_dev, ABS_Y, 0, yres, 0, 0); - - visorinput_dev->open = visorinput_open; - visorinput_dev->close = visorinput_close; - /* pre input_register! */ - input_set_drvdata(visorinput_dev, devdata); - input_set_capability(visorinput_dev, EV_REL, REL_WHEEL); - - return visorinput_dev; -} - -static struct visorinput_devdata *devdata_create(struct visor_device *dev, - enum visorinput_dev_type dtype) -{ - struct visorinput_devdata *devdata = NULL; - unsigned int extra_bytes = 0; - unsigned int size, xres, yres, err; - struct visor_input_channel_data data; - - if (dtype == visorinput_keyboard) - /* allocate room for devdata->keycode_table, filled in below */ - extra_bytes = KEYCODE_TABLE_BYTES * 2; - devdata = kzalloc(struct_size(devdata, keycode_table, extra_bytes), - GFP_KERNEL); - if (!devdata) - return NULL; - mutex_init(&devdata->lock_visor_dev); - mutex_lock(&devdata->lock_visor_dev); - devdata->dev = dev; - - /* - * visorinput_open() can be called as soon as input_register_device() - * happens, and that will enable channel interrupts. Setting paused - * prevents us from getting into visorinput_channel_interrupt() prior - * to the device structure being totally initialized. - */ - devdata->paused = true; - - /* - * This is an input device in a client guest partition, so we need to - * create whatever input nodes are necessary to deliver our inputs to - * the guest OS. - */ - switch (dtype) { - case visorinput_keyboard: - devdata->keycode_table_bytes = extra_bytes; - memcpy(devdata->keycode_table, visorkbd_keycode, - KEYCODE_TABLE_BYTES); - memcpy(devdata->keycode_table + KEYCODE_TABLE_BYTES, - visorkbd_ext_keycode, KEYCODE_TABLE_BYTES); - devdata->visorinput_dev = setup_client_keyboard - (devdata, devdata->keycode_table); - if (!devdata->visorinput_dev) - goto cleanups_register; - break; - case visorinput_mouse: - size = sizeof(struct visor_input_channel_data); - err = visorbus_read_channel(dev, sizeof(struct channel_header), - &data, size); - if (err) - goto cleanups_register; - xres = data.mouse.x_res; - yres = data.mouse.y_res; - devdata->visorinput_dev = setup_client_mouse(devdata, xres, - yres); - if (!devdata->visorinput_dev) - goto cleanups_register; - break; - default: - /* No other input devices supported */ - break; - } - - dev_set_drvdata(&dev->device, devdata); - mutex_unlock(&devdata->lock_visor_dev); - - /* - * Device struct is completely set up now, with the exception of - * visorinput_dev being registered. We need to unlock before we - * register the device, because this can cause an on-stack call of - * visorinput_open(), which would deadlock if we had the lock. - */ - if (input_register_device(devdata->visorinput_dev)) { - input_free_device(devdata->visorinput_dev); - goto err_kfree_devdata; - } - - mutex_lock(&devdata->lock_visor_dev); - /* - * Establish calls to visorinput_channel_interrupt() if that is the - * desired state that we've kept track of in interrupts_enabled while - * the device was being created. - */ - devdata->paused = false; - if (devdata->interrupts_enabled) - visorbus_enable_channel_interrupts(dev); - mutex_unlock(&devdata->lock_visor_dev); - - return devdata; - -cleanups_register: - mutex_unlock(&devdata->lock_visor_dev); -err_kfree_devdata: - kfree(devdata); - return NULL; -} - -static int visorinput_probe(struct visor_device *dev) -{ - const guid_t *guid; - enum visorinput_dev_type dtype; - - guid = visorchannel_get_guid(dev->visorchannel); - if (guid_equal(guid, &visor_mouse_channel_guid)) - dtype = visorinput_mouse; - else if (guid_equal(guid, &visor_keyboard_channel_guid)) - dtype = visorinput_keyboard; - else - return -ENODEV; - visorbus_disable_channel_interrupts(dev); - if (!devdata_create(dev, dtype)) - return -ENOMEM; - return 0; -} - -static void unregister_client_input(struct input_dev *visorinput_dev) -{ - if (visorinput_dev) - input_unregister_device(visorinput_dev); -} - -static void visorinput_remove(struct visor_device *dev) -{ - struct visorinput_devdata *devdata = dev_get_drvdata(&dev->device); - - if (!devdata) - return; - - mutex_lock(&devdata->lock_visor_dev); - visorbus_disable_channel_interrupts(dev); - - /* - * due to above, at this time no thread of execution will be in - * visorinput_channel_interrupt() - */ - - dev_set_drvdata(&dev->device, NULL); - mutex_unlock(&devdata->lock_visor_dev); - - unregister_client_input(devdata->visorinput_dev); - kfree(devdata); -} - -/* - * Make it so the current locking state of the locking key indicated by - * <keycode> is as indicated by <desired_state> (1=locked, 0=unlocked). - */ -static void handle_locking_key(struct input_dev *visorinput_dev, int keycode, - int desired_state) -{ - int led; - - switch (keycode) { - case KEY_CAPSLOCK: - led = LED_CAPSL; - break; - case KEY_SCROLLLOCK: - led = LED_SCROLLL; - break; - case KEY_NUMLOCK: - led = LED_NUML; - break; - default: - return; - } - if (test_bit(led, visorinput_dev->led) != desired_state) { - input_report_key(visorinput_dev, keycode, 1); - input_sync(visorinput_dev); - input_report_key(visorinput_dev, keycode, 0); - input_sync(visorinput_dev); - __change_bit(led, visorinput_dev->led); - } -} - -/* - * <scancode> is either a 1-byte scancode, or an extended 16-bit scancode with - * 0xE0 in the low byte and the extended scancode value in the next higher byte. - */ -static int scancode_to_keycode(int scancode) -{ - if (scancode > 0xff) - return visorkbd_ext_keycode[(scancode >> 8) & 0xff]; - - return visorkbd_keycode[scancode]; -} - -static int calc_button(int x) -{ - switch (x) { - case 1: - return BTN_LEFT; - case 2: - return BTN_MIDDLE; - case 3: - return BTN_RIGHT; - default: - return -EINVAL; - } -} - -/* - * This is used only when this driver is active as an input driver in the - * client guest partition. It is called periodically so we can obtain inputs - * from the channel, and deliver them to the guest OS. - */ -static void visorinput_channel_interrupt(struct visor_device *dev) -{ - struct visor_inputreport r; - int scancode, keycode; - struct input_dev *visorinput_dev; - int xmotion, ymotion, button; - int i; - struct visorinput_devdata *devdata = dev_get_drvdata(&dev->device); - - if (!devdata) - return; - - visorinput_dev = devdata->visorinput_dev; - - while (!visorchannel_signalremove(dev->visorchannel, 0, &r)) { - scancode = r.activity.arg1; - keycode = scancode_to_keycode(scancode); - switch (r.activity.action) { - case INPUTACTION_KEY_DOWN: - input_report_key(visorinput_dev, keycode, 1); - input_sync(visorinput_dev); - break; - case INPUTACTION_KEY_UP: - input_report_key(visorinput_dev, keycode, 0); - input_sync(visorinput_dev); - break; - case INPUTACTION_KEY_DOWN_UP: - input_report_key(visorinput_dev, keycode, 1); - input_sync(visorinput_dev); - input_report_key(visorinput_dev, keycode, 0); - input_sync(visorinput_dev); - break; - case INPUTACTION_SET_LOCKING_KEY_STATE: - handle_locking_key(visorinput_dev, keycode, - r.activity.arg2); - break; - case INPUTACTION_XY_MOTION: - xmotion = r.activity.arg1; - ymotion = r.activity.arg2; - input_report_abs(visorinput_dev, ABS_X, xmotion); - input_report_abs(visorinput_dev, ABS_Y, ymotion); - input_sync(visorinput_dev); - break; - case INPUTACTION_MOUSE_BUTTON_DOWN: - button = calc_button(r.activity.arg1); - if (button < 0) - break; - input_report_key(visorinput_dev, button, 1); - input_sync(visorinput_dev); - break; - case INPUTACTION_MOUSE_BUTTON_UP: - button = calc_button(r.activity.arg1); - if (button < 0) - break; - input_report_key(visorinput_dev, button, 0); - input_sync(visorinput_dev); - break; - case INPUTACTION_MOUSE_BUTTON_CLICK: - button = calc_button(r.activity.arg1); - if (button < 0) - break; - input_report_key(visorinput_dev, button, 1); - input_sync(visorinput_dev); - input_report_key(visorinput_dev, button, 0); - input_sync(visorinput_dev); - break; - case INPUTACTION_MOUSE_BUTTON_DCLICK: - button = calc_button(r.activity.arg1); - if (button < 0) - break; - for (i = 0; i < 2; i++) { - input_report_key(visorinput_dev, button, 1); - input_sync(visorinput_dev); - input_report_key(visorinput_dev, button, 0); - input_sync(visorinput_dev); - } - break; - case INPUTACTION_WHEEL_ROTATE_AWAY: - input_report_rel(visorinput_dev, REL_WHEEL, 1); - input_sync(visorinput_dev); - break; - case INPUTACTION_WHEEL_ROTATE_TOWARD: - input_report_rel(visorinput_dev, REL_WHEEL, -1); - input_sync(visorinput_dev); - break; - default: - /* Unsupported input action */ - break; - } - } -} - -static int visorinput_pause(struct visor_device *dev, - visorbus_state_complete_func complete_func) -{ - int rc; - struct visorinput_devdata *devdata = dev_get_drvdata(&dev->device); - - if (!devdata) { - rc = -ENODEV; - goto out; - } - - mutex_lock(&devdata->lock_visor_dev); - if (devdata->paused) { - rc = -EBUSY; - goto out_locked; - } - if (devdata->interrupts_enabled) - visorbus_disable_channel_interrupts(dev); - - /* - * due to above, at this time no thread of execution will be in - * visorinput_channel_interrupt() - */ - devdata->paused = true; - complete_func(dev, 0); - rc = 0; -out_locked: - mutex_unlock(&devdata->lock_visor_dev); -out: - return rc; -} - -static int visorinput_resume(struct visor_device *dev, - visorbus_state_complete_func complete_func) -{ - int rc; - struct visorinput_devdata *devdata = dev_get_drvdata(&dev->device); - - if (!devdata) { - rc = -ENODEV; - goto out; - } - mutex_lock(&devdata->lock_visor_dev); - if (!devdata->paused) { - rc = -EBUSY; - goto out_locked; - } - devdata->paused = false; - complete_func(dev, 0); - - /* - * Re-establish calls to visorinput_channel_interrupt() if that is the - * desired state that we've kept track of in interrupts_enabled while - * the device was paused. - */ - if (devdata->interrupts_enabled) - visorbus_enable_channel_interrupts(dev); - - rc = 0; -out_locked: - mutex_unlock(&devdata->lock_visor_dev); -out: - return rc; -} - -/* GUIDS for all channel types supported by this driver. */ -static struct visor_channeltype_descriptor visorinput_channel_types[] = { - { VISOR_KEYBOARD_CHANNEL_GUID, "keyboard", - sizeof(struct channel_header), 0 }, - { VISOR_MOUSE_CHANNEL_GUID, "mouse", sizeof(struct channel_header), 0 }, - {} -}; - -static struct visor_driver visorinput_driver = { - .name = "visorinput", - .owner = THIS_MODULE, - .channel_types = visorinput_channel_types, - .probe = visorinput_probe, - .remove = visorinput_remove, - .channel_interrupt = visorinput_channel_interrupt, - .pause = visorinput_pause, - .resume = visorinput_resume, -}; - -module_driver(visorinput_driver, visorbus_register_visor_driver, - visorbus_unregister_visor_driver); - -MODULE_DEVICE_TABLE(visorbus, visorinput_channel_types); - -MODULE_AUTHOR("Unisys"); -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("s-Par human input driver for virtual keyboard/mouse"); - -MODULE_ALIAS("visorbus:" VISOR_MOUSE_CHANNEL_GUID_STR); -MODULE_ALIAS("visorbus:" VISOR_KEYBOARD_CHANNEL_GUID_STR); diff --git a/drivers/staging/unisys/visornic/Kconfig b/drivers/staging/unisys/visornic/Kconfig deleted file mode 100644 index 3f8f5570821b..000000000000 --- a/drivers/staging/unisys/visornic/Kconfig +++ /dev/null @@ -1,16 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# Unisys visornic configuration -# - -config UNISYS_VISORNIC - tristate "Unisys visornic driver" - depends on UNISYSSPAR && UNISYS_VISORBUS && NET - help - The Unisys Visornic driver provides support for s-Par network - devices exposed on the s-Par visorbus. When a message is sent - to visorbus to create a network device, the probe function of - visornic is called to create the netdev device. Networking on - s-Par switches will not work if this driver is not selected. - If you say Y here, you will enable the Unisys visornic driver. - diff --git a/drivers/staging/unisys/visornic/Makefile b/drivers/staging/unisys/visornic/Makefile deleted file mode 100644 index f2984880c340..000000000000 --- a/drivers/staging/unisys/visornic/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# Makefile for Unisys channel -# - -obj-$(CONFIG_UNISYS_VISORNIC) += visornic.o - -visornic-y := visornic_main.o - -ccflags-y += -I $(srctree)/$(src)/../include diff --git a/drivers/staging/unisys/visornic/visornic_main.c b/drivers/staging/unisys/visornic/visornic_main.c deleted file mode 100644 index 643432458105..000000000000 --- a/drivers/staging/unisys/visornic/visornic_main.c +++ /dev/null @@ -1,2148 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* Copyright (c) 2012 - 2015 UNISYS CORPORATION - * All rights reserved. - */ - -/* This driver lives in a spar partition, and registers to ethernet io - * channels from the visorbus driver. It creates netdev devices and - * forwards transmit to the IO channel and accepts rcvs from the IO - * Partition via the IO channel. - */ - -#include <linux/debugfs.h> -#include <linux/etherdevice.h> -#include <linux/module.h> -#include <linux/netdevice.h> -#include <linux/kthread.h> -#include <linux/skbuff.h> -#include <linux/rtnetlink.h> -#include <linux/visorbus.h> - -#include "iochannel.h" - -#define VISORNIC_INFINITE_RSP_WAIT 0 - -/* MAX_BUF = 64 lines x 32 MAXVNIC x 80 characters - * = 163840 bytes - */ -#define MAX_BUF 163840 -#define NAPI_WEIGHT 64 - -/* GUIDS for director channel type supported by this driver. */ -/* {8cd5994d-c58e-11da-95a9-00e08161165f} */ -#define VISOR_VNIC_CHANNEL_GUID \ - GUID_INIT(0x8cd5994d, 0xc58e, 0x11da, \ - 0x95, 0xa9, 0x0, 0xe0, 0x81, 0x61, 0x16, 0x5f) -#define VISOR_VNIC_CHANNEL_GUID_STR \ - "8cd5994d-c58e-11da-95a9-00e08161165f" - -static struct visor_channeltype_descriptor visornic_channel_types[] = { - /* Note that the only channel type we expect to be reported by the - * bus driver is the VISOR_VNIC channel. - */ - { VISOR_VNIC_CHANNEL_GUID, "ultravnic", sizeof(struct channel_header), - VISOR_VNIC_CHANNEL_VERSIONID }, - {} -}; -MODULE_DEVICE_TABLE(visorbus, visornic_channel_types); -/* FIXME XXX: This next line of code must be fixed and removed before - * acceptance into the 'normal' part of the kernel. It is only here as a place - * holder to get module autoloading functionality working for visorbus. Code - * must be added to scripts/mode/file2alias.c, etc., to get this working - * properly. - */ -MODULE_ALIAS("visorbus:" VISOR_VNIC_CHANNEL_GUID_STR); - -struct chanstat { - unsigned long got_rcv; - unsigned long got_enbdisack; - unsigned long got_xmit_done; - unsigned long xmit_fail; - unsigned long sent_enbdis; - unsigned long sent_promisc; - unsigned long sent_post; - unsigned long sent_post_failed; - unsigned long sent_xmit; - unsigned long reject_count; - unsigned long extra_rcvbufs_sent; -}; - -/* struct visornic_devdata - * @enabled: 0 disabled 1 enabled to receive. - * @enab_dis_acked: NET_RCV_ENABLE/DISABLE acked by IOPART. - * @struct *dev: - * @struct *netdev: - * @struct net_stats: - * @interrupt_rcvd: - * @rsp_queue: - * @struct **rcvbuf: - * @incarnation_id: incarnation_id lets IOPART know about - * re-birth. - * @old_flags: flags as they were prior to - * set_multicast_list. - * @usage: count of users. - * @num_rcv_bufs: number of rcv buffers the vnic will post. - * @num_rcv_bufs_could_not_alloc: - * @num_rcvbuf_in_iovm: - * @alloc_failed_in_if_needed_cnt: - * @alloc_failed_in_repost_rtn_cnt: - * @max_outstanding_net_xmits: absolute max number of outstanding xmits - * - should never hit this. - * @upper_threshold_net_xmits: high water mark for calling - * netif_stop_queue(). - * @lower_threshold_net_xmits: high water mark for calling - * netif_wake_queue(). - * @struct xmitbufhead: xmitbufhead - head of the xmit buffer list - * sent to the IOPART end. - * @server_down_complete_func: - * @struct timeout_reset: - * @struct *cmdrsp_rcv: cmdrsp_rcv is used for posting/unposting rcv - * buffers. - * @struct *xmit_cmdrsp: xmit_cmdrsp - issues NET_XMIT - only one - * active xmit at a time. - * @server_down: IOPART is down. - * @server_change_state: Processing SERVER_CHANGESTATE msg. - * @going_away: device is being torn down. - * @struct *eth_debugfs_dir: - * @interrupts_rcvd: - * @interrupts_notme: - * @interrupts_disabled: - * @busy_cnt: - * @priv_lock: spinlock to access devdata structures. - * @flow_control_upper_hits: - * @flow_control_lower_hits: - * @n_rcv0: # rcvs of 0 buffers. - * @n_rcv1: # rcvs of 1 buffers. - * @n_rcv2: # rcvs of 2 buffers. - * @n_rcvx: # rcvs of >2 buffers. - * @found_repost_rcvbuf_cnt: # repost_rcvbuf_cnt. - * @repost_found_skb_cnt: # of found the skb. - * @n_repost_deficit: # of lost rcv buffers. - * @bad_rcv_buf: # of unknown rcv skb not freed. - * @n_rcv_packets_not_accepted: # bogs rcv packets. - * @queuefullmsg_logged: - * @struct chstat: - * @struct napi: - * @struct cmdrsp: - */ -struct visornic_devdata { - unsigned short enabled; - unsigned short enab_dis_acked; - - struct visor_device *dev; - struct net_device *netdev; - struct net_device_stats net_stats; - atomic_t interrupt_rcvd; - wait_queue_head_t rsp_queue; - struct sk_buff **rcvbuf; - u64 incarnation_id; - unsigned short old_flags; - atomic_t usage; - - int num_rcv_bufs; - int num_rcv_bufs_could_not_alloc; - atomic_t num_rcvbuf_in_iovm; - unsigned long alloc_failed_in_if_needed_cnt; - unsigned long alloc_failed_in_repost_rtn_cnt; - - unsigned long max_outstanding_net_xmits; - unsigned long upper_threshold_net_xmits; - unsigned long lower_threshold_net_xmits; - struct sk_buff_head xmitbufhead; - - visorbus_state_complete_func server_down_complete_func; - struct work_struct timeout_reset; - struct uiscmdrsp *cmdrsp_rcv; - struct uiscmdrsp *xmit_cmdrsp; - bool server_down; - bool server_change_state; - bool going_away; - struct dentry *eth_debugfs_dir; - u64 interrupts_rcvd; - u64 interrupts_notme; - u64 interrupts_disabled; - u64 busy_cnt; - /* spinlock to access devdata structures. */ - spinlock_t priv_lock; - - /* flow control counter */ - u64 flow_control_upper_hits; - u64 flow_control_lower_hits; - - /* debug counters */ - unsigned long n_rcv0; - unsigned long n_rcv1; - unsigned long n_rcv2; - unsigned long n_rcvx; - unsigned long found_repost_rcvbuf_cnt; - unsigned long repost_found_skb_cnt; - unsigned long n_repost_deficit; - unsigned long bad_rcv_buf; - unsigned long n_rcv_packets_not_accepted; - - int queuefullmsg_logged; - struct chanstat chstat; - struct napi_struct napi; - struct uiscmdrsp cmdrsp[SIZEOF_CMDRSP]; -}; - -/* Returns next non-zero index on success or 0 on failure (i.e. out of room). */ -static u16 add_physinfo_entries(u64 inp_pfn, u16 inp_off, u16 inp_len, - u16 index, u16 max_pi_arr_entries, - struct phys_info pi_arr[]) -{ - u16 i, len, firstlen; - - firstlen = PI_PAGE_SIZE - inp_off; - if (inp_len <= firstlen) { - /* The input entry spans only one page - add as is. */ - if (index >= max_pi_arr_entries) - return 0; - pi_arr[index].pi_pfn = inp_pfn; - pi_arr[index].pi_off = (u16)inp_off; - pi_arr[index].pi_len = (u16)inp_len; - return index + 1; - } - - /* This entry spans multiple pages. */ - for (len = inp_len, i = 0; len; - len -= pi_arr[index + i].pi_len, i++) { - if (index + i >= max_pi_arr_entries) - return 0; - pi_arr[index + i].pi_pfn = inp_pfn + i; - if (i == 0) { - pi_arr[index].pi_off = inp_off; - pi_arr[index].pi_len = firstlen; - } else { - pi_arr[index + i].pi_off = 0; - pi_arr[index + i].pi_len = min_t(u16, len, - PI_PAGE_SIZE); - } - } - return index + i; -} - -/* visor_copy_fragsinfo_from_skb - copy fragment list in the SKB to a phys_info - * array that the IOPART understands - * @skb: Skbuff that we are pulling the frags from. - * @firstfraglen: Length of first fragment in skb. - * @frags_max: Max len of frags array. - * @frags: Frags array filled in on output. - * - * Return: Positive integer indicating number of entries filled in frags on - * success, negative integer on error. - */ -static int visor_copy_fragsinfo_from_skb(struct sk_buff *skb, - unsigned int firstfraglen, - unsigned int frags_max, - struct phys_info frags[]) -{ - unsigned int count = 0, frag, size, offset = 0, numfrags; - unsigned int total_count; - - numfrags = skb_shinfo(skb)->nr_frags; - - /* Compute the number of fragments this skb has, and if its more than - * frag array can hold, linearize the skb - */ - total_count = numfrags + (firstfraglen / PI_PAGE_SIZE); - if (firstfraglen % PI_PAGE_SIZE) - total_count++; - - if (total_count > frags_max) { - if (skb_linearize(skb)) - return -EINVAL; - numfrags = skb_shinfo(skb)->nr_frags; - firstfraglen = 0; - } - - while (firstfraglen) { - if (count == frags_max) - return -EINVAL; - - frags[count].pi_pfn = - page_to_pfn(virt_to_page(skb->data + offset)); - frags[count].pi_off = - (unsigned long)(skb->data + offset) & PI_PAGE_MASK; - size = min_t(unsigned int, firstfraglen, - PI_PAGE_SIZE - frags[count].pi_off); - - /* can take smallest of firstfraglen (what's left) OR - * bytes left in the page - */ - frags[count].pi_len = size; - firstfraglen -= size; - offset += size; - count++; - } - if (numfrags) { - if ((count + numfrags) > frags_max) - return -EINVAL; - - for (frag = 0; frag < numfrags; frag++) { - count = add_physinfo_entries(page_to_pfn( - skb_frag_page(&skb_shinfo(skb)->frags[frag])), - skb_frag_off(&skb_shinfo(skb)->frags[frag]), - skb_frag_size(&skb_shinfo(skb)->frags[frag]), - count, frags_max, frags); - /* add_physinfo_entries only returns - * zero if the frags array is out of room - * That should never happen because we - * fail above, if count+numfrags > frags_max. - */ - if (!count) - return -EINVAL; - } - } - if (skb_shinfo(skb)->frag_list) { - struct sk_buff *skbinlist; - int c; - - for (skbinlist = skb_shinfo(skb)->frag_list; skbinlist; - skbinlist = skbinlist->next) { - c = visor_copy_fragsinfo_from_skb(skbinlist, - skbinlist->len - - skbinlist->data_len, - frags_max - count, - &frags[count]); - if (c < 0) - return c; - count += c; - } - } - return count; -} - -static ssize_t enable_ints_write(struct file *file, - const char __user *buffer, - size_t count, loff_t *ppos) -{ - /* Don't want to break ABI here by having a debugfs - * file that no longer exists or is writable, so - * lets just make this a vestigual function - */ - return count; -} - -static const struct file_operations debugfs_enable_ints_fops = { - .write = enable_ints_write, -}; - -/* visornic_serverdown_complete - pause device following IOPART going down - * @devdata: Device managed by IOPART. - * - * The IO partition has gone down, and we need to do some cleanup for when it - * comes back. Treat the IO partition as the link being down. - */ -static void visornic_serverdown_complete(struct visornic_devdata *devdata) -{ - struct net_device *netdev = devdata->netdev; - - /* Stop polling for interrupts */ - visorbus_disable_channel_interrupts(devdata->dev); - - rtnl_lock(); - dev_close(netdev); - rtnl_unlock(); - - atomic_set(&devdata->num_rcvbuf_in_iovm, 0); - devdata->chstat.sent_xmit = 0; - devdata->chstat.got_xmit_done = 0; - - if (devdata->server_down_complete_func) - (*devdata->server_down_complete_func)(devdata->dev, 0); - - devdata->server_down = true; - devdata->server_change_state = false; - devdata->server_down_complete_func = NULL; -} - -/* visornic_serverdown - Command has notified us that IOPART is down - * @devdata: Device managed by IOPART. - * @complete_func: Function to call when finished. - * - * Schedule the work needed to handle the server down request. Make sure we - * haven't already handled the server change state event. - * - * Return: 0 if we scheduled the work, negative integer on error. - */ -static int visornic_serverdown(struct visornic_devdata *devdata, - visorbus_state_complete_func complete_func) -{ - unsigned long flags; - int err; - - spin_lock_irqsave(&devdata->priv_lock, flags); - if (devdata->server_change_state) { - dev_dbg(&devdata->dev->device, "%s changing state\n", - __func__); - err = -EINVAL; - goto err_unlock; - } - if (devdata->server_down) { - dev_dbg(&devdata->dev->device, "%s already down\n", - __func__); - err = -EINVAL; - goto err_unlock; - } - if (devdata->going_away) { - dev_dbg(&devdata->dev->device, - "%s aborting because device removal pending\n", - __func__); - err = -ENODEV; - goto err_unlock; - } - devdata->server_change_state = true; - devdata->server_down_complete_func = complete_func; - spin_unlock_irqrestore(&devdata->priv_lock, flags); - - visornic_serverdown_complete(devdata); - return 0; - -err_unlock: - spin_unlock_irqrestore(&devdata->priv_lock, flags); - return err; -} - -/* alloc_rcv_buf - alloc rcv buffer to be given to the IO Partition - * @netdev: Network adapter the rcv bufs are attached too. - * - * Create an sk_buff (rcv_buf) that will be passed to the IO Partition - * so that it can write rcv data into our memory space. - * - * Return: Pointer to sk_buff. - */ -static struct sk_buff *alloc_rcv_buf(struct net_device *netdev) -{ - struct sk_buff *skb; - - /* NOTE: the first fragment in each rcv buffer is pointed to by - * rcvskb->data. For now all rcv buffers will be RCVPOST_BUF_SIZE - * in length, so the first frag is large enough to hold 1514. - */ - skb = alloc_skb(RCVPOST_BUF_SIZE, GFP_ATOMIC); - if (!skb) - return NULL; - skb->dev = netdev; - /* current value of mtu doesn't come into play here; large - * packets will just end up using multiple rcv buffers all of - * same size. - */ - skb->len = RCVPOST_BUF_SIZE; - /* alloc_skb already zeroes it out for clarification. */ - skb->data_len = 0; - return skb; -} - -/* post_skb - post a skb to the IO Partition - * @cmdrsp: Cmdrsp packet to be send to the IO Partition. - * @devdata: visornic_devdata to post the skb to. - * @skb: Skb to give to the IO partition. - * - * Return: 0 on success, negative integer on error. - */ -static int post_skb(struct uiscmdrsp *cmdrsp, struct visornic_devdata *devdata, - struct sk_buff *skb) -{ - int err; - - cmdrsp->net.buf = skb; - cmdrsp->net.rcvpost.frag.pi_pfn = page_to_pfn(virt_to_page(skb->data)); - cmdrsp->net.rcvpost.frag.pi_off = - (unsigned long)skb->data & PI_PAGE_MASK; - cmdrsp->net.rcvpost.frag.pi_len = skb->len; - cmdrsp->net.rcvpost.unique_num = devdata->incarnation_id; - - if ((cmdrsp->net.rcvpost.frag.pi_off + skb->len) > PI_PAGE_SIZE) - return -EINVAL; - - cmdrsp->net.type = NET_RCV_POST; - cmdrsp->cmdtype = CMD_NET_TYPE; - err = visorchannel_signalinsert(devdata->dev->visorchannel, - IOCHAN_TO_IOPART, - cmdrsp); - if (err) { - devdata->chstat.sent_post_failed++; - return err; - } - - atomic_inc(&devdata->num_rcvbuf_in_iovm); - devdata->chstat.sent_post++; - return 0; -} - -/* send_enbdis - Send NET_RCV_ENBDIS to IO Partition - * @netdev: Netdevice we are enabling/disabling, used as context return value. - * @state: Enable = 1/disable = 0. - * @devdata: Visornic device we are enabling/disabling. - * - * Send the enable/disable message to the IO Partition. - * - * Return: 0 on success, negative integer on error. - */ -static int send_enbdis(struct net_device *netdev, int state, - struct visornic_devdata *devdata) -{ - int err; - - devdata->cmdrsp_rcv->net.enbdis.enable = state; - devdata->cmdrsp_rcv->net.enbdis.context = netdev; - devdata->cmdrsp_rcv->net.type = NET_RCV_ENBDIS; - devdata->cmdrsp_rcv->cmdtype = CMD_NET_TYPE; - err = visorchannel_signalinsert(devdata->dev->visorchannel, - IOCHAN_TO_IOPART, - devdata->cmdrsp_rcv); - if (err) - return err; - devdata->chstat.sent_enbdis++; - return 0; -} - -/* visornic_disable_with_timeout - disable network adapter - * @netdev: netdevice to disable. - * @timeout: Timeout to wait for disable. - * - * Disable the network adapter and inform the IO Partition that we are disabled. - * Reclaim memory from rcv bufs. - * - * Return: 0 on success, negative integer on failure of IO Partition responding. - */ -static int visornic_disable_with_timeout(struct net_device *netdev, - const int timeout) -{ - struct visornic_devdata *devdata = netdev_priv(netdev); - int i; - unsigned long flags; - int wait = 0; - int err; - - /* send a msg telling the other end we are stopping incoming pkts */ - spin_lock_irqsave(&devdata->priv_lock, flags); - devdata->enabled = 0; - /* must wait for ack */ - devdata->enab_dis_acked = 0; - spin_unlock_irqrestore(&devdata->priv_lock, flags); - - /* send disable and wait for ack -- don't hold lock when sending - * disable because if the queue is full, insert might sleep. - * If an error occurs, don't wait for the timeout. - */ - err = send_enbdis(netdev, 0, devdata); - if (err) - return err; - - /* wait for ack to arrive before we try to free rcv buffers - * NOTE: the other end automatically unposts the rcv buffers - * when it gets a disable. - */ - spin_lock_irqsave(&devdata->priv_lock, flags); - while ((timeout == VISORNIC_INFINITE_RSP_WAIT) || - (wait < timeout)) { - if (devdata->enab_dis_acked) - break; - if (devdata->server_down || devdata->server_change_state) { - dev_dbg(&netdev->dev, "%s server went away\n", - __func__); - break; - } - set_current_state(TASK_INTERRUPTIBLE); - spin_unlock_irqrestore(&devdata->priv_lock, flags); - wait += schedule_timeout(msecs_to_jiffies(10)); - spin_lock_irqsave(&devdata->priv_lock, flags); - } - - /* Wait for usage to go to 1 (no other users) before freeing - * rcv buffers - */ - if (atomic_read(&devdata->usage) > 1) { - while (1) { - set_current_state(TASK_INTERRUPTIBLE); - spin_unlock_irqrestore(&devdata->priv_lock, flags); - schedule_timeout(msecs_to_jiffies(10)); - spin_lock_irqsave(&devdata->priv_lock, flags); - if (atomic_read(&devdata->usage)) - break; - } - } - /* we've set enabled to 0, so we can give up the lock. */ - spin_unlock_irqrestore(&devdata->priv_lock, flags); - - /* stop the transmit queue so nothing more can be transmitted */ - netif_stop_queue(netdev); - - napi_disable(&devdata->napi); - - skb_queue_purge(&devdata->xmitbufhead); - - /* Free rcv buffers - other end has automatically unposed them on - * disable - */ - for (i = 0; i < devdata->num_rcv_bufs; i++) { - if (devdata->rcvbuf[i]) { - kfree_skb(devdata->rcvbuf[i]); - devdata->rcvbuf[i] = NULL; - } - } - - return 0; -} - -/* init_rcv_bufs - initialize receive buffs and send them to the IO Partition - * @netdev: struct netdevice. - * @devdata: visornic_devdata. - * - * Allocate rcv buffers and post them to the IO Partition. - * - * Return: 0 on success, negative integer on failure. - */ -static int init_rcv_bufs(struct net_device *netdev, - struct visornic_devdata *devdata) -{ - int i, j, count, err; - - /* allocate fixed number of receive buffers to post to uisnic - * post receive buffers after we've allocated a required amount - */ - for (i = 0; i < devdata->num_rcv_bufs; i++) { - devdata->rcvbuf[i] = alloc_rcv_buf(netdev); - /* if we failed to allocate one let us stop */ - if (!devdata->rcvbuf[i]) - break; - } - /* couldn't even allocate one -- bail out */ - if (i == 0) - return -ENOMEM; - count = i; - - /* Ensure we can alloc 2/3rd of the requested number of buffers. - * 2/3 is an arbitrary choice; used also in ndis init.c - */ - if (count < ((2 * devdata->num_rcv_bufs) / 3)) { - /* free receive buffers we did alloc and then bail out */ - for (i = 0; i < count; i++) { - kfree_skb(devdata->rcvbuf[i]); - devdata->rcvbuf[i] = NULL; - } - return -ENOMEM; - } - - /* post receive buffers to receive incoming input - without holding - * lock - we've not enabled nor started the queue so there shouldn't - * be any rcv or xmit activity - */ - for (i = 0; i < count; i++) { - err = post_skb(devdata->cmdrsp_rcv, devdata, - devdata->rcvbuf[i]); - if (!err) - continue; - - /* Error handling - - * If we posted at least one skb, we should return success, - * but need to free the resources that we have not successfully - * posted. - */ - for (j = i; j < count; j++) { - kfree_skb(devdata->rcvbuf[j]); - devdata->rcvbuf[j] = NULL; - } - if (i == 0) - return err; - break; - } - - return 0; -} - -/* visornic_enable_with_timeout - send enable to IO Partition - * @netdev: struct net_device. - * @timeout: Time to wait for the ACK from the enable. - * - * Sends enable to IOVM and inits, and posts receive buffers to IOVM. Timeout is - * defined in msecs (timeout of 0 specifies infinite wait). - * - * Return: 0 on success, negative integer on failure. - */ -static int visornic_enable_with_timeout(struct net_device *netdev, - const int timeout) -{ - int err = 0; - struct visornic_devdata *devdata = netdev_priv(netdev); - unsigned long flags; - int wait = 0; - - napi_enable(&devdata->napi); - - /* NOTE: the other end automatically unposts the rcv buffers when it - * gets a disable. - */ - err = init_rcv_bufs(netdev, devdata); - if (err < 0) { - dev_err(&netdev->dev, - "%s failed to init rcv bufs\n", __func__); - return err; - } - - spin_lock_irqsave(&devdata->priv_lock, flags); - devdata->enabled = 1; - devdata->enab_dis_acked = 0; - - /* now we're ready, let's send an ENB to uisnic but until we get - * an ACK back from uisnic, we'll drop the packets - */ - devdata->n_rcv_packets_not_accepted = 0; - spin_unlock_irqrestore(&devdata->priv_lock, flags); - - /* send enable and wait for ack -- don't hold lock when sending enable - * because if the queue is full, insert might sleep. If an error - * occurs error out. - */ - err = send_enbdis(netdev, 1, devdata); - if (err) - return err; - - spin_lock_irqsave(&devdata->priv_lock, flags); - while ((timeout == VISORNIC_INFINITE_RSP_WAIT) || - (wait < timeout)) { - if (devdata->enab_dis_acked) - break; - if (devdata->server_down || devdata->server_change_state) { - dev_dbg(&netdev->dev, "%s server went away\n", - __func__); - break; - } - set_current_state(TASK_INTERRUPTIBLE); - spin_unlock_irqrestore(&devdata->priv_lock, flags); - wait += schedule_timeout(msecs_to_jiffies(10)); - spin_lock_irqsave(&devdata->priv_lock, flags); - } - - spin_unlock_irqrestore(&devdata->priv_lock, flags); - - if (!devdata->enab_dis_acked) { - dev_err(&netdev->dev, "%s missing ACK\n", __func__); - return -EIO; - } - - netif_start_queue(netdev); - return 0; -} - -/* visornic_timeout_reset - handle xmit timeout resets - * @work: Work item that scheduled the work. - * - * Transmit timeouts are typically handled by resetting the device for our - * virtual NIC; we will send a disable and enable to the IOVM. If it doesn't - * respond, we will trigger a serverdown. - */ -static void visornic_timeout_reset(struct work_struct *work) -{ - struct visornic_devdata *devdata; - struct net_device *netdev; - int response = 0; - - devdata = container_of(work, struct visornic_devdata, timeout_reset); - netdev = devdata->netdev; - - rtnl_lock(); - if (!netif_running(netdev)) { - rtnl_unlock(); - return; - } - - response = visornic_disable_with_timeout(netdev, - VISORNIC_INFINITE_RSP_WAIT); - if (response) - goto call_serverdown; - - response = visornic_enable_with_timeout(netdev, - VISORNIC_INFINITE_RSP_WAIT); - if (response) - goto call_serverdown; - - rtnl_unlock(); - - return; - -call_serverdown: - visornic_serverdown(devdata, NULL); - rtnl_unlock(); -} - -/* visornic_open - enable the visornic device and mark the queue started - * @netdev: netdevice to start. - * - * Enable the device and start the transmit queue. - * - * Return: 0 on success. - */ -static int visornic_open(struct net_device *netdev) -{ - visornic_enable_with_timeout(netdev, VISORNIC_INFINITE_RSP_WAIT); - return 0; -} - -/* visornic_close - disables the visornic device and stops the queues - * @netdev: netdevice to stop. - * - * Disable the device and stop the transmit queue. - * - * Return 0 on success. - */ -static int visornic_close(struct net_device *netdev) -{ - visornic_disable_with_timeout(netdev, VISORNIC_INFINITE_RSP_WAIT); - return 0; -} - -/* devdata_xmits_outstanding - compute outstanding xmits - * @devdata: visornic_devdata for device - * - * Return: Long integer representing the number of outstanding xmits. - */ -static unsigned long devdata_xmits_outstanding(struct visornic_devdata *devdata) -{ - if (devdata->chstat.sent_xmit >= devdata->chstat.got_xmit_done) - return devdata->chstat.sent_xmit - - devdata->chstat.got_xmit_done; - return (ULONG_MAX - devdata->chstat.got_xmit_done - + devdata->chstat.sent_xmit + 1); -} - -/* vnic_hit_high_watermark - * @devdata: Indicates visornic device we are checking. - * @high_watermark: Max num of unacked xmits we will tolerate before we will - * start throttling. - * - * Return: True iff the number of unacked xmits sent to the IO Partition is >= - * high_watermark. False otherwise. - */ -static bool vnic_hit_high_watermark(struct visornic_devdata *devdata, - ulong high_watermark) -{ - return (devdata_xmits_outstanding(devdata) >= high_watermark); -} - -/* vnic_hit_low_watermark - * @devdata: Indicates visornic device we are checking. - * @low_watermark: We will wait until the num of unacked xmits drops to this - * value or lower before we start transmitting again. - * - * Return: True iff the number of unacked xmits sent to the IO Partition is <= - * low_watermark. - */ -static bool vnic_hit_low_watermark(struct visornic_devdata *devdata, - ulong low_watermark) -{ - return (devdata_xmits_outstanding(devdata) <= low_watermark); -} - -/* visornic_xmit - send a packet to the IO Partition - * @skb: Packet to be sent. - * @netdev: Net device the packet is being sent from. - * - * Convert the skb to a cmdrsp so the IO Partition can understand it, and send - * the XMIT command to the IO Partition for processing. This function is - * protected from concurrent calls by a spinlock xmit_lock in the net_device - * struct. As soon as the function returns, it can be called again. - * - * Return: NETDEV_TX_OK. - */ -static netdev_tx_t visornic_xmit(struct sk_buff *skb, struct net_device *netdev) -{ - struct visornic_devdata *devdata; - int len, firstfraglen, padlen; - struct uiscmdrsp *cmdrsp = NULL; - unsigned long flags; - int err; - - devdata = netdev_priv(netdev); - spin_lock_irqsave(&devdata->priv_lock, flags); - - if (netif_queue_stopped(netdev) || devdata->server_down || - devdata->server_change_state) { - spin_unlock_irqrestore(&devdata->priv_lock, flags); - devdata->busy_cnt++; - dev_dbg(&netdev->dev, - "%s busy - queue stopped\n", __func__); - kfree_skb(skb); - return NETDEV_TX_OK; - } - - /* sk_buff struct is used to host network data throughout all the - * linux network subsystems - */ - len = skb->len; - - /* skb->len is the FULL length of data (including fragmentary portion) - * skb->data_len is the length of the fragment portion in frags - * skb->len - skb->data_len is size of the 1st fragment in skb->data - * calculate the length of the first fragment that skb->data is - * pointing to - */ - firstfraglen = skb->len - skb->data_len; - if (firstfraglen < ETH_HLEN) { - spin_unlock_irqrestore(&devdata->priv_lock, flags); - devdata->busy_cnt++; - dev_err(&netdev->dev, - "%s busy - first frag too small (%d)\n", - __func__, firstfraglen); - kfree_skb(skb); - return NETDEV_TX_OK; - } - - if (len < ETH_MIN_PACKET_SIZE && - ((skb_end_pointer(skb) - skb->data) >= ETH_MIN_PACKET_SIZE)) { - /* pad the packet out to minimum size */ - padlen = ETH_MIN_PACKET_SIZE - len; - skb_put_zero(skb, padlen); - len += padlen; - firstfraglen += padlen; - } - - cmdrsp = devdata->xmit_cmdrsp; - /* clear cmdrsp */ - memset(cmdrsp, 0, SIZEOF_CMDRSP); - cmdrsp->net.type = NET_XMIT; - cmdrsp->cmdtype = CMD_NET_TYPE; - - /* save the pointer to skb -- we'll need it for completion */ - cmdrsp->net.buf = skb; - - if (vnic_hit_high_watermark(devdata, - devdata->max_outstanding_net_xmits)) { - /* extra NET_XMITs queued over to IOVM - need to wait */ - devdata->chstat.reject_count++; - if (!devdata->queuefullmsg_logged && - ((devdata->chstat.reject_count & 0x3ff) == 1)) - devdata->queuefullmsg_logged = 1; - netif_stop_queue(netdev); - spin_unlock_irqrestore(&devdata->priv_lock, flags); - devdata->busy_cnt++; - dev_dbg(&netdev->dev, - "%s busy - waiting for iovm to catch up\n", - __func__); - kfree_skb(skb); - return NETDEV_TX_OK; - } - if (devdata->queuefullmsg_logged) - devdata->queuefullmsg_logged = 0; - - if (skb->ip_summed == CHECKSUM_UNNECESSARY) { - cmdrsp->net.xmt.lincsum.valid = 1; - cmdrsp->net.xmt.lincsum.protocol = skb->protocol; - if (skb_transport_header(skb) > skb->data) { - cmdrsp->net.xmt.lincsum.hrawoff = - skb_transport_header(skb) - skb->data; - cmdrsp->net.xmt.lincsum.hrawoff = 1; - } - if (skb_network_header(skb) > skb->data) { - cmdrsp->net.xmt.lincsum.nhrawoff = - skb_network_header(skb) - skb->data; - cmdrsp->net.xmt.lincsum.nhrawoffv = 1; - } - cmdrsp->net.xmt.lincsum.csum = skb->csum; - } else { - cmdrsp->net.xmt.lincsum.valid = 0; - } - - /* save off the length of the entire data packet */ - cmdrsp->net.xmt.len = len; - - /* copy ethernet header from first frag into ocmdrsp - * - everything else will be pass in frags & DMA'ed - */ - memcpy(cmdrsp->net.xmt.ethhdr, skb->data, ETH_HLEN); - - /* copy frags info - from skb->data we need to only provide access - * beyond eth header - */ - cmdrsp->net.xmt.num_frags = - visor_copy_fragsinfo_from_skb(skb, firstfraglen, - MAX_PHYS_INFO, - cmdrsp->net.xmt.frags); - if (cmdrsp->net.xmt.num_frags < 0) { - spin_unlock_irqrestore(&devdata->priv_lock, flags); - devdata->busy_cnt++; - dev_err(&netdev->dev, - "%s busy - copy frags failed\n", __func__); - kfree_skb(skb); - return NETDEV_TX_OK; - } - - err = visorchannel_signalinsert(devdata->dev->visorchannel, - IOCHAN_TO_IOPART, cmdrsp); - if (err) { - netif_stop_queue(netdev); - spin_unlock_irqrestore(&devdata->priv_lock, flags); - devdata->busy_cnt++; - dev_dbg(&netdev->dev, - "%s busy - signalinsert failed\n", __func__); - kfree_skb(skb); - return NETDEV_TX_OK; - } - - /* Track the skbs that have been sent to the IOVM for XMIT */ - skb_queue_head(&devdata->xmitbufhead, skb); - - /* update xmt stats */ - devdata->net_stats.tx_packets++; - devdata->net_stats.tx_bytes += skb->len; - devdata->chstat.sent_xmit++; - - /* check if we have hit the high watermark for netif_stop_queue() */ - if (vnic_hit_high_watermark(devdata, - devdata->upper_threshold_net_xmits)) { - /* extra NET_XMITs queued over to IOVM - need to wait */ - /* stop queue - call netif_wake_queue() after lower threshold */ - netif_stop_queue(netdev); - dev_dbg(&netdev->dev, - "%s busy - invoking iovm flow control\n", - __func__); - devdata->flow_control_upper_hits++; - } - spin_unlock_irqrestore(&devdata->priv_lock, flags); - - /* skb will be freed when we get back NET_XMIT_DONE */ - return NETDEV_TX_OK; -} - -/* visornic_get_stats - returns net_stats of the visornic device - * @netdev: netdevice. - * - * Return: Pointer to the net_device_stats struct for the device. - */ -static struct net_device_stats *visornic_get_stats(struct net_device *netdev) -{ - struct visornic_devdata *devdata = netdev_priv(netdev); - - return &devdata->net_stats; -} - -/* visornic_change_mtu - changes mtu of device - * @netdev: netdevice. - * @new_mtu: Value of new mtu. - * - * The device's MTU cannot be changed by system; it must be changed via a - * CONTROLVM message. All vnics and pnics in a switch have to have the same MTU - * for everything to work. Currently not supported. - * - * Return: -EINVAL. - */ -static int visornic_change_mtu(struct net_device *netdev, int new_mtu) -{ - return -EINVAL; -} - -/* visornic_set_multi - set visornic device flags - * @netdev: netdevice. - * - * The only flag we currently support is IFF_PROMISC. - */ -static void visornic_set_multi(struct net_device *netdev) -{ - struct uiscmdrsp *cmdrsp; - struct visornic_devdata *devdata = netdev_priv(netdev); - int err = 0; - - if (devdata->old_flags == netdev->flags) - return; - - if ((netdev->flags & IFF_PROMISC) == - (devdata->old_flags & IFF_PROMISC)) - goto out_save_flags; - - cmdrsp = kmalloc(SIZEOF_CMDRSP, GFP_ATOMIC); - if (!cmdrsp) - return; - cmdrsp->cmdtype = CMD_NET_TYPE; - cmdrsp->net.type = NET_RCV_PROMISC; - cmdrsp->net.enbdis.context = netdev; - cmdrsp->net.enbdis.enable = - netdev->flags & IFF_PROMISC; - err = visorchannel_signalinsert(devdata->dev->visorchannel, - IOCHAN_TO_IOPART, - cmdrsp); - kfree(cmdrsp); - if (err) - return; - -out_save_flags: - devdata->old_flags = netdev->flags; -} - -/* visornic_xmit_timeout - request to timeout the xmit - * @netdev: netdevice. - * - * Queue the work and return. Make sure we have not already been informed that - * the IO Partition is gone; if so, we will have already timed-out the xmits. - */ -static void visornic_xmit_timeout(struct net_device *netdev, unsigned int txqueue) -{ - struct visornic_devdata *devdata = netdev_priv(netdev); - unsigned long flags; - - spin_lock_irqsave(&devdata->priv_lock, flags); - if (devdata->going_away) { - spin_unlock_irqrestore(&devdata->priv_lock, flags); - dev_dbg(&devdata->dev->device, - "%s aborting because device removal pending\n", - __func__); - return; - } - - /* Ensure that a ServerDown message hasn't been received */ - if (!devdata->enabled || - (devdata->server_down && !devdata->server_change_state)) { - dev_dbg(&netdev->dev, "%s no processing\n", - __func__); - spin_unlock_irqrestore(&devdata->priv_lock, flags); - return; - } - schedule_work(&devdata->timeout_reset); - spin_unlock_irqrestore(&devdata->priv_lock, flags); -} - -/* repost_return - repost rcv bufs that have come back - * @cmdrsp: IO channel command struct to post. - * @devdata: Visornic devdata for the device. - * @skb: Socket buffer. - * @netdev: netdevice. - * - * Repost rcv buffers that have been returned to us when we are finished - * with them. - * - * Return: 0 for success, negative integer on error. - */ -static int repost_return(struct uiscmdrsp *cmdrsp, - struct visornic_devdata *devdata, - struct sk_buff *skb, struct net_device *netdev) -{ - struct net_pkt_rcv copy; - int i = 0, cc, numreposted; - int found_skb = 0; - int status = 0; - - copy = cmdrsp->net.rcv; - switch (copy.numrcvbufs) { - case 0: - devdata->n_rcv0++; - break; - case 1: - devdata->n_rcv1++; - break; - case 2: - devdata->n_rcv2++; - break; - default: - devdata->n_rcvx++; - break; - } - for (cc = 0, numreposted = 0; cc < copy.numrcvbufs; cc++) { - for (i = 0; i < devdata->num_rcv_bufs; i++) { - if (devdata->rcvbuf[i] != copy.rcvbuf[cc]) - continue; - - if ((skb) && devdata->rcvbuf[i] == skb) { - devdata->found_repost_rcvbuf_cnt++; - found_skb = 1; - devdata->repost_found_skb_cnt++; - } - devdata->rcvbuf[i] = alloc_rcv_buf(netdev); - if (!devdata->rcvbuf[i]) { - devdata->num_rcv_bufs_could_not_alloc++; - devdata->alloc_failed_in_repost_rtn_cnt++; - status = -ENOMEM; - break; - } - status = post_skb(cmdrsp, devdata, devdata->rcvbuf[i]); - if (status) { - kfree_skb(devdata->rcvbuf[i]); - devdata->rcvbuf[i] = NULL; - break; - } - numreposted++; - break; - } - } - if (numreposted != copy.numrcvbufs) { - devdata->n_repost_deficit++; - status = -EINVAL; - } - if (skb) { - if (found_skb) { - kfree_skb(skb); - } else { - status = -EINVAL; - devdata->bad_rcv_buf++; - } - } - return status; -} - -/* visornic_rx - handle receive packets coming back from IO Partition - * @cmdrsp: Receive packet returned from IO Partition. - * - * Got a receive packet back from the IO Partition; handle it and send it up - * the stack. - - * Return: 1 iff an skb was received, otherwise 0. - */ -static int visornic_rx(struct uiscmdrsp *cmdrsp) -{ - struct visornic_devdata *devdata; - struct sk_buff *skb, *prev, *curr; - struct net_device *netdev; - int cc, currsize, off; - struct ethhdr *eth; - unsigned long flags; - - /* post new rcv buf to the other end using the cmdrsp we have at hand - * post it without holding lock - but we'll use the signal lock to - * synchronize the queue insert the cmdrsp that contains the net.rcv - * is the one we are using to repost, so copy the info we need from it. - */ - skb = cmdrsp->net.buf; - netdev = skb->dev; - - devdata = netdev_priv(netdev); - - spin_lock_irqsave(&devdata->priv_lock, flags); - atomic_dec(&devdata->num_rcvbuf_in_iovm); - - /* set length to how much was ACTUALLY received - - * NOTE: rcv_done_len includes actual length of data rcvd - * including ethhdr - */ - skb->len = cmdrsp->net.rcv.rcv_done_len; - - /* update rcv stats - call it with priv_lock held */ - devdata->net_stats.rx_packets++; - devdata->net_stats.rx_bytes += skb->len; - - /* test enabled while holding lock */ - if (!(devdata->enabled && devdata->enab_dis_acked)) { - /* don't process it unless we're in enable mode and until - * we've gotten an ACK saying the other end got our RCV enable - */ - spin_unlock_irqrestore(&devdata->priv_lock, flags); - repost_return(cmdrsp, devdata, skb, netdev); - return 0; - } - - spin_unlock_irqrestore(&devdata->priv_lock, flags); - - /* when skb was allocated, skb->dev, skb->data, skb->len and - * skb->data_len were setup. AND, data has already put into the - * skb (both first frag and in frags pages) - * NOTE: firstfragslen is the amount of data in skb->data and that - * which is not in nr_frags or frag_list. This is now simply - * RCVPOST_BUF_SIZE. bump tail to show how much data is in - * firstfrag & set data_len to show rest see if we have to chain - * frag_list. - */ - /* do PRECAUTIONARY check */ - if (skb->len > RCVPOST_BUF_SIZE) { - if (cmdrsp->net.rcv.numrcvbufs < 2) { - if (repost_return(cmdrsp, devdata, skb, netdev) < 0) - dev_err(&devdata->netdev->dev, - "repost_return failed"); - return 0; - } - /* length rcvd is greater than firstfrag in this skb rcv buf */ - /* amount in skb->data */ - skb->tail += RCVPOST_BUF_SIZE; - /* amount that will be in frag_list */ - skb->data_len = skb->len - RCVPOST_BUF_SIZE; - } else { - /* data fits in this skb - no chaining - do - * PRECAUTIONARY check - */ - /* should be 1 */ - if (cmdrsp->net.rcv.numrcvbufs != 1) { - if (repost_return(cmdrsp, devdata, skb, netdev) < 0) - dev_err(&devdata->netdev->dev, - "repost_return failed"); - return 0; - } - skb->tail += skb->len; - /* nothing rcvd in frag_list */ - skb->data_len = 0; - } - off = skb_tail_pointer(skb) - skb->data; - - /* amount we bumped tail by in the head skb - * it is used to calculate the size of each chained skb below - * it is also used to index into bufline to continue the copy - * (for chansocktwopc) - * if necessary chain the rcv skbs together. - * NOTE: index 0 has the same as cmdrsp->net.rcv.skb; we need to - * chain the rest to that one. - * - do PRECAUTIONARY check - */ - if (cmdrsp->net.rcv.rcvbuf[0] != skb) { - if (repost_return(cmdrsp, devdata, skb, netdev) < 0) - dev_err(&devdata->netdev->dev, "repost_return failed"); - return 0; - } - - if (cmdrsp->net.rcv.numrcvbufs > 1) { - /* chain the various rcv buffers into the skb's frag_list. */ - /* Note: off was initialized above */ - for (cc = 1, prev = NULL; - cc < cmdrsp->net.rcv.numrcvbufs; cc++) { - curr = (struct sk_buff *)cmdrsp->net.rcv.rcvbuf[cc]; - curr->next = NULL; - /* start of list- set head */ - if (!prev) - skb_shinfo(skb)->frag_list = curr; - else - prev->next = curr; - prev = curr; - - /* should we set skb->len and skb->data_len for each - * buffer being chained??? can't hurt! - */ - currsize = min(skb->len - off, - (unsigned int)RCVPOST_BUF_SIZE); - curr->len = currsize; - curr->tail += currsize; - curr->data_len = 0; - off += currsize; - } - /* assert skb->len == off */ - if (skb->len != off) { - netdev_err(devdata->netdev, - "something wrong; skb->len:%d != off:%d\n", - skb->len, off); - } - } - - /* set up packet's protocol type using ethernet header - this - * sets up skb->pkt_type & it also PULLS out the eth header - */ - skb->protocol = eth_type_trans(skb, netdev); - eth = eth_hdr(skb); - skb->csum = 0; - skb->ip_summed = CHECKSUM_NONE; - - do { - /* accept all packets */ - if (netdev->flags & IFF_PROMISC) - break; - if (skb->pkt_type == PACKET_BROADCAST) { - /* accept all broadcast packets */ - if (netdev->flags & IFF_BROADCAST) - break; - } else if (skb->pkt_type == PACKET_MULTICAST) { - if ((netdev->flags & IFF_MULTICAST) && - (netdev_mc_count(netdev))) { - struct netdev_hw_addr *ha; - int found_mc = 0; - - /* only accept multicast packets that we can - * find in our multicast address list - */ - netdev_for_each_mc_addr(ha, netdev) { - if (ether_addr_equal(eth->h_dest, - ha->addr)) { - found_mc = 1; - break; - } - } - /* accept pkt, dest matches a multicast addr */ - if (found_mc) - break; - } - /* accept packet, h_dest must match vnic mac address */ - } else if (skb->pkt_type == PACKET_HOST) { - break; - } else if (skb->pkt_type == PACKET_OTHERHOST) { - /* something is not right */ - dev_err(&devdata->netdev->dev, - "**** FAILED to deliver rcv packet to OS; name:%s Dest:%pM VNIC:%pM\n", - netdev->name, eth->h_dest, netdev->dev_addr); - } - /* drop packet - don't forward it up to OS */ - devdata->n_rcv_packets_not_accepted++; - repost_return(cmdrsp, devdata, skb, netdev); - return 0; - } while (0); - - netif_receive_skb(skb); - /* netif_rx returns various values, but "in practice most drivers - * ignore the return value - */ - - skb = NULL; - /* whether the packet got dropped or handled, the skb is freed by - * kernel code, so we shouldn't free it. but we should repost a - * new rcv buffer. - */ - repost_return(cmdrsp, devdata, skb, netdev); - return 1; -} - -/* devdata_initialize - initialize devdata structure - * @devdata: visornic_devdata structure to initialize. - * @dev: visorbus_device it belongs to. - * - * Setup initial values for the visornic, based on channel and default values. - * - * Return: A pointer to the devdata structure. - */ -static struct visornic_devdata *devdata_initialize( - struct visornic_devdata *devdata, - struct visor_device *dev) -{ - devdata->dev = dev; - devdata->incarnation_id = get_jiffies_64(); - return devdata; -} - -/* devdata_release - free up references in devdata - * @devdata: Struct to clean up. - */ -static void devdata_release(struct visornic_devdata *devdata) -{ - kfree(devdata->rcvbuf); - kfree(devdata->cmdrsp_rcv); - kfree(devdata->xmit_cmdrsp); -} - -static const struct net_device_ops visornic_dev_ops = { - .ndo_open = visornic_open, - .ndo_stop = visornic_close, - .ndo_start_xmit = visornic_xmit, - .ndo_get_stats = visornic_get_stats, - .ndo_change_mtu = visornic_change_mtu, - .ndo_tx_timeout = visornic_xmit_timeout, - .ndo_set_rx_mode = visornic_set_multi, -}; - -/* DebugFS code */ -static ssize_t info_debugfs_read(struct file *file, char __user *buf, - size_t len, loff_t *offset) -{ - ssize_t bytes_read = 0; - int str_pos = 0; - struct visornic_devdata *devdata; - struct net_device *dev; - char *vbuf; - - if (len > MAX_BUF) - len = MAX_BUF; - vbuf = kzalloc(len, GFP_KERNEL); - if (!vbuf) - return -ENOMEM; - - /* for each vnic channel dump out channel specific data */ - rcu_read_lock(); - for_each_netdev_rcu(current->nsproxy->net_ns, dev) { - /* Only consider netdevs that are visornic, and are open */ - if (dev->netdev_ops != &visornic_dev_ops || - (!netif_queue_stopped(dev))) - continue; - - devdata = netdev_priv(dev); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - "netdev = %s (0x%p), MAC Addr %pM\n", - dev->name, - dev, - dev->dev_addr); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - "VisorNic Dev Info = 0x%p\n", devdata); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " num_rcv_bufs = %d\n", - devdata->num_rcv_bufs); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " max_outstanding_next_xmits = %lu\n", - devdata->max_outstanding_net_xmits); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " upper_threshold_net_xmits = %lu\n", - devdata->upper_threshold_net_xmits); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " lower_threshold_net_xmits = %lu\n", - devdata->lower_threshold_net_xmits); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " queuefullmsg_logged = %d\n", - devdata->queuefullmsg_logged); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " chstat.got_rcv = %lu\n", - devdata->chstat.got_rcv); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " chstat.got_enbdisack = %lu\n", - devdata->chstat.got_enbdisack); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " chstat.got_xmit_done = %lu\n", - devdata->chstat.got_xmit_done); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " chstat.xmit_fail = %lu\n", - devdata->chstat.xmit_fail); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " chstat.sent_enbdis = %lu\n", - devdata->chstat.sent_enbdis); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " chstat.sent_promisc = %lu\n", - devdata->chstat.sent_promisc); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " chstat.sent_post = %lu\n", - devdata->chstat.sent_post); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " chstat.sent_post_failed = %lu\n", - devdata->chstat.sent_post_failed); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " chstat.sent_xmit = %lu\n", - devdata->chstat.sent_xmit); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " chstat.reject_count = %lu\n", - devdata->chstat.reject_count); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " chstat.extra_rcvbufs_sent = %lu\n", - devdata->chstat.extra_rcvbufs_sent); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " n_rcv0 = %lu\n", devdata->n_rcv0); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " n_rcv1 = %lu\n", devdata->n_rcv1); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " n_rcv2 = %lu\n", devdata->n_rcv2); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " n_rcvx = %lu\n", devdata->n_rcvx); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " num_rcvbuf_in_iovm = %d\n", - atomic_read(&devdata->num_rcvbuf_in_iovm)); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " alloc_failed_in_if_needed_cnt = %lu\n", - devdata->alloc_failed_in_if_needed_cnt); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " alloc_failed_in_repost_rtn_cnt = %lu\n", - devdata->alloc_failed_in_repost_rtn_cnt); - /* str_pos += scnprintf(vbuf + str_pos, len - str_pos, - * " inner_loop_limit_reached_cnt = %lu\n", - * devdata->inner_loop_limit_reached_cnt); - */ - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " found_repost_rcvbuf_cnt = %lu\n", - devdata->found_repost_rcvbuf_cnt); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " repost_found_skb_cnt = %lu\n", - devdata->repost_found_skb_cnt); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " n_repost_deficit = %lu\n", - devdata->n_repost_deficit); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " bad_rcv_buf = %lu\n", - devdata->bad_rcv_buf); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " n_rcv_packets_not_accepted = %lu\n", - devdata->n_rcv_packets_not_accepted); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " interrupts_rcvd = %llu\n", - devdata->interrupts_rcvd); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " interrupts_notme = %llu\n", - devdata->interrupts_notme); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " interrupts_disabled = %llu\n", - devdata->interrupts_disabled); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " busy_cnt = %llu\n", - devdata->busy_cnt); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " flow_control_upper_hits = %llu\n", - devdata->flow_control_upper_hits); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " flow_control_lower_hits = %llu\n", - devdata->flow_control_lower_hits); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " netif_queue = %s\n", - netif_queue_stopped(devdata->netdev) ? - "stopped" : "running"); - str_pos += scnprintf(vbuf + str_pos, len - str_pos, - " xmits_outstanding = %lu\n", - devdata_xmits_outstanding(devdata)); - } - rcu_read_unlock(); - bytes_read = simple_read_from_buffer(buf, len, offset, vbuf, str_pos); - kfree(vbuf); - return bytes_read; -} - -static struct dentry *visornic_debugfs_dir; -static const struct file_operations debugfs_info_fops = { - .read = info_debugfs_read, -}; - -/* send_rcv_posts_if_needed - send receive buffers to the IO Partition. - * @devdata: Visornic device. - */ -static void send_rcv_posts_if_needed(struct visornic_devdata *devdata) -{ - int i; - struct net_device *netdev; - struct uiscmdrsp *cmdrsp = devdata->cmdrsp_rcv; - int cur_num_rcv_bufs_to_alloc, rcv_bufs_allocated; - int err; - - /* don't do this until vnic is marked ready */ - if (!(devdata->enabled && devdata->enab_dis_acked)) - return; - - netdev = devdata->netdev; - rcv_bufs_allocated = 0; - /* this code is trying to prevent getting stuck here forever, - * but still retry it if you can't allocate them all this time. - */ - cur_num_rcv_bufs_to_alloc = devdata->num_rcv_bufs_could_not_alloc; - while (cur_num_rcv_bufs_to_alloc > 0) { - cur_num_rcv_bufs_to_alloc--; - for (i = 0; i < devdata->num_rcv_bufs; i++) { - if (devdata->rcvbuf[i]) - continue; - devdata->rcvbuf[i] = alloc_rcv_buf(netdev); - if (!devdata->rcvbuf[i]) { - devdata->alloc_failed_in_if_needed_cnt++; - break; - } - rcv_bufs_allocated++; - err = post_skb(cmdrsp, devdata, devdata->rcvbuf[i]); - if (err) { - kfree_skb(devdata->rcvbuf[i]); - devdata->rcvbuf[i] = NULL; - break; - } - devdata->chstat.extra_rcvbufs_sent++; - } - } - devdata->num_rcv_bufs_could_not_alloc -= rcv_bufs_allocated; -} - -/* drain_resp_queue - drains and ignores all messages from the resp queue - * @cmdrsp: IO channel command response message. - * @devdata: Visornic device to drain. - */ -static void drain_resp_queue(struct uiscmdrsp *cmdrsp, - struct visornic_devdata *devdata) -{ - while (!visorchannel_signalremove(devdata->dev->visorchannel, - IOCHAN_FROM_IOPART, - cmdrsp)) - ; -} - -/* service_resp_queue - drain the response queue - * @cmdrsp: IO channel command response message. - * @devdata: Visornic device to drain. - * @rx_work_done: - * @budget: - * - * Drain the response queue of any responses from the IO Partition. Process the - * responses as we get them. - */ -static void service_resp_queue(struct uiscmdrsp *cmdrsp, - struct visornic_devdata *devdata, - int *rx_work_done, int budget) -{ - unsigned long flags; - struct net_device *netdev; - - while (*rx_work_done < budget) { - /* TODO: CLIENT ACQUIRE -- Don't really need this at the - * moment - */ - /* queue empty */ - if (visorchannel_signalremove(devdata->dev->visorchannel, - IOCHAN_FROM_IOPART, - cmdrsp)) - break; - - switch (cmdrsp->net.type) { - case NET_RCV: - devdata->chstat.got_rcv++; - /* process incoming packet */ - *rx_work_done += visornic_rx(cmdrsp); - break; - case NET_XMIT_DONE: - spin_lock_irqsave(&devdata->priv_lock, flags); - devdata->chstat.got_xmit_done++; - if (cmdrsp->net.xmtdone.xmt_done_result) - devdata->chstat.xmit_fail++; - /* only call queue wake if we stopped it */ - netdev = ((struct sk_buff *)cmdrsp->net.buf)->dev; - /* ASSERT netdev == vnicinfo->netdev; */ - if (netdev == devdata->netdev && - netif_queue_stopped(netdev)) { - /* check if we have crossed the lower watermark - * for netif_wake_queue() - */ - if (vnic_hit_low_watermark - (devdata, - devdata->lower_threshold_net_xmits)) { - /* enough NET_XMITs completed - * so can restart netif queue - */ - netif_wake_queue(netdev); - devdata->flow_control_lower_hits++; - } - } - skb_unlink(cmdrsp->net.buf, &devdata->xmitbufhead); - spin_unlock_irqrestore(&devdata->priv_lock, flags); - kfree_skb(cmdrsp->net.buf); - break; - case NET_RCV_ENBDIS_ACK: - devdata->chstat.got_enbdisack++; - netdev = (struct net_device *) - cmdrsp->net.enbdis.context; - spin_lock_irqsave(&devdata->priv_lock, flags); - devdata->enab_dis_acked = 1; - spin_unlock_irqrestore(&devdata->priv_lock, flags); - - if (devdata->server_down && - devdata->server_change_state) { - /* Inform Linux that the link is up */ - devdata->server_down = false; - devdata->server_change_state = false; - netif_wake_queue(netdev); - netif_carrier_on(netdev); - } - break; - case NET_CONNECT_STATUS: - netdev = devdata->netdev; - if (cmdrsp->net.enbdis.enable == 1) { - spin_lock_irqsave(&devdata->priv_lock, flags); - devdata->enabled = cmdrsp->net.enbdis.enable; - spin_unlock_irqrestore(&devdata->priv_lock, - flags); - netif_wake_queue(netdev); - netif_carrier_on(netdev); - } else { - netif_stop_queue(netdev); - netif_carrier_off(netdev); - spin_lock_irqsave(&devdata->priv_lock, flags); - devdata->enabled = cmdrsp->net.enbdis.enable; - spin_unlock_irqrestore(&devdata->priv_lock, - flags); - } - break; - default: - break; - } - /* cmdrsp is now available for reuse */ - } -} - -static int visornic_poll(struct napi_struct *napi, int budget) -{ - struct visornic_devdata *devdata = container_of(napi, - struct visornic_devdata, - napi); - int rx_count = 0; - - send_rcv_posts_if_needed(devdata); - service_resp_queue(devdata->cmdrsp, devdata, &rx_count, budget); - - /* If there aren't any more packets to receive stop the poll */ - if (rx_count < budget) - napi_complete_done(napi, rx_count); - - return rx_count; -} - -/* visornic_channel_interrupt - checks the status of the response queue - * - * Main function of the vnic_incoming thread. Periodically check the response - * queue and drain it if needed. - */ -static void visornic_channel_interrupt(struct visor_device *dev) -{ - struct visornic_devdata *devdata = dev_get_drvdata(&dev->device); - - if (!devdata) - return; - - if (!visorchannel_signalempty(devdata->dev->visorchannel, - IOCHAN_FROM_IOPART)) - napi_schedule(&devdata->napi); - - atomic_set(&devdata->interrupt_rcvd, 0); -} - -/* visornic_probe - probe function for visornic devices - * @dev: The visor device discovered. - * - * Called when visorbus discovers a visornic device on its bus. It creates a new - * visornic ethernet adapter. - * - * Return: 0 on success, or negative integer on error. - */ -static int visornic_probe(struct visor_device *dev) -{ - struct visornic_devdata *devdata = NULL; - struct net_device *netdev = NULL; - int err; - int channel_offset = 0; - u8 addr[ETH_ALEN]; - u64 features; - - netdev = alloc_etherdev(sizeof(struct visornic_devdata)); - if (!netdev) { - dev_err(&dev->device, - "%s alloc_etherdev failed\n", __func__); - return -ENOMEM; - } - - netdev->netdev_ops = &visornic_dev_ops; - netdev->watchdog_timeo = 5 * HZ; - SET_NETDEV_DEV(netdev, &dev->device); - - /* Get MAC address from channel and read it into the device. */ - netdev->addr_len = ETH_ALEN; - channel_offset = offsetof(struct visor_io_channel, vnic.macaddr); - err = visorbus_read_channel(dev, channel_offset, addr, ETH_ALEN); - if (err < 0) { - dev_err(&dev->device, - "%s failed to get mac addr from chan (%d)\n", - __func__, err); - goto cleanup_netdev; - } - eth_hw_addr_set(netdev, addr); - - devdata = devdata_initialize(netdev_priv(netdev), dev); - if (!devdata) { - dev_err(&dev->device, - "%s devdata_initialize failed\n", __func__); - err = -ENOMEM; - goto cleanup_netdev; - } - /* don't trust messages laying around in the channel */ - drain_resp_queue(devdata->cmdrsp, devdata); - - devdata->netdev = netdev; - dev_set_drvdata(&dev->device, devdata); - init_waitqueue_head(&devdata->rsp_queue); - spin_lock_init(&devdata->priv_lock); - /* not yet */ - devdata->enabled = 0; - atomic_set(&devdata->usage, 1); - - /* Setup rcv bufs */ - channel_offset = offsetof(struct visor_io_channel, vnic.num_rcv_bufs); - err = visorbus_read_channel(dev, channel_offset, - &devdata->num_rcv_bufs, 4); - if (err) { - dev_err(&dev->device, - "%s failed to get #rcv bufs from chan (%d)\n", - __func__, err); - goto cleanup_netdev; - } - - devdata->rcvbuf = kcalloc(devdata->num_rcv_bufs, - sizeof(struct sk_buff *), GFP_KERNEL); - if (!devdata->rcvbuf) { - err = -ENOMEM; - goto cleanup_netdev; - } - - /* set the net_xmit outstanding threshold - * always leave two slots open but you should have 3 at a minimum - * note that max_outstanding_net_xmits must be > 0 - */ - devdata->max_outstanding_net_xmits = - max_t(unsigned long, 3, ((devdata->num_rcv_bufs / 3) - 2)); - devdata->upper_threshold_net_xmits = - max_t(unsigned long, - 2, (devdata->max_outstanding_net_xmits - 1)); - devdata->lower_threshold_net_xmits = - max_t(unsigned long, - 1, (devdata->max_outstanding_net_xmits / 2)); - - skb_queue_head_init(&devdata->xmitbufhead); - - /* create a cmdrsp we can use to post and unpost rcv buffers */ - devdata->cmdrsp_rcv = kmalloc(SIZEOF_CMDRSP, GFP_KERNEL); - if (!devdata->cmdrsp_rcv) { - err = -ENOMEM; - goto cleanup_rcvbuf; - } - devdata->xmit_cmdrsp = kmalloc(SIZEOF_CMDRSP, GFP_KERNEL); - if (!devdata->xmit_cmdrsp) { - err = -ENOMEM; - goto cleanup_cmdrsp_rcv; - } - INIT_WORK(&devdata->timeout_reset, visornic_timeout_reset); - devdata->server_down = false; - devdata->server_change_state = false; - - /*set the default mtu */ - channel_offset = offsetof(struct visor_io_channel, vnic.mtu); - err = visorbus_read_channel(dev, channel_offset, &netdev->mtu, 4); - if (err) { - dev_err(&dev->device, - "%s failed to get mtu from chan (%d)\n", - __func__, err); - goto cleanup_xmit_cmdrsp; - } - - /* TODO: Setup Interrupt information */ - /* Let's start our threads to get responses */ - netif_napi_add(netdev, &devdata->napi, visornic_poll, NAPI_WEIGHT); - - channel_offset = offsetof(struct visor_io_channel, - channel_header.features); - err = visorbus_read_channel(dev, channel_offset, &features, 8); - if (err) { - dev_err(&dev->device, - "%s failed to get features from chan (%d)\n", - __func__, err); - goto cleanup_napi_add; - } - - features |= VISOR_CHANNEL_IS_POLLING; - features |= VISOR_DRIVER_ENHANCED_RCVBUF_CHECKING; - err = visorbus_write_channel(dev, channel_offset, &features, 8); - if (err) { - dev_err(&dev->device, - "%s failed to set features in chan (%d)\n", - __func__, err); - goto cleanup_napi_add; - } - - /* Note: Interrupts have to be enable before the while - * loop below because the napi routine is responsible for - * setting enab_dis_acked - */ - visorbus_enable_channel_interrupts(dev); - - err = register_netdev(netdev); - if (err) { - dev_err(&dev->device, - "%s register_netdev failed (%d)\n", __func__, err); - goto cleanup_napi_add; - } - - /* create debug/sysfs directories */ - devdata->eth_debugfs_dir = debugfs_create_dir(netdev->name, - visornic_debugfs_dir); - if (!devdata->eth_debugfs_dir) { - dev_err(&dev->device, - "%s debugfs_create_dir %s failed\n", - __func__, netdev->name); - err = -ENOMEM; - goto cleanup_register_netdev; - } - - dev_info(&dev->device, "%s success netdev=%s\n", - __func__, netdev->name); - return 0; - -cleanup_register_netdev: - unregister_netdev(netdev); - -cleanup_napi_add: - visorbus_disable_channel_interrupts(dev); - netif_napi_del(&devdata->napi); - -cleanup_xmit_cmdrsp: - kfree(devdata->xmit_cmdrsp); - -cleanup_cmdrsp_rcv: - kfree(devdata->cmdrsp_rcv); - -cleanup_rcvbuf: - kfree(devdata->rcvbuf); - -cleanup_netdev: - free_netdev(netdev); - return err; -} - -/* host_side_disappeared - IO Partition is gone - * @devdata: Device object. - * - * IO partition servicing this device is gone; do cleanup. - */ -static void host_side_disappeared(struct visornic_devdata *devdata) -{ - unsigned long flags; - - spin_lock_irqsave(&devdata->priv_lock, flags); - /* indicate device destroyed */ - devdata->dev = NULL; - spin_unlock_irqrestore(&devdata->priv_lock, flags); -} - -/* visornic_remove - called when visornic dev goes away - * @dev: Visornic device that is being removed. - * - * Called when DEVICE_DESTROY gets called to remove device. - */ -static void visornic_remove(struct visor_device *dev) -{ - struct visornic_devdata *devdata = dev_get_drvdata(&dev->device); - struct net_device *netdev; - unsigned long flags; - - if (!devdata) { - dev_err(&dev->device, "%s no devdata\n", __func__); - return; - } - spin_lock_irqsave(&devdata->priv_lock, flags); - if (devdata->going_away) { - spin_unlock_irqrestore(&devdata->priv_lock, flags); - dev_err(&dev->device, "%s already being removed\n", __func__); - return; - } - devdata->going_away = true; - spin_unlock_irqrestore(&devdata->priv_lock, flags); - netdev = devdata->netdev; - if (!netdev) { - dev_err(&dev->device, "%s not net device\n", __func__); - return; - } - - /* going_away prevents new items being added to the workqueues */ - cancel_work_sync(&devdata->timeout_reset); - - debugfs_remove_recursive(devdata->eth_debugfs_dir); - /* this will call visornic_close() */ - unregister_netdev(netdev); - - visorbus_disable_channel_interrupts(devdata->dev); - netif_napi_del(&devdata->napi); - - dev_set_drvdata(&dev->device, NULL); - host_side_disappeared(devdata); - devdata_release(devdata); - free_netdev(netdev); -} - -/* visornic_pause - called when IO Part disappears - * @dev: Visornic device that is being serviced. - * @complete_func: Call when finished. - * - * Called when the IO Partition has gone down. Need to free up resources and - * wait for IO partition to come back. Mark link as down and don't attempt any - * DMA. When we have freed memory, call the complete_func so that Command knows - * we are done. If we don't call complete_func, the IO Partition will never - * come back. - * - * Return: 0 on success. - */ -static int visornic_pause(struct visor_device *dev, - visorbus_state_complete_func complete_func) -{ - struct visornic_devdata *devdata = dev_get_drvdata(&dev->device); - - visornic_serverdown(devdata, complete_func); - return 0; -} - -/* visornic_resume - called when IO Partition has recovered - * @dev: Visornic device that is being serviced. - * @compelte_func: Call when finished. - * - * Called when the IO partition has recovered. Re-establish connection to the IO - * Partition and set the link up. Okay to do DMA again. - * - * Returns 0 for success, negative integer on error. - */ -static int visornic_resume(struct visor_device *dev, - visorbus_state_complete_func complete_func) -{ - struct visornic_devdata *devdata; - struct net_device *netdev; - unsigned long flags; - - devdata = dev_get_drvdata(&dev->device); - if (!devdata) { - dev_err(&dev->device, "%s no devdata\n", __func__); - return -EINVAL; - } - - netdev = devdata->netdev; - - spin_lock_irqsave(&devdata->priv_lock, flags); - if (devdata->server_change_state) { - spin_unlock_irqrestore(&devdata->priv_lock, flags); - dev_err(&dev->device, "%s server already changing state\n", - __func__); - return -EINVAL; - } - if (!devdata->server_down) { - spin_unlock_irqrestore(&devdata->priv_lock, flags); - dev_err(&dev->device, "%s server not down\n", __func__); - complete_func(dev, 0); - return 0; - } - devdata->server_change_state = true; - spin_unlock_irqrestore(&devdata->priv_lock, flags); - - /* Must transition channel to ATTACHED state BEFORE - * we can start using the device again. - * TODO: State transitions - */ - visorbus_enable_channel_interrupts(dev); - - rtnl_lock(); - dev_open(netdev, NULL); - rtnl_unlock(); - - complete_func(dev, 0); - return 0; -} - -/* This is used to tell the visorbus driver which types of visor devices - * we support, and what functions to call when a visor device that we support - * is attached or removed. - */ -static struct visor_driver visornic_driver = { - .name = "visornic", - .owner = THIS_MODULE, - .channel_types = visornic_channel_types, - .probe = visornic_probe, - .remove = visornic_remove, - .pause = visornic_pause, - .resume = visornic_resume, - .channel_interrupt = visornic_channel_interrupt, -}; - -/* visornic_init - init function - * - * Init function for the visornic driver. Do initial driver setup and wait - * for devices. - * - * Return: 0 on success, negative integer on error. - */ -static int visornic_init(void) -{ - int err; - - visornic_debugfs_dir = debugfs_create_dir("visornic", NULL); - - debugfs_create_file("info", 0400, visornic_debugfs_dir, NULL, - &debugfs_info_fops); - debugfs_create_file("enable_ints", 0200, visornic_debugfs_dir, NULL, - &debugfs_enable_ints_fops); - - err = visorbus_register_visor_driver(&visornic_driver); - if (err) - debugfs_remove_recursive(visornic_debugfs_dir); - - return err; -} - -/* visornic_cleanup - driver exit routine - * - * Unregister driver from the bus and free up memory. - */ -static void visornic_cleanup(void) -{ - visorbus_unregister_visor_driver(&visornic_driver); - debugfs_remove_recursive(visornic_debugfs_dir); -} - -module_init(visornic_init); -module_exit(visornic_cleanup); - -MODULE_AUTHOR("Unisys"); -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("s-Par NIC driver for virtual network devices"); diff --git a/drivers/staging/vc04_services/Kconfig b/drivers/staging/vc04_services/Kconfig index cb7c82403dbf..31e58c9d1a11 100644 --- a/drivers/staging/vc04_services/Kconfig +++ b/drivers/staging/vc04_services/Kconfig @@ -13,6 +13,7 @@ if BCM_VIDEOCORE config BCM2835_VCHIQ tristate "BCM2835 VCHIQ" + depends on HAS_DMA imply VCHIQ_CDEV help Broadcom BCM2835 and similar SoCs have a VPU called VideoCore. This config diff --git a/drivers/staging/vc04_services/bcm2835-audio/Kconfig b/drivers/staging/vc04_services/bcm2835-audio/Kconfig index d32ea348e846..7f22f6c85067 100644 --- a/drivers/staging/vc04_services/bcm2835-audio/Kconfig +++ b/drivers/staging/vc04_services/bcm2835-audio/Kconfig @@ -3,7 +3,9 @@ config SND_BCM2835 tristate "BCM2835 Audio" depends on (ARCH_BCM2835 || COMPILE_TEST) && SND select SND_PCM - select BCM2835_VCHIQ + select BCM2835_VCHIQ if HAS_DMA help - Say Y or M if you want to support BCM2835 built in audio - + Say Y or M if you want to support BCM2835 built in audio. + This driver handles both 3.5mm and HDMI audio, by leveraging + the VCHIQ messaging interface between the kernel and the firmware + running on VideoCore.
\ No newline at end of file diff --git a/drivers/staging/vc04_services/bcm2835-audio/TODO b/drivers/staging/vc04_services/bcm2835-audio/TODO deleted file mode 100644 index b85451255db0..000000000000 --- a/drivers/staging/vc04_services/bcm2835-audio/TODO +++ /dev/null @@ -1,10 +0,0 @@ -***************************************************************************** -* * -* TODO: BCM2835-AUDIO * -* * -***************************************************************************** - -1) Revisit multi-cards options and PCM route mixer control (as per comment -https://lore.kernel.org/lkml/s5hd0to5598.wl-tiwai@suse.de) - -2) Fix the remaining checkpatch.pl errors and warnings. diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-ctl.c b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-ctl.c index 3703409715da..1c1f040122d7 100644 --- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-ctl.c +++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-ctl.c @@ -117,15 +117,6 @@ static const struct snd_kcontrol_new snd_bcm2835_ctl[] = { .get = snd_bcm2835_ctl_get, .put = snd_bcm2835_ctl_put, }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "PCM Playback Route", - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .private_value = PCM_PLAYBACK_DEVICE, - .info = snd_bcm2835_ctl_info, - .get = snd_bcm2835_ctl_get, - .put = snd_bcm2835_ctl_put, - }, }; static int snd_bcm2835_spdif_default_info(struct snd_kcontrol *kcontrol, @@ -220,7 +211,14 @@ static int create_ctls(struct bcm2835_chip *chip, size_t size, return 0; } -int snd_bcm2835_new_ctl(struct bcm2835_chip *chip) +int snd_bcm2835_new_headphones_ctl(struct bcm2835_chip *chip) +{ + strscpy(chip->card->mixername, "Broadcom Mixer", sizeof(chip->card->mixername)); + return create_ctls(chip, ARRAY_SIZE(snd_bcm2835_ctl), + snd_bcm2835_ctl); +} + +int snd_bcm2835_new_hdmi_ctl(struct bcm2835_chip *chip) { int err; @@ -232,71 +230,3 @@ int snd_bcm2835_new_ctl(struct bcm2835_chip *chip) snd_bcm2835_spdif); } -static const struct snd_kcontrol_new snd_bcm2835_headphones_ctl[] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Headphone Playback Volume", - .index = 0, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_TLV_READ, - .private_value = PCM_PLAYBACK_VOLUME, - .info = snd_bcm2835_ctl_info, - .get = snd_bcm2835_ctl_get, - .put = snd_bcm2835_ctl_put, - .count = 1, - .tlv = {.p = snd_bcm2835_db_scale} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "Headphone Playback Switch", - .index = 0, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .private_value = PCM_PLAYBACK_MUTE, - .info = snd_bcm2835_ctl_info, - .get = snd_bcm2835_ctl_get, - .put = snd_bcm2835_ctl_put, - .count = 1, - } -}; - -int snd_bcm2835_new_headphones_ctl(struct bcm2835_chip *chip) -{ - strscpy(chip->card->mixername, "Broadcom Mixer", sizeof(chip->card->mixername)); - return create_ctls(chip, ARRAY_SIZE(snd_bcm2835_headphones_ctl), - snd_bcm2835_headphones_ctl); -} - -static const struct snd_kcontrol_new snd_bcm2835_hdmi[] = { - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "HDMI Playback Volume", - .index = 0, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | - SNDRV_CTL_ELEM_ACCESS_TLV_READ, - .private_value = PCM_PLAYBACK_VOLUME, - .info = snd_bcm2835_ctl_info, - .get = snd_bcm2835_ctl_get, - .put = snd_bcm2835_ctl_put, - .count = 1, - .tlv = {.p = snd_bcm2835_db_scale} - }, - { - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, - .name = "HDMI Playback Switch", - .index = 0, - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, - .private_value = PCM_PLAYBACK_MUTE, - .info = snd_bcm2835_ctl_info, - .get = snd_bcm2835_ctl_get, - .put = snd_bcm2835_ctl_put, - .count = 1, - } -}; - -int snd_bcm2835_new_hdmi_ctl(struct bcm2835_chip *chip) -{ - strscpy(chip->card->mixername, "Broadcom Mixer", sizeof(chip->card->mixername)); - return create_ctls(chip, ARRAY_SIZE(snd_bcm2835_hdmi), - snd_bcm2835_hdmi); -} - diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c index f2ef1d641e70..68e8d491a7ec 100644 --- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c +++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c @@ -82,8 +82,7 @@ void bcm2835_playback_fifo(struct bcm2835_alsa_stream *alsa_stream, } /* open callback */ -static int snd_bcm2835_playback_open_generic( - struct snd_pcm_substream *substream, int spdif) +static int snd_bcm2835_playback_open_generic(struct snd_pcm_substream *substream, int spdif) { struct bcm2835_chip *chip = snd_pcm_substream_chip(substream); struct snd_pcm_runtime *runtime = substream->runtime; @@ -237,7 +236,7 @@ static void snd_bcm2835_pcm_transfer(struct snd_pcm_substream *substream, { struct snd_pcm_runtime *runtime = substream->runtime; struct bcm2835_alsa_stream *alsa_stream = runtime->private_data; - void *src = (void *) (substream->runtime->dma_area + rec->sw_data); + void *src = (void *)(substream->runtime->dma_area + rec->sw_data); bcm2835_audio_write(alsa_stream, bytes, src); } diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c index d567a2e3f70c..e429b33b4d39 100644 --- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c +++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c @@ -11,7 +11,7 @@ struct bcm2835_audio_instance { struct device *dev; unsigned int service_handle; struct completion msg_avail_comp; - struct mutex vchi_mutex; + struct mutex vchi_mutex; /* Serialize vchiq access */ struct bcm2835_alsa_stream *alsa_stream; int result; unsigned int max_packet; diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c b/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c index 628732d7bf6a..00bc898b0189 100644 --- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c +++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c @@ -10,17 +10,13 @@ #include "bcm2835.h" static bool enable_hdmi; -static bool enable_headphones; -static bool enable_compat_alsa = true; +static bool enable_headphones = true; static int num_channels = MAX_SUBSTREAMS; module_param(enable_hdmi, bool, 0444); MODULE_PARM_DESC(enable_hdmi, "Enables HDMI virtual audio device"); module_param(enable_headphones, bool, 0444); MODULE_PARM_DESC(enable_headphones, "Enables Headphones virtual audio device"); -module_param(enable_compat_alsa, bool, 0444); -MODULE_PARM_DESC(enable_compat_alsa, - "Enables ALSA compatibility virtual audio device"); module_param(num_channels, int, 0644); MODULE_PARM_DESC(num_channels, "Number of audio channels (default: 8)"); @@ -63,19 +59,20 @@ struct bcm2835_audio_driver { enum snd_bcm2835_route route; }; -static int bcm2835_audio_alsa_newpcm(struct bcm2835_chip *chip, +static int bcm2835_audio_dual_newpcm(struct bcm2835_chip *chip, const char *name, enum snd_bcm2835_route route, u32 numchannels) { int err; - err = snd_bcm2835_new_pcm(chip, "bcm2835 ALSA", 0, AUDIO_DEST_AUTO, - numchannels - 1, false); + err = snd_bcm2835_new_pcm(chip, name, 0, route, + numchannels, false); + if (err) return err; - err = snd_bcm2835_new_pcm(chip, "bcm2835 IEC958/HDMI", 1, 0, 1, true); + err = snd_bcm2835_new_pcm(chip, "IEC958", 1, route, 1, true); if (err) return err; @@ -90,18 +87,6 @@ static int bcm2835_audio_simple_newpcm(struct bcm2835_chip *chip, return snd_bcm2835_new_pcm(chip, name, 0, route, numchannels, false); } -static struct bcm2835_audio_driver bcm2835_audio_alsa = { - .driver = { - .name = "bcm2835_alsa", - .owner = THIS_MODULE, - }, - .shortname = "bcm2835 ALSA", - .longname = "bcm2835 ALSA", - .minchannels = 2, - .newpcm = bcm2835_audio_alsa_newpcm, - .newctl = snd_bcm2835_new_ctl, -}; - static struct bcm2835_audio_driver bcm2835_audio_hdmi = { .driver = { .name = "bcm2835_hdmi", @@ -110,7 +95,7 @@ static struct bcm2835_audio_driver bcm2835_audio_hdmi = { .shortname = "bcm2835 HDMI", .longname = "bcm2835 HDMI", .minchannels = 1, - .newpcm = bcm2835_audio_simple_newpcm, + .newpcm = bcm2835_audio_dual_newpcm, .newctl = snd_bcm2835_new_hdmi_ctl, .route = AUDIO_DEST_HDMI }; @@ -135,10 +120,6 @@ struct bcm2835_audio_drivers { static struct bcm2835_audio_drivers children_devices[] = { { - .audio_driver = &bcm2835_audio_alsa, - .is_enabled = &enable_compat_alsa, - }, - { .audio_driver = &bcm2835_audio_hdmi, .is_enabled = &enable_hdmi, }, diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835.h b/drivers/staging/vc04_services/bcm2835-audio/bcm2835.h index 51066ac8eea5..38b7451d77b2 100644 --- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835.h +++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835.h @@ -61,7 +61,7 @@ struct bcm2835_chip { unsigned int opened; unsigned int spdif_status; - struct mutex audio_mutex; + struct mutex audio_mutex; /* Serialize chip data access */ struct bcm2835_vchi_ctx *vchi_ctx; }; diff --git a/drivers/staging/vc04_services/bcm2835-camera/Kconfig b/drivers/staging/vc04_services/bcm2835-camera/Kconfig index dcda565f9b38..870c9afb223a 100644 --- a/drivers/staging/vc04_services/bcm2835-camera/Kconfig +++ b/drivers/staging/vc04_services/bcm2835-camera/Kconfig @@ -3,8 +3,8 @@ config VIDEO_BCM2835 tristate "BCM2835 Camera" depends on MEDIA_SUPPORT depends on VIDEO_DEV && (ARCH_BCM2835 || COMPILE_TEST) - select BCM2835_VCHIQ - select BCM2835_VCHIQ_MMAL + select BCM2835_VCHIQ if HAS_DMA + select BCM2835_VCHIQ_MMAL if HAS_DMA select VIDEOBUF2_VMALLOC select BTREE help diff --git a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c index 88b1878854e0..fd456d1f7061 100644 --- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c +++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c @@ -1033,9 +1033,9 @@ static int mmal_setup_video_component(struct bcm2835_mmal_dev *dev, preview_port->es.video.crop.y = 0; preview_port->es.video.crop.width = f->fmt.pix.width; preview_port->es.video.crop.height = f->fmt.pix.height; - preview_port->es.video.frame_rate.num = + preview_port->es.video.frame_rate.numerator = dev->capture.timeperframe.denominator; - preview_port->es.video.frame_rate.den = + preview_port->es.video.frame_rate.denominator = dev->capture.timeperframe.numerator; ret = vchiq_mmal_port_set_format(dev->instance, preview_port); @@ -1084,9 +1084,9 @@ static int mmal_setup_encode_component(struct bcm2835_mmal_dev *dev, port->es.video.crop.y = 0; port->es.video.crop.width = f->fmt.pix.width; port->es.video.crop.height = f->fmt.pix.height; - port->es.video.frame_rate.num = + port->es.video.frame_rate.numerator = dev->capture.timeperframe.denominator; - port->es.video.frame_rate.den = + port->es.video.frame_rate.denominator = dev->capture.timeperframe.numerator; port->format.encoding = mfmt->mmal; @@ -1225,8 +1225,8 @@ static int mmal_setup_components(struct bcm2835_mmal_dev *dev, camera_port->es.video.crop.y = 0; camera_port->es.video.crop.width = f->fmt.pix.width; camera_port->es.video.crop.height = f->fmt.pix.height; - camera_port->es.video.frame_rate.num = 0; - camera_port->es.video.frame_rate.den = 1; + camera_port->es.video.frame_rate.numerator = 0; + camera_port->es.video.frame_rate.denominator = 1; camera_port->es.video.color_space = MMAL_COLOR_SPACE_JPEG_JFIF; ret = vchiq_mmal_port_set_format(dev->instance, camera_port); @@ -1629,8 +1629,8 @@ static int mmal_init(struct bcm2835_mmal_dev *dev) format->es->video.crop.y = 0; format->es->video.crop.width = 1024; format->es->video.crop.height = 768; - format->es->video.frame_rate.num = 0; /* Rely on fps_range */ - format->es->video.frame_rate.den = 1; + format->es->video.frame_rate.numerator = 0; /* Rely on fps_range */ + format->es->video.frame_rate.denominator = 1; format = &camera->output[CAM_PORT_VIDEO].format; @@ -1643,8 +1643,8 @@ static int mmal_init(struct bcm2835_mmal_dev *dev) format->es->video.crop.y = 0; format->es->video.crop.width = 1024; format->es->video.crop.height = 768; - format->es->video.frame_rate.num = 0; /* Rely on fps_range */ - format->es->video.frame_rate.den = 1; + format->es->video.frame_rate.numerator = 0; /* Rely on fps_range */ + format->es->video.frame_rate.denominator = 1; format = &camera->output[CAM_PORT_CAPTURE].format; @@ -1656,8 +1656,8 @@ static int mmal_init(struct bcm2835_mmal_dev *dev) format->es->video.crop.y = 0; format->es->video.crop.width = 2592; format->es->video.crop.height = 1944; - format->es->video.frame_rate.num = 0; /* Rely on fps_range */ - format->es->video.frame_rate.den = 1; + format->es->video.frame_rate.numerator = 0; /* Rely on fps_range */ + format->es->video.frame_rate.denominator = 1; dev->capture.width = format->es->video.width; dev->capture.height = format->es->video.height; diff --git a/drivers/staging/vc04_services/bcm2835-camera/controls.c b/drivers/staging/vc04_services/bcm2835-camera/controls.c index eb722f16fb91..5644d1d457b9 100644 --- a/drivers/staging/vc04_services/bcm2835-camera/controls.c +++ b/drivers/staging/vc04_services/bcm2835-camera/controls.c @@ -154,13 +154,13 @@ static int ctrl_set_rational(struct bcm2835_mmal_dev *dev, struct v4l2_ctrl *ctrl, const struct bcm2835_mmal_v4l2_ctrl *mmal_ctrl) { - struct mmal_parameter_rational rational_value; + struct s32_fract rational_value; struct vchiq_mmal_port *control; control = &dev->component[COMP_CAMERA]->control; - rational_value.num = ctrl->val; - rational_value.den = 100; + rational_value.numerator = ctrl->val; + rational_value.denominator = 100; return vchiq_mmal_port_parameter_set(dev->instance, control, mmal_ctrl->mmal_id, @@ -489,9 +489,10 @@ static int ctrl_set_awb_gains(struct bcm2835_mmal_dev *dev, else if (ctrl->id == V4L2_CID_BLUE_BALANCE) dev->blue_gain = ctrl->val; - gains.r_gain.num = dev->red_gain; - gains.b_gain.num = dev->blue_gain; - gains.r_gain.den = gains.b_gain.den = 1000; + gains.r_gain.numerator = dev->red_gain; + gains.r_gain.denominator = 1000; + gains.b_gain.numerator = dev->blue_gain; + gains.b_gain.denominator = 1000; return vchiq_mmal_port_parameter_set(dev->instance, control, mmal_ctrl->mmal_id, @@ -1271,26 +1272,26 @@ int set_framerate_params(struct bcm2835_mmal_dev *dev) struct mmal_parameter_fps_range fps_range; int ret; - fps_range.fps_high.num = dev->capture.timeperframe.denominator; - fps_range.fps_high.den = dev->capture.timeperframe.numerator; + fps_range.fps_high.numerator = dev->capture.timeperframe.denominator; + fps_range.fps_high.denominator = dev->capture.timeperframe.numerator; if ((dev->exposure_mode_active != MMAL_PARAM_EXPOSUREMODE_OFF) && (dev->exp_auto_priority)) { /* Variable FPS. Define min FPS as 1fps. */ - fps_range.fps_low.num = 1; - fps_range.fps_low.den = 1; + fps_range.fps_low.numerator = 1; + fps_range.fps_low.denominator = 1; } else { /* Fixed FPS - set min and max to be the same */ - fps_range.fps_low.num = fps_range.fps_high.num; - fps_range.fps_low.den = fps_range.fps_high.den; + fps_range.fps_low.numerator = fps_range.fps_high.numerator; + fps_range.fps_low.denominator = fps_range.fps_high.denominator; } v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "Set fps range to %d/%d to %d/%d\n", - fps_range.fps_low.num, - fps_range.fps_low.den, - fps_range.fps_high.num, - fps_range.fps_high.den); + fps_range.fps_low.numerator, + fps_range.fps_low.denominator, + fps_range.fps_high.numerator, + fps_range.fps_high.denominator); ret = vchiq_mmal_port_parameter_set(dev->instance, &dev->component[COMP_CAMERA]->output[CAM_PORT_PREVIEW], diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c index f0bfacfdea80..0596ac61e286 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c @@ -431,21 +431,18 @@ free_pagelist(struct vchiq_pagelist_info *pagelistinfo, if (head_bytes > actual) head_bytes = actual; - memcpy((char *)kmap(pages[0]) + + memcpy_to_page(pages[0], pagelist->offset, fragments, head_bytes); - kunmap(pages[0]); } if ((actual >= 0) && (head_bytes < actual) && - (tail_bytes != 0)) { - memcpy((char *)kmap(pages[num_pages - 1]) + - ((pagelist->offset + actual) & - (PAGE_SIZE - 1) & ~(g_cache_line_size - 1)), + (tail_bytes != 0)) + memcpy_to_page(pages[num_pages - 1], + (pagelist->offset + actual) & + (PAGE_SIZE - 1) & ~(g_cache_line_size - 1), fragments + g_cache_line_size, tail_bytes); - kunmap(pages[num_pages - 1]); - } down(&g_free_fragments_mutex); *(char **)fragments = g_free_fragments; @@ -918,8 +915,7 @@ vchiq_blocking_bulk_transfer(unsigned int handle, void *data, unsigned int size, struct vchiq_instance *instance; struct vchiq_service *service; enum vchiq_status status; - struct bulk_waiter_node *waiter = NULL; - bool found = false; + struct bulk_waiter_node *waiter = NULL, *iter; service = find_service_by_handle(handle); if (!service) @@ -930,16 +926,16 @@ vchiq_blocking_bulk_transfer(unsigned int handle, void *data, unsigned int size, vchiq_service_put(service); mutex_lock(&instance->bulk_waiter_list_mutex); - list_for_each_entry(waiter, &instance->bulk_waiter_list, list) { - if (waiter->pid == current->pid) { - list_del(&waiter->list); - found = true; + list_for_each_entry(iter, &instance->bulk_waiter_list, list) { + if (iter->pid == current->pid) { + list_del(&iter->list); + waiter = iter; break; } } mutex_unlock(&instance->bulk_waiter_list_mutex); - if (found) { + if (waiter) { struct vchiq_bulk *bulk = waiter->bulk_waiter.bulk; if (bulk) { diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h index 82b7bd7b54b2..1ddc661642a9 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h @@ -79,7 +79,6 @@ #define BITSET_BIT(b) (1 << (b & 31)) #define BITSET_IS_SET(bs, b) (bs[BITSET_WORD(b)] & BITSET_BIT(b)) #define BITSET_SET(bs, b) (bs[BITSET_WORD(b)] |= BITSET_BIT(b)) -#define BITSET_CLR(bs, b) (bs[BITSET_WORD(b)] &= ~BITSET_BIT(b)) enum { DEBUG_ENTRIES, diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c index b41c2a267355..66bbfec332ba 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c @@ -289,8 +289,7 @@ static int vchiq_irq_queue_bulk_tx_rx(struct vchiq_instance *instance, enum vchiq_bulk_mode __user *mode) { struct vchiq_service *service; - struct bulk_waiter_node *waiter = NULL; - bool found = false; + struct bulk_waiter_node *waiter = NULL, *iter; void *userdata; int status = 0; int ret; @@ -309,16 +308,16 @@ static int vchiq_irq_queue_bulk_tx_rx(struct vchiq_instance *instance, userdata = &waiter->bulk_waiter; } else if (args->mode == VCHIQ_BULK_MODE_WAITING) { mutex_lock(&instance->bulk_waiter_list_mutex); - list_for_each_entry(waiter, &instance->bulk_waiter_list, + list_for_each_entry(iter, &instance->bulk_waiter_list, list) { - if (waiter->pid == current->pid) { - list_del(&waiter->list); - found = true; + if (iter->pid == current->pid) { + list_del(&iter->list); + waiter = iter; break; } } mutex_unlock(&instance->bulk_waiter_list_mutex); - if (!found) { + if (!waiter) { vchiq_log_error(vchiq_arm_log_level, "no bulk_waiter found for pid %d", current->pid); ret = -ESRCH; diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-msg-common.h b/drivers/staging/vc04_services/vchiq-mmal/mmal-msg-common.h index d77e15f25dda..492d4c5dca08 100644 --- a/drivers/staging/vc04_services/vchiq-mmal/mmal-msg-common.h +++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-msg-common.h @@ -14,6 +14,8 @@ #ifndef MMAL_MSG_COMMON_H #define MMAL_MSG_COMMON_H +#include <linux/types.h> + enum mmal_msg_status { MMAL_MSG_STATUS_SUCCESS = 0, /**< Success */ MMAL_MSG_STATUS_ENOMEM, /**< Out of memory */ @@ -40,9 +42,4 @@ struct mmal_rect { s32 height; /**< height */ }; -struct mmal_rational { - s32 num; /**< Numerator */ - s32 den; /**< Denominator */ -}; - #endif /* MMAL_MSG_COMMON_H */ diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-msg-format.h b/drivers/staging/vc04_services/vchiq-mmal/mmal-msg-format.h index 1e996d8cd283..5569876d8c7d 100644 --- a/drivers/staging/vc04_services/vchiq-mmal/mmal-msg-format.h +++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-msg-format.h @@ -14,6 +14,8 @@ #ifndef MMAL_MSG_FORMAT_H #define MMAL_MSG_FORMAT_H +#include <linux/math.h> + #include "mmal-msg-common.h" /* MMAL_ES_FORMAT_T */ @@ -30,8 +32,8 @@ struct mmal_video_format { u32 width; /* Width of frame in pixels */ u32 height; /* Height of frame in rows of pixels */ struct mmal_rect crop; /* Visible region of the frame */ - struct mmal_rational frame_rate; /* Frame rate */ - struct mmal_rational par; /* Pixel aspect ratio */ + struct s32_fract frame_rate; /* Frame rate */ + struct s32_fract par; /* Pixel aspect ratio */ /* * FourCC specifying the color space of the video stream. See the diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-parameters.h b/drivers/staging/vc04_services/vchiq-mmal/mmal-parameters.h index 2277e05b1e31..a0cdd28101f2 100644 --- a/drivers/staging/vc04_services/vchiq-mmal/mmal-parameters.h +++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-parameters.h @@ -22,6 +22,8 @@ #ifndef MMAL_PARAMETERS_H #define MMAL_PARAMETERS_H +#include <linux/math.h> + /** Common parameter ID group, used with many types of component. */ #define MMAL_PARAMETER_GROUP_COMMON (0 << 16) /** Camera-specific parameter ID group. */ @@ -223,11 +225,6 @@ enum mmal_parameter_camera_type { MMAL_PARAMETER_CUSTOM_AWB_GAINS, }; -struct mmal_parameter_rational { - s32 num; /**< Numerator */ - s32 den; /**< Denominator */ -}; - enum mmal_parameter_camera_config_timestamp_mode { MMAL_PARAM_TIMESTAMP_MODE_ZERO = 0, /* Always timestamp frames as 0 */ MMAL_PARAM_TIMESTAMP_MODE_RAW_STC, /* Use the raw STC value @@ -243,9 +240,9 @@ enum mmal_parameter_camera_config_timestamp_mode { struct mmal_parameter_fps_range { /**< Low end of the permitted framerate range */ - struct mmal_parameter_rational fps_low; + struct s32_fract fps_low; /**< High end of the permitted framerate range */ - struct mmal_parameter_rational fps_high; + struct s32_fract fps_high; }; /* camera configuration parameter */ @@ -350,8 +347,8 @@ enum MMAL_PARAM_FLICKERAVOID { }; struct mmal_parameter_awbgains { - struct mmal_parameter_rational r_gain; /**< Red gain */ - struct mmal_parameter_rational b_gain; /**< Blue gain */ + struct s32_fract r_gain; /**< Red gain */ + struct s32_fract b_gain; /**< Blue gain */ }; /** Manner of video rate control */ diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c index 70c9d5544b56..845b20e4d05a 100644 --- a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c +++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c @@ -744,9 +744,9 @@ static void dump_port_info(struct vchiq_mmal_port *port) port->es.video.crop.y, port->es.video.crop.width, port->es.video.crop.height); pr_debug(" : framerate %d/%d aspect %d/%d\n", - port->es.video.frame_rate.num, - port->es.video.frame_rate.den, - port->es.video.par.num, port->es.video.par.den); + port->es.video.frame_rate.numerator, + port->es.video.frame_rate.denominator, + port->es.video.par.numerator, port->es.video.par.denominator); } } @@ -1549,8 +1549,8 @@ int vchiq_mmal_port_connect_tunnel(struct vchiq_mmal_instance *instance, dst->es.video.crop.y = src->es.video.crop.y; dst->es.video.crop.width = src->es.video.crop.width; dst->es.video.crop.height = src->es.video.crop.height; - dst->es.video.frame_rate.num = src->es.video.frame_rate.num; - dst->es.video.frame_rate.den = src->es.video.frame_rate.den; + dst->es.video.frame_rate.numerator = src->es.video.frame_rate.numerator; + dst->es.video.frame_rate.denominator = src->es.video.frame_rate.denominator; /* set new format */ ret = port_info_set(instance, dst); @@ -1841,7 +1841,6 @@ int vchiq_mmal_finalise(struct vchiq_mmal_instance *instance) mutex_unlock(&instance->vchiq_mutex); vchiq_shutdown(instance->vchiq_instance); - flush_workqueue(instance->bulk_wq); destroy_workqueue(instance->bulk_wq); idr_destroy(&instance->context_map); diff --git a/drivers/staging/vme/Makefile b/drivers/staging/vme/Makefile deleted file mode 100644 index cf2f686ccffe..000000000000 --- a/drivers/staging/vme/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -obj-y += devices/ diff --git a/drivers/staging/vme/devices/Kconfig b/drivers/staging/vme_user/Kconfig index 5651bb16b28b..e8b4461bf27f 100644 --- a/drivers/staging/vme/devices/Kconfig +++ b/drivers/staging/vme_user/Kconfig @@ -3,7 +3,7 @@ comment "VME Device Drivers" config VME_USER tristate "VME user space access driver" - depends on STAGING + depends on STAGING && VME_BUS help If you say Y here you want to be able to access a limited number of VME windows in a manner at least semi-compatible with the interface diff --git a/drivers/staging/vme/devices/Makefile b/drivers/staging/vme_user/Makefile index 5380115139b0..5380115139b0 100644 --- a/drivers/staging/vme/devices/Makefile +++ b/drivers/staging/vme_user/Makefile diff --git a/drivers/staging/vme/devices/vme_user.c b/drivers/staging/vme_user/vme_user.c index e3fa38bd7f12..859af797630c 100644 --- a/drivers/staging/vme/devices/vme_user.c +++ b/drivers/staging/vme_user/vme_user.c @@ -773,7 +773,7 @@ MODULE_PARM_DESC(bus, "Enumeration of VMEbus to which the driver is connected"); module_param_array(bus, int, &bus_num, 0000); MODULE_DESCRIPTION("VME User Space Access Driver"); -MODULE_AUTHOR("Martyn Welch <martyn.welch@ge.com"); +MODULE_AUTHOR("Martyn Welch <martyn.welch@ge.com>"); MODULE_LICENSE("GPL"); module_init(vme_user_init); diff --git a/drivers/staging/vme/devices/vme_user.h b/drivers/staging/vme_user/vme_user.h index 19ecb05781cc..19ecb05781cc 100644 --- a/drivers/staging/vme/devices/vme_user.h +++ b/drivers/staging/vme_user/vme_user.h diff --git a/drivers/staging/vt6655/baseband.c b/drivers/staging/vt6655/baseband.c index dfdb0ebf43b5..577a38fae369 100644 --- a/drivers/staging/vt6655/baseband.c +++ b/drivers/staging/vt6655/baseband.c @@ -29,7 +29,6 @@ * */ -#include "tmacro.h" #include "mac.h" #include "baseband.h" #include "srom.h" @@ -1910,19 +1909,19 @@ bool bb_read_embedded(struct vnt_private *priv, unsigned char by_bb_addr, unsigned char by_value; /* BB reg offset */ - VNSvOutPortB(iobase + MAC_REG_BBREGADR, by_bb_addr); + iowrite8(by_bb_addr, iobase + MAC_REG_BBREGADR); /* turn on REGR */ MACvRegBitsOn(iobase, MAC_REG_BBREGCTL, BBREGCTL_REGR); /* W_MAX_TIMEOUT is the timeout period */ for (ww = 0; ww < W_MAX_TIMEOUT; ww++) { - VNSvInPortB(iobase + MAC_REG_BBREGCTL, &by_value); + by_value = ioread8(iobase + MAC_REG_BBREGCTL); if (by_value & BBREGCTL_DONE) break; } /* get BB data */ - VNSvInPortB(iobase + MAC_REG_BBREGDATA, pby_data); + *pby_data = ioread8(iobase + MAC_REG_BBREGDATA); if (ww == W_MAX_TIMEOUT) { pr_debug(" DBG_PORT80(0x30)\n"); @@ -1953,15 +1952,15 @@ bool bb_write_embedded(struct vnt_private *priv, unsigned char by_bb_addr, unsigned char by_value; /* BB reg offset */ - VNSvOutPortB(iobase + MAC_REG_BBREGADR, by_bb_addr); + iowrite8(by_bb_addr, iobase + MAC_REG_BBREGADR); /* set BB data */ - VNSvOutPortB(iobase + MAC_REG_BBREGDATA, by_data); + iowrite8(by_data, iobase + MAC_REG_BBREGDATA); /* turn on BBREGCTL_REGW */ MACvRegBitsOn(iobase, MAC_REG_BBREGCTL, BBREGCTL_REGW); /* W_MAX_TIMEOUT is the timeout period */ for (ww = 0; ww < W_MAX_TIMEOUT; ww++) { - VNSvInPortB(iobase + MAC_REG_BBREGCTL, &by_value); + by_value = ioread8(iobase + MAC_REG_BBREGCTL); if (by_value & BBREGCTL_DONE) break; } @@ -2054,7 +2053,7 @@ bool bb_vt3253_init(struct vnt_private *priv) byVT3253B0_AGC[ii][0], byVT3253B0_AGC[ii][1]); - VNSvOutPortB(iobase + MAC_REG_ITRTMSET, 0x23); + iowrite8(0x23, iobase + MAC_REG_ITRTMSET); MACvRegBitsOn(iobase, MAC_REG_PAPEDELAY, BIT(0)); priv->abyBBVGA[0] = 0x14; diff --git a/drivers/staging/vt6655/card.c b/drivers/staging/vt6655/card.c index 1110366fc415..2cde0082fc03 100644 --- a/drivers/staging/vt6655/card.c +++ b/drivers/staging/vt6655/card.c @@ -11,7 +11,7 @@ * CARDbAddBasicRate - Add to BasicRateSet * CARDbIsOFDMinBasicRate - Check if any OFDM rate is in BasicRateSet * CARDqGetTSFOffset - Calculate TSFOffset - * CARDbGetCurrentTSF - Read Current NIC TSF counter + * vt6655_get_current_tsf - Read Current NIC TSF counter * CARDqGetNextTBTT - Calculate Next Beacon TSF counter * CARDvSetFirstNextTBTT - Set NIC Beacon time * CARDvUpdateNextTBTT - Sync. NIC Beacon time @@ -24,7 +24,6 @@ * */ -#include "tmacro.h" #include "card.h" #include "baseband.h" #include "mac.h" @@ -239,26 +238,25 @@ bool CARDbSetPhyParameter(struct vnt_private *priv, u8 bb_type) if (priv->bySIFS != bySIFS) { priv->bySIFS = bySIFS; - VNSvOutPortB(priv->port_offset + MAC_REG_SIFS, priv->bySIFS); + iowrite8(priv->bySIFS, priv->port_offset + MAC_REG_SIFS); } if (priv->byDIFS != byDIFS) { priv->byDIFS = byDIFS; - VNSvOutPortB(priv->port_offset + MAC_REG_DIFS, priv->byDIFS); + iowrite8(priv->byDIFS, priv->port_offset + MAC_REG_DIFS); } if (priv->byEIFS != C_EIFS) { priv->byEIFS = C_EIFS; - VNSvOutPortB(priv->port_offset + MAC_REG_EIFS, priv->byEIFS); + iowrite8(priv->byEIFS, priv->port_offset + MAC_REG_EIFS); } if (priv->bySlot != bySlot) { priv->bySlot = bySlot; - VNSvOutPortB(priv->port_offset + MAC_REG_SLOT, priv->bySlot); + iowrite8(priv->bySlot, priv->port_offset + MAC_REG_SLOT); bb_set_short_slot_time(priv); } if (priv->byCWMaxMin != byCWMaxMin) { priv->byCWMaxMin = byCWMaxMin; - VNSvOutPortB(priv->port_offset + MAC_REG_CWMAXMIN0, - priv->byCWMaxMin); + iowrite8(priv->byCWMaxMin, priv->port_offset + MAC_REG_CWMAXMIN0); } priv->byPacketType = CARDbyGetPktType(priv); @@ -289,7 +287,7 @@ bool CARDbUpdateTSF(struct vnt_private *priv, unsigned char byRxRate, u64 local_tsf; u64 qwTSFOffset = 0; - CARDbGetCurrentTSF(priv, &local_tsf); + local_tsf = vt6655_get_current_tsf(priv); if (qwBSSTimestamp != local_tsf) { qwTSFOffset = CARDqGetTSFOffset(byRxRate, qwBSSTimestamp, @@ -321,9 +319,9 @@ bool CARDbUpdateTSF(struct vnt_private *priv, unsigned char byRxRate, bool CARDbSetBeaconPeriod(struct vnt_private *priv, unsigned short wBeaconInterval) { - u64 qwNextTBTT = 0; + u64 qwNextTBTT; - CARDbGetCurrentTSF(priv, &qwNextTBTT); /* Get Local TSF counter */ + qwNextTBTT = vt6655_get_current_tsf(priv); /* Get Local TSF counter */ qwNextTBTT = CARDqGetNextTBTT(qwNextTBTT, wBeaconInterval); @@ -740,24 +738,24 @@ u64 CARDqGetTSFOffset(unsigned char byRxRate, u64 qwTSF1, u64 qwTSF2) * * Return Value: true if success; otherwise false */ -bool CARDbGetCurrentTSF(struct vnt_private *priv, u64 *pqwCurrTSF) +u64 vt6655_get_current_tsf(struct vnt_private *priv) { void __iomem *iobase = priv->port_offset; unsigned short ww; unsigned char data; + u32 low, high; MACvRegBitsOn(iobase, MAC_REG_TFTCTL, TFTCTL_TSFCNTRRD); for (ww = 0; ww < W_MAX_TIMEOUT; ww++) { - VNSvInPortB(iobase + MAC_REG_TFTCTL, &data); + data = ioread8(iobase + MAC_REG_TFTCTL); if (!(data & TFTCTL_TSFCNTRRD)) break; } if (ww == W_MAX_TIMEOUT) - return false; - VNSvInPortD(iobase + MAC_REG_TSFCNTR, (u32 *)pqwCurrTSF); - VNSvInPortD(iobase + MAC_REG_TSFCNTR + 4, (u32 *)pqwCurrTSF + 1); - - return true; + return 0; + low = ioread32(iobase + MAC_REG_TSFCNTR); + high = ioread32(iobase + MAC_REG_TSFCNTR + 4); + return le64_to_cpu(low + ((u64)high << 32)); } /* @@ -804,9 +802,9 @@ void CARDvSetFirstNextTBTT(struct vnt_private *priv, unsigned short wBeaconInterval) { void __iomem *iobase = priv->port_offset; - u64 qwNextTBTT = 0; + u64 qwNextTBTT; - CARDbGetCurrentTSF(priv, &qwNextTBTT); /* Get Local TSF counter */ + qwNextTBTT = vt6655_get_current_tsf(priv); /* Get Local TSF counter */ qwNextTBTT = CARDqGetNextTBTT(qwNextTBTT, wBeaconInterval); /* Set NextTBTT */ diff --git a/drivers/staging/vt6655/card.h b/drivers/staging/vt6655/card.h index 09e7f3f1cbed..22dc359a6565 100644 --- a/drivers/staging/vt6655/card.h +++ b/drivers/staging/vt6655/card.h @@ -46,7 +46,7 @@ void CARDvSetFirstNextTBTT(struct vnt_private *priv, unsigned short wBeaconInterval); void CARDvUpdateNextTBTT(struct vnt_private *priv, u64 qwTSF, unsigned short wBeaconInterval); -bool CARDbGetCurrentTSF(struct vnt_private *priv, u64 *pqwCurrTSF); +u64 vt6655_get_current_tsf(struct vnt_private *priv); u64 CARDqGetNextTBTT(u64 qwTSF, unsigned short wBeaconInterval); u64 CARDqGetTSFOffset(unsigned char byRxRate, u64 qwTSF1, u64 qwTSF2); unsigned char CARDbyGetPktType(struct vnt_private *priv); diff --git a/drivers/staging/vt6655/channel.c b/drivers/staging/vt6655/channel.c index abe867814dc8..652dcaf61169 100644 --- a/drivers/staging/vt6655/channel.c +++ b/drivers/staging/vt6655/channel.c @@ -118,11 +118,9 @@ bool set_channel(struct vnt_private *priv, struct ieee80211_channel *ch) /* set HW default power register */ MACvSelectPage1(priv->port_offset); RFbSetPower(priv, RATE_1M, priv->byCurrentCh); - VNSvOutPortB(priv->port_offset + MAC_REG_PWRCCK, - priv->byCurPwr); + iowrite8(priv->byCurPwr, priv->port_offset + MAC_REG_PWRCCK); RFbSetPower(priv, RATE_6M, priv->byCurrentCh); - VNSvOutPortB(priv->port_offset + MAC_REG_PWROFDM, - priv->byCurPwr); + iowrite8(priv->byCurPwr, priv->port_offset + MAC_REG_PWROFDM); MACvSelectPage0(priv->port_offset); spin_unlock_irqrestore(&priv->lock, flags); diff --git a/drivers/staging/vt6655/device_main.c b/drivers/staging/vt6655/device_main.c index 897d70cf32b8..afaf331fe125 100644 --- a/drivers/staging/vt6655/device_main.c +++ b/drivers/staging/vt6655/device_main.c @@ -219,7 +219,7 @@ static void device_init_registers(struct vnt_private *priv) MACvInitialize(priv); /* Get Local ID */ - VNSvInPortB(priv->port_offset + MAC_REG_LOCALID, &priv->local_id); + priv->local_id = ioread8(priv->port_offset + MAC_REG_LOCALID); spin_lock_irqsave(&priv->lock, flags); @@ -334,8 +334,7 @@ static void device_init_registers(struct vnt_private *priv) if (priv->local_id > REV_ID_VT3253_B1) { MACvSelectPage1(priv->port_offset); - VNSvOutPortB(priv->port_offset + MAC_REG_MSRCTL + 1, - (MSRCTL1_TXPWR | MSRCTL1_CSAPAREN)); + iowrite8(MSRCTL1_TXPWR | MSRCTL1_CSAPAREN, priv->port_offset + MAC_REG_MSRCTL + 1); MACvSelectPage0(priv->port_offset); } @@ -349,9 +348,9 @@ static void device_init_registers(struct vnt_private *priv) MACvSetLongRetryLimit(priv, priv->byLongRetryLimit); /* reset TSF counter */ - VNSvOutPortB(priv->port_offset + MAC_REG_TFTCTL, TFTCTL_TSFCNTRST); + iowrite8(TFTCTL_TSFCNTRST, priv->port_offset + MAC_REG_TFTCTL); /* enable TSF counter */ - VNSvOutPortB(priv->port_offset + MAC_REG_TFTCTL, TFTCTL_TSFCNTREN); + iowrite8(TFTCTL_TSFCNTREN, priv->port_offset + MAC_REG_TFTCTL); /* initialize BBP registers */ bb_vt3253_init(priv); @@ -377,7 +376,7 @@ static void device_init_registers(struct vnt_private *priv) if (priv->byRadioCtl & EEP_RADIOCTL_ENABLE) { /* Get GPIO */ - MACvGPIOIn(priv->port_offset, &priv->byGPIO); + priv->byGPIO = ioread8(priv->port_offset + MAC_REG_GPIOCTL1); if (((priv->byGPIO & GPIO0_DATA) && !(priv->byRadioCtl & EEP_RADIOCTL_INV)) || @@ -406,7 +405,7 @@ static void device_init_registers(struct vnt_private *priv) MACvReceive1(priv->port_offset); /* start the adapter */ - MACvStart(priv->port_offset); + iowrite8(HOSTCR_MACEN | HOSTCR_RXON | HOSTCR_TXON, priv->port_offset + MAC_REG_HOSTCR); } static void device_print_info(struct vnt_private *priv) @@ -1029,7 +1028,7 @@ static void vnt_interrupt_process(struct vnt_private *priv) u32 isr; unsigned long flags; - MACvReadISR(priv->port_offset, &isr); + isr = ioread32(priv->port_offset + MAC_REG_ISR); if (isr == 0) return; @@ -1042,7 +1041,7 @@ static void vnt_interrupt_process(struct vnt_private *priv) spin_lock_irqsave(&priv->lock, flags); /* Read low level stats */ - MACvReadMIBCounter(priv->port_offset, &mib_counter); + mib_counter = ioread32(priv->port_offset + MAC_REG_MIBCNTR); low_stats->dot11RTSSuccessCount += mib_counter & 0xff; low_stats->dot11RTSFailureCount += (mib_counter >> 8) & 0xff; @@ -1060,7 +1059,7 @@ static void vnt_interrupt_process(struct vnt_private *priv) if (isr & ISR_FETALERR) { pr_debug(" ISR_FETALERR\n"); - VNSvOutPortB(priv->port_offset + MAC_REG_SOFTPWRCTL, 0); + iowrite8(0, priv->port_offset + MAC_REG_SOFTPWRCTL); VNSvOutPortW(priv->port_offset + MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPECTI); device_error(priv, isr); @@ -1116,7 +1115,7 @@ static void vnt_interrupt_process(struct vnt_private *priv) ieee80211_queue_stopped(priv->hw, 0)) ieee80211_wake_queues(priv->hw); - MACvReadISR(priv->port_offset, &isr); + isr = ioread32(priv->port_offset + MAC_REG_ISR); MACvReceive0(priv->port_offset); MACvReceive1(priv->port_offset); @@ -1407,7 +1406,7 @@ static void vnt_bss_info_changed(struct ieee80211_hw *hw, spin_lock_irqsave(&priv->lock, flags); - MACvWriteBSSIDAddress(priv->port_offset, (u8 *)conf->bssid); + MACvWriteBSSIDAddress(priv->port_offset, conf->bssid); spin_unlock_irqrestore(&priv->lock, flags); } @@ -1477,10 +1476,8 @@ static void vnt_bss_info_changed(struct ieee80211_hw *hw, CARDvSetFirstNextTBTT(priv, conf->beacon_int); } else { - VNSvOutPortB(priv->port_offset + MAC_REG_TFTCTL, - TFTCTL_TSFCNTRST); - VNSvOutPortB(priv->port_offset + MAC_REG_TFTCTL, - TFTCTL_TSFCNTREN); + iowrite8(TFTCTL_TSFCNTRST, priv->port_offset + MAC_REG_TFTCTL); + iowrite8(TFTCTL_TSFCNTREN, priv->port_offset + MAC_REG_TFTCTL); } } } @@ -1513,7 +1510,7 @@ static void vnt_configure(struct ieee80211_hw *hw, *total_flags &= FIF_ALLMULTI | FIF_OTHER_BSS | FIF_BCN_PRBRESP_PROMISC; - VNSvInPortB(priv->port_offset + MAC_REG_RCR, &rx_mode); + rx_mode = ioread8(priv->port_offset + MAC_REG_RCR); dev_dbg(&priv->pcid->dev, "rx mode in = %x\n", rx_mode); @@ -1561,7 +1558,7 @@ static void vnt_configure(struct ieee80211_hw *hw, rx_mode |= RCR_BSSID; } - VNSvOutPortB(priv->port_offset + MAC_REG_RCR, rx_mode); + iowrite8(rx_mode, priv->port_offset + MAC_REG_RCR); dev_dbg(&priv->pcid->dev, "rx mode out= %x\n", rx_mode); } @@ -1603,7 +1600,7 @@ static u64 vnt_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif) struct vnt_private *priv = hw->priv; u64 tsf; - CARDbGetCurrentTSF(priv, &tsf); + tsf = vt6655_get_current_tsf(priv); return tsf; } @@ -1621,7 +1618,7 @@ static void vnt_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif) struct vnt_private *priv = hw->priv; /* reset TSF counter */ - VNSvOutPortB(priv->port_offset + MAC_REG_TFTCTL, TFTCTL_TSFCNTRST); + iowrite8(TFTCTL_TSFCNTRST, priv->port_offset + MAC_REG_TFTCTL); } static const struct ieee80211_ops vnt_mac_ops = { diff --git a/drivers/staging/vt6655/key.c b/drivers/staging/vt6655/key.c index f843966a3ea4..1469015eb5b4 100644 --- a/drivers/staging/vt6655/key.c +++ b/drivers/staging/vt6655/key.c @@ -11,7 +11,6 @@ * */ -#include "tmacro.h" #include "key.h" #include "mac.h" diff --git a/drivers/staging/vt6655/mac.c b/drivers/staging/vt6655/mac.c index 80cced7dfda8..88ddd0676463 100644 --- a/drivers/staging/vt6655/mac.c +++ b/drivers/staging/vt6655/mac.c @@ -36,7 +36,6 @@ * */ -#include "tmacro.h" #include "mac.h" /* diff --git a/drivers/staging/vt6655/mac.h b/drivers/staging/vt6655/mac.h index 550dc4da80a9..57ae3bdbdb2d 100644 --- a/drivers/staging/vt6655/mac.h +++ b/drivers/staging/vt6655/mac.h @@ -18,7 +18,6 @@ #ifndef __MAC_H__ #define __MAC_H__ -#include "tmacro.h" #include "upc.h" /*--------------------- Export Definitions -------------------------*/ @@ -261,18 +260,18 @@ #define TFTCTL_TSFCNTREN 0x01 /* Bits in the EnhanceCFG register */ -#define EnCFG_BarkerPream 0x00020000 -#define EnCFG_NXTBTTCFPSTR 0x00010000 -#define EnCFG_BcnSusClr 0x00000200 -#define EnCFG_BcnSusInd 0x00000100 -#define EnCFG_CFP_ProtectEn 0x00000040 -#define EnCFG_ProtectMd 0x00000020 -#define EnCFG_HwParCFP 0x00000010 -#define EnCFG_CFNULRSP 0x00000004 -#define EnCFG_BBType_MASK 0x00000003 -#define EnCFG_BBType_g 0x00000002 -#define EnCFG_BBType_b 0x00000001 -#define EnCFG_BBType_a 0x00000000 +#define ENCFG_BARKERPREAM 0x00020000 +#define ENCFG_NXTBTTCFPSTR 0x00010000 +#define ENCFG_BCNSUSCLR 0x00000200 +#define ENCFG_BCNSUSIND 0x00000100 +#define ENCFG_CFP_PROTECTEN 0x00000040 +#define ENCFG_PROTECTMD 0x00000020 +#define ENCFG_HWPARCFP 0x00000010 +#define ENCFG_CFNULRSP 0x00000004 +#define ENCFG_BBTYPE_MASK 0x00000003 +#define ENCFG_BBTYPE_G 0x00000002 +#define ENCFG_BBTYPE_B 0x00000001 +#define ENCFG_BBTYPE_A 0x00000000 /* Bits in the Page1Sel register */ #define PAGE1_SEL 0x01 @@ -497,7 +496,7 @@ #define MAC_LB_INTERNAL 0x01 #define MAC_LB_NONE 0x00 -#define Default_BI 0x200 +#define DEFAULT_BI 0x200 /* MiscFIFO Offset */ #define MISCFIFO_KEYETRY0 32 @@ -541,77 +540,31 @@ #define MACvRegBitsOn(iobase, byRegOfs, byBits) \ do { \ unsigned char byData; \ - VNSvInPortB(iobase + byRegOfs, &byData); \ - VNSvOutPortB(iobase + byRegOfs, byData | (byBits)); \ + byData = ioread8(iobase + byRegOfs); \ + iowrite8(byData | (byBits), iobase + byRegOfs); \ } while (0) #define MACvWordRegBitsOn(iobase, byRegOfs, wBits) \ do { \ unsigned short wData; \ - VNSvInPortW(iobase + byRegOfs, &wData); \ + wData = ioread16(iobase + byRegOfs); \ VNSvOutPortW(iobase + byRegOfs, wData | (wBits)); \ } while (0) -#define MACvDWordRegBitsOn(iobase, byRegOfs, dwBits) \ -do { \ - unsigned long dwData; \ - VNSvInPortD(iobase + byRegOfs, &dwData); \ - VNSvOutPortD(iobase + byRegOfs, dwData | (dwBits)); \ -} while (0) - -#define MACvRegBitsOnEx(iobase, byRegOfs, byMask, byBits) \ -do { \ - unsigned char byData; \ - VNSvInPortB(iobase + byRegOfs, &byData); \ - byData &= byMask; \ - VNSvOutPortB(iobase + byRegOfs, byData | (byBits)); \ -} while (0) - #define MACvRegBitsOff(iobase, byRegOfs, byBits) \ do { \ unsigned char byData; \ - VNSvInPortB(iobase + byRegOfs, &byData); \ - VNSvOutPortB(iobase + byRegOfs, byData & ~(byBits)); \ + byData = ioread8(iobase + byRegOfs); \ + iowrite8(byData & ~(byBits), iobase + byRegOfs); \ } while (0) #define MACvWordRegBitsOff(iobase, byRegOfs, wBits) \ do { \ unsigned short wData; \ - VNSvInPortW(iobase + byRegOfs, &wData); \ + wData = ioread16(iobase + byRegOfs); \ VNSvOutPortW(iobase + byRegOfs, wData & ~(wBits)); \ } while (0) -#define MACvDWordRegBitsOff(iobase, byRegOfs, dwBits) \ -do { \ - unsigned long dwData; \ - VNSvInPortD(iobase + byRegOfs, &dwData); \ - VNSvOutPortD(iobase + byRegOfs, dwData & ~(dwBits)); \ -} while (0) - -#define MACvGetCurrRx0DescAddr(iobase, pdwCurrDescAddr) \ - VNSvInPortD(iobase + MAC_REG_RXDMAPTR0, \ - (unsigned long *)pdwCurrDescAddr) - -#define MACvGetCurrRx1DescAddr(iobase, pdwCurrDescAddr) \ - VNSvInPortD(iobase + MAC_REG_RXDMAPTR1, \ - (unsigned long *)pdwCurrDescAddr) - -#define MACvGetCurrTx0DescAddr(iobase, pdwCurrDescAddr) \ - VNSvInPortD(iobase + MAC_REG_TXDMAPTR0, \ - (unsigned long *)pdwCurrDescAddr) - -#define MACvGetCurrAC0DescAddr(iobase, pdwCurrDescAddr) \ - VNSvInPortD(iobase + MAC_REG_AC0DMAPTR, \ - (unsigned long *)pdwCurrDescAddr) - -#define MACvGetCurrSyncDescAddr(iobase, pdwCurrDescAddr) \ - VNSvInPortD(iobase + MAC_REG_SYNCDMAPTR, \ - (unsigned long *)pdwCurrDescAddr) - -#define MACvGetCurrATIMDescAddr(iobase, pdwCurrDescAddr) \ - VNSvInPortD(iobase + MAC_REG_ATIMDMAPTR, \ - (unsigned long *)pdwCurrDescAddr) - /* set the chip with current BCN tx descriptor address */ #define MACvSetCurrBCNTxDescAddr(iobase, dwCurrDescAddr) \ VNSvOutPortD(iobase + MAC_REG_BCNDMAPTR, \ @@ -622,104 +575,40 @@ do { \ VNSvOutPortW(iobase + MAC_REG_BCNDMACTL + 2, \ wCurrBCNLength) -#define MACvReadBSSIDAddress(iobase, pbyEtherAddr) \ -do { \ - VNSvOutPortB(iobase + MAC_REG_PAGE1SEL, 1); \ - VNSvInPortB(iobase + MAC_REG_BSSID0, \ - (unsigned char *)pbyEtherAddr); \ - VNSvInPortB(iobase + MAC_REG_BSSID0 + 1, \ - pbyEtherAddr + 1); \ - VNSvInPortB(iobase + MAC_REG_BSSID0 + 2, \ - pbyEtherAddr + 2); \ - VNSvInPortB(iobase + MAC_REG_BSSID0 + 3, \ - pbyEtherAddr + 3); \ - VNSvInPortB(iobase + MAC_REG_BSSID0 + 4, \ - pbyEtherAddr + 4); \ - VNSvInPortB(iobase + MAC_REG_BSSID0 + 5, \ - pbyEtherAddr + 5); \ - VNSvOutPortB(iobase + MAC_REG_PAGE1SEL, 0); \ -} while (0) - #define MACvWriteBSSIDAddress(iobase, pbyEtherAddr) \ do { \ - VNSvOutPortB(iobase + MAC_REG_PAGE1SEL, 1); \ - VNSvOutPortB(iobase + MAC_REG_BSSID0, \ - *(pbyEtherAddr)); \ - VNSvOutPortB(iobase + MAC_REG_BSSID0 + 1, \ - *(pbyEtherAddr + 1)); \ - VNSvOutPortB(iobase + MAC_REG_BSSID0 + 2, \ - *(pbyEtherAddr + 2)); \ - VNSvOutPortB(iobase + MAC_REG_BSSID0 + 3, \ - *(pbyEtherAddr + 3)); \ - VNSvOutPortB(iobase + MAC_REG_BSSID0 + 4, \ - *(pbyEtherAddr + 4)); \ - VNSvOutPortB(iobase + MAC_REG_BSSID0 + 5, \ - *(pbyEtherAddr + 5)); \ - VNSvOutPortB(iobase + MAC_REG_PAGE1SEL, 0); \ + iowrite8(1, iobase + MAC_REG_PAGE1SEL); \ + iowrite8(pbyEtherAddr[0], iobase + MAC_REG_BSSID0); \ + iowrite8(pbyEtherAddr[1], iobase + MAC_REG_BSSID0 + 1); \ + iowrite8(pbyEtherAddr[2], iobase + MAC_REG_BSSID0 + 2); \ + iowrite8(pbyEtherAddr[3], iobase + MAC_REG_BSSID0 + 3); \ + iowrite8(pbyEtherAddr[4], iobase + MAC_REG_BSSID0 + 4); \ + iowrite8(pbyEtherAddr[5], iobase + MAC_REG_BSSID0 + 5); \ + iowrite8(0, iobase + MAC_REG_PAGE1SEL); \ } while (0) #define MACvReadEtherAddress(iobase, pbyEtherAddr) \ do { \ - VNSvOutPortB(iobase + MAC_REG_PAGE1SEL, 1); \ - VNSvInPortB(iobase + MAC_REG_PAR0, \ - (unsigned char *)pbyEtherAddr); \ - VNSvInPortB(iobase + MAC_REG_PAR0 + 1, \ - pbyEtherAddr + 1); \ - VNSvInPortB(iobase + MAC_REG_PAR0 + 2, \ - pbyEtherAddr + 2); \ - VNSvInPortB(iobase + MAC_REG_PAR0 + 3, \ - pbyEtherAddr + 3); \ - VNSvInPortB(iobase + MAC_REG_PAR0 + 4, \ - pbyEtherAddr + 4); \ - VNSvInPortB(iobase + MAC_REG_PAR0 + 5, \ - pbyEtherAddr + 5); \ - VNSvOutPortB(iobase + MAC_REG_PAGE1SEL, 0); \ + iowrite8(1, iobase + MAC_REG_PAGE1SEL); \ + pbyEtherAddr[0] = ioread8(iobase + MAC_REG_PAR0); \ + pbyEtherAddr[1] = ioread8(iobase + MAC_REG_PAR0 + 1); \ + pbyEtherAddr[2] = ioread8(iobase + MAC_REG_PAR0 + 2); \ + pbyEtherAddr[3] = ioread8(iobase + MAC_REG_PAR0 + 3); \ + pbyEtherAddr[4] = ioread8(iobase + MAC_REG_PAR0 + 4); \ + pbyEtherAddr[5] = ioread8(iobase + MAC_REG_PAR0 + 5); \ + iowrite8(0, iobase + MAC_REG_PAGE1SEL); \ } while (0) -#define MACvWriteEtherAddress(iobase, pbyEtherAddr) \ -do { \ - VNSvOutPortB(iobase + MAC_REG_PAGE1SEL, 1); \ - VNSvOutPortB(iobase + MAC_REG_PAR0, \ - *pbyEtherAddr); \ - VNSvOutPortB(iobase + MAC_REG_PAR0 + 1, \ - *(pbyEtherAddr + 1)); \ - VNSvOutPortB(iobase + MAC_REG_PAR0 + 2, \ - *(pbyEtherAddr + 2)); \ - VNSvOutPortB(iobase + MAC_REG_PAR0 + 3, \ - *(pbyEtherAddr + 3)); \ - VNSvOutPortB(iobase + MAC_REG_PAR0 + 4, \ - *(pbyEtherAddr + 4)); \ - VNSvOutPortB(iobase + MAC_REG_PAR0 + 5, \ - *(pbyEtherAddr + 5)); \ - VNSvOutPortB(iobase + MAC_REG_PAGE1SEL, 0); \ -} while (0) - -#define MACvClearISR(iobase) \ - VNSvOutPortD(iobase + MAC_REG_ISR, IMR_MASK_VALUE) - -#define MACvStart(iobase) \ - VNSvOutPortB(iobase + MAC_REG_HOSTCR, \ - (HOSTCR_MACEN | HOSTCR_RXON | HOSTCR_TXON)) - #define MACvRx0PerPktMode(iobase) \ VNSvOutPortD(iobase + MAC_REG_RXDMACTL0, RX_PERPKT) -#define MACvRx0BufferFillMode(iobase) \ - VNSvOutPortD(iobase + MAC_REG_RXDMACTL0, RX_PERPKTCLR) - #define MACvRx1PerPktMode(iobase) \ VNSvOutPortD(iobase + MAC_REG_RXDMACTL1, RX_PERPKT) -#define MACvRx1BufferFillMode(iobase) \ - VNSvOutPortD(iobase + MAC_REG_RXDMACTL1, RX_PERPKTCLR) - -#define MACvRxOn(iobase) \ - MACvRegBitsOn(iobase, MAC_REG_HOSTCR, HOSTCR_RXON) - #define MACvReceive0(iobase) \ do { \ unsigned long dwData; \ - VNSvInPortD(iobase + MAC_REG_RXDMACTL0, &dwData); \ + dwData = ioread32(iobase + MAC_REG_RXDMACTL0); \ if (dwData & DMACTL_RUN) \ VNSvOutPortD(iobase + MAC_REG_RXDMACTL0, DMACTL_WAKE); \ else \ @@ -729,20 +618,17 @@ do { \ #define MACvReceive1(iobase) \ do { \ unsigned long dwData; \ - VNSvInPortD(iobase + MAC_REG_RXDMACTL1, &dwData); \ + dwData = ioread32(iobase + MAC_REG_RXDMACTL1); \ if (dwData & DMACTL_RUN) \ VNSvOutPortD(iobase + MAC_REG_RXDMACTL1, DMACTL_WAKE); \ else \ VNSvOutPortD(iobase + MAC_REG_RXDMACTL1, DMACTL_RUN); \ } while (0) -#define MACvTxOn(iobase) \ - MACvRegBitsOn(iobase, MAC_REG_HOSTCR, HOSTCR_TXON) - #define MACvTransmit0(iobase) \ do { \ unsigned long dwData; \ - VNSvInPortD(iobase + MAC_REG_TXDMACTL0, &dwData); \ + dwData = ioread32(iobase + MAC_REG_TXDMACTL0); \ if (dwData & DMACTL_RUN) \ VNSvOutPortD(iobase + MAC_REG_TXDMACTL0, DMACTL_WAKE); \ else \ @@ -752,47 +638,21 @@ do { \ #define MACvTransmitAC0(iobase) \ do { \ unsigned long dwData; \ - VNSvInPortD(iobase + MAC_REG_AC0DMACTL, &dwData); \ + dwData = ioread32(iobase + MAC_REG_AC0DMACTL); \ if (dwData & DMACTL_RUN) \ VNSvOutPortD(iobase + MAC_REG_AC0DMACTL, DMACTL_WAKE); \ else \ VNSvOutPortD(iobase + MAC_REG_AC0DMACTL, DMACTL_RUN); \ } while (0) -#define MACvTransmitSYNC(iobase) \ -do { \ - unsigned long dwData; \ - VNSvInPortD(iobase + MAC_REG_SYNCDMACTL, &dwData); \ - if (dwData & DMACTL_RUN) \ - VNSvOutPortD(iobase + MAC_REG_SYNCDMACTL, DMACTL_WAKE); \ - else \ - VNSvOutPortD(iobase + MAC_REG_SYNCDMACTL, DMACTL_RUN); \ -} while (0) - -#define MACvTransmitATIM(iobase) \ -do { \ - unsigned long dwData; \ - VNSvInPortD(iobase + MAC_REG_ATIMDMACTL, &dwData); \ - if (dwData & DMACTL_RUN) \ - VNSvOutPortD(iobase + MAC_REG_ATIMDMACTL, DMACTL_WAKE); \ - else \ - VNSvOutPortD(iobase + MAC_REG_ATIMDMACTL, DMACTL_RUN); \ -} while (0) - -#define MACvTransmitBCN(iobase) \ - VNSvOutPortB(iobase + MAC_REG_BCNDMACTL, BEACON_READY) - #define MACvClearStckDS(iobase) \ do { \ unsigned char byOrgValue; \ - VNSvInPortB(iobase + MAC_REG_STICKHW, &byOrgValue); \ + byOrgValue = ioread8(iobase + MAC_REG_STICKHW); \ byOrgValue = byOrgValue & 0xFC; \ - VNSvOutPortB(iobase + MAC_REG_STICKHW, byOrgValue); \ + iowrite8(byOrgValue, iobase + MAC_REG_STICKHW); \ } while (0) -#define MACvReadISR(iobase, pdwValue) \ - VNSvInPortD(iobase + MAC_REG_ISR, pdwValue) - #define MACvWriteISR(iobase, dwValue) \ VNSvOutPortD(iobase + MAC_REG_ISR, dwValue) @@ -803,77 +663,58 @@ do { \ VNSvOutPortD(iobase + MAC_REG_IMR, 0) #define MACvSelectPage0(iobase) \ - VNSvOutPortB(iobase + MAC_REG_PAGE1SEL, 0) + iowrite8(0, iobase + MAC_REG_PAGE1SEL) #define MACvSelectPage1(iobase) \ - VNSvOutPortB(iobase + MAC_REG_PAGE1SEL, 1) - -#define MACvReadMIBCounter(iobase, pdwCounter) \ - VNSvInPortD(iobase + MAC_REG_MIBCNTR, pdwCounter) - -#define MACvPwrEvntDisable(iobase) \ - VNSvOutPortW(iobase + MAC_REG_WAKEUPEN0, 0x0000) + iowrite8(1, iobase + MAC_REG_PAGE1SEL) #define MACvEnableProtectMD(iobase) \ do { \ unsigned long dwOrgValue; \ - VNSvInPortD(iobase + MAC_REG_ENCFG, &dwOrgValue); \ - dwOrgValue = dwOrgValue | EnCFG_ProtectMd; \ + dwOrgValue = ioread32(iobase + MAC_REG_ENCFG); \ + dwOrgValue = dwOrgValue | ENCFG_PROTECTMD; \ VNSvOutPortD(iobase + MAC_REG_ENCFG, dwOrgValue); \ } while (0) #define MACvDisableProtectMD(iobase) \ do { \ unsigned long dwOrgValue; \ - VNSvInPortD(iobase + MAC_REG_ENCFG, &dwOrgValue); \ - dwOrgValue = dwOrgValue & ~EnCFG_ProtectMd; \ + dwOrgValue = ioread32(iobase + MAC_REG_ENCFG); \ + dwOrgValue = dwOrgValue & ~ENCFG_PROTECTMD; \ VNSvOutPortD(iobase + MAC_REG_ENCFG, dwOrgValue); \ } while (0) #define MACvEnableBarkerPreambleMd(iobase) \ do { \ unsigned long dwOrgValue; \ - VNSvInPortD(iobase + MAC_REG_ENCFG, &dwOrgValue); \ - dwOrgValue = dwOrgValue | EnCFG_BarkerPream; \ + dwOrgValue = ioread32(iobase + MAC_REG_ENCFG); \ + dwOrgValue = dwOrgValue | ENCFG_BARKERPREAM; \ VNSvOutPortD(iobase + MAC_REG_ENCFG, dwOrgValue); \ } while (0) #define MACvDisableBarkerPreambleMd(iobase) \ do { \ unsigned long dwOrgValue; \ - VNSvInPortD(iobase + MAC_REG_ENCFG, &dwOrgValue); \ - dwOrgValue = dwOrgValue & ~EnCFG_BarkerPream; \ + dwOrgValue = ioread32(iobase + MAC_REG_ENCFG); \ + dwOrgValue = dwOrgValue & ~ENCFG_BARKERPREAM; \ VNSvOutPortD(iobase + MAC_REG_ENCFG, dwOrgValue); \ } while (0) #define MACvSetBBType(iobase, byTyp) \ do { \ unsigned long dwOrgValue; \ - VNSvInPortD(iobase + MAC_REG_ENCFG, &dwOrgValue); \ - dwOrgValue = dwOrgValue & ~EnCFG_BBType_MASK; \ + dwOrgValue = ioread32(iobase + MAC_REG_ENCFG); \ + dwOrgValue = dwOrgValue & ~ENCFG_BBTYPE_MASK; \ dwOrgValue = dwOrgValue | (unsigned long)byTyp; \ VNSvOutPortD(iobase + MAC_REG_ENCFG, dwOrgValue); \ } while (0) -#define MACvReadATIMW(iobase, pwCounter) \ - VNSvInPortW(iobase + MAC_REG_AIDATIM, pwCounter) - -#define MACvWriteATIMW(iobase, wCounter) \ - VNSvOutPortW(iobase + MAC_REG_AIDATIM, wCounter) - -#define MACvWriteCRC16_128(iobase, byRegOfs, wCRC) \ -do { \ - VNSvOutPortB(iobase + MAC_REG_PAGE1SEL, 1); \ - VNSvOutPortW(iobase + byRegOfs, wCRC); \ - VNSvOutPortB(iobase + MAC_REG_PAGE1SEL, 0); \ -} while (0) - -#define MACvGPIOIn(iobase, pbyValue) \ - VNSvInPortB(iobase + MAC_REG_GPIOCTL1, pbyValue) - #define MACvSetRFLE_LatchBase(iobase) \ MACvWordRegBitsOn(iobase, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_RFLEOPT) +#define MAKEWORD(lb, hb) \ + ((unsigned short)(((unsigned char)(lb)) | (((unsigned short)((unsigned char)(hb))) << 8))) + bool MACbIsRegBitsOff(struct vnt_private *priv, unsigned char byRegOfs, unsigned char byTestBits); diff --git a/drivers/staging/vt6655/rf.c b/drivers/staging/vt6655/rf.c index 4498c9d400f2..ee5e2e0d9a8c 100644 --- a/drivers/staging/vt6655/rf.c +++ b/drivers/staging/vt6655/rf.c @@ -175,7 +175,7 @@ bool IFRFbWriteEmbedded(struct vnt_private *priv, unsigned long dwData) /* W_MAX_TIMEOUT is the timeout period */ for (ww = 0; ww < W_MAX_TIMEOUT; ww++) { - VNSvInPortD(iobase + MAC_REG_IFREGCTL, &dwValue); + dwValue = ioread32(iobase + MAC_REG_IFREGCTL); if (dwValue & IFREGCTL_DONE) break; } @@ -207,7 +207,7 @@ static bool RFbAL2230Init(struct vnt_private *priv) ret = true; /* 3-wire control for normal mode */ - VNSvOutPortB(iobase + MAC_REG_SOFTPWRCTL, 0); + iowrite8(0, iobase + MAC_REG_SOFTPWRCTL); MACvWordRegBitsOn(iobase, MAC_REG_SOFTPWRCTL, (SOFTPWRCTL_SWPECTI | SOFTPWRCTL_TXPEINV)); @@ -238,7 +238,7 @@ static bool RFbAL2230Init(struct vnt_private *priv) SOFTPWRCTL_TXPEINV)); /* 3-wire control for power saving mode */ - VNSvOutPortB(iobase + MAC_REG_PSPWRSIG, (PSSIG_WPE3 | PSSIG_WPE2)); /* 1100 0000 */ + iowrite8(PSSIG_WPE3 | PSSIG_WPE2, iobase + MAC_REG_PSPWRSIG); return ret; } @@ -254,10 +254,10 @@ static bool RFbAL2230SelectChannel(struct vnt_private *priv, unsigned char byCha ret &= IFRFbWriteEmbedded(priv, al2230_channel_table1[byChannel - 1]); /* Set Channel[7] = 0 to tell H/W channel is changing now. */ - VNSvOutPortB(iobase + MAC_REG_CHANNEL, (byChannel & 0x7F)); + iowrite8(byChannel & 0x7F, iobase + MAC_REG_CHANNEL); MACvTimer0MicroSDelay(priv, SWITCH_CHANNEL_DELAY_AL2230); /* Set Channel[7] = 1 to tell H/W channel change is done. */ - VNSvOutPortB(iobase + MAC_REG_CHANNEL, (byChannel | 0x80)); + iowrite8(byChannel | 0x80, iobase + MAC_REG_CHANNEL); return ret; } diff --git a/drivers/staging/vt6655/rxtx.c b/drivers/staging/vt6655/rxtx.c index 53506e242a96..71cbfa607d96 100644 --- a/drivers/staging/vt6655/rxtx.c +++ b/drivers/staging/vt6655/rxtx.c @@ -1426,7 +1426,7 @@ static int vnt_beacon_xmit(struct vnt_private *priv, /* Set auto Transmit on */ MACvRegBitsOn(priv->port_offset, MAC_REG_TCR, TCR_AUTOBCNTX); /* Poll Transmit the adapter */ - MACvTransmitBCN(priv->port_offset); + iowrite8(BEACON_READY, priv->port_offset + MAC_REG_BCNDMACTL); return 0; } @@ -1450,9 +1450,9 @@ int vnt_beacon_make(struct vnt_private *priv, struct ieee80211_vif *vif) int vnt_beacon_enable(struct vnt_private *priv, struct ieee80211_vif *vif, struct ieee80211_bss_conf *conf) { - VNSvOutPortB(priv->port_offset + MAC_REG_TFTCTL, TFTCTL_TSFCNTRST); + iowrite8(TFTCTL_TSFCNTRST, priv->port_offset + MAC_REG_TFTCTL); - VNSvOutPortB(priv->port_offset + MAC_REG_TFTCTL, TFTCTL_TSFCNTREN); + iowrite8(TFTCTL_TSFCNTREN, priv->port_offset + MAC_REG_TFTCTL); CARDvSetFirstNextTBTT(priv, conf->beacon_int); diff --git a/drivers/staging/vt6655/srom.c b/drivers/staging/vt6655/srom.c index 5cdbc24e8c45..722a2cc9a473 100644 --- a/drivers/staging/vt6655/srom.c +++ b/drivers/staging/vt6655/srom.c @@ -28,7 +28,6 @@ */ #include "upc.h" -#include "tmacro.h" #include "mac.h" #include "srom.h" @@ -66,29 +65,29 @@ unsigned char SROMbyReadEmbedded(void __iomem *iobase, unsigned char byOrg; byData = 0xFF; - VNSvInPortB(iobase + MAC_REG_I2MCFG, &byOrg); + byOrg = ioread8(iobase + MAC_REG_I2MCFG); /* turn off hardware retry for getting NACK */ - VNSvOutPortB(iobase + MAC_REG_I2MCFG, (byOrg & (~I2MCFG_NORETRY))); + iowrite8(byOrg & (~I2MCFG_NORETRY), iobase + MAC_REG_I2MCFG); for (wNoACK = 0; wNoACK < W_MAX_I2CRETRY; wNoACK++) { - VNSvOutPortB(iobase + MAC_REG_I2MTGID, EEP_I2C_DEV_ID); - VNSvOutPortB(iobase + MAC_REG_I2MTGAD, byContntOffset); + iowrite8(EEP_I2C_DEV_ID, iobase + MAC_REG_I2MTGID); + iowrite8(byContntOffset, iobase + MAC_REG_I2MTGAD); /* issue read command */ - VNSvOutPortB(iobase + MAC_REG_I2MCSR, I2MCSR_EEMR); + iowrite8(I2MCSR_EEMR, iobase + MAC_REG_I2MCSR); /* wait DONE be set */ for (wDelay = 0; wDelay < W_MAX_TIMEOUT; wDelay++) { - VNSvInPortB(iobase + MAC_REG_I2MCSR, &byWait); + byWait = ioread8(iobase + MAC_REG_I2MCSR); if (byWait & (I2MCSR_DONE | I2MCSR_NACK)) break; - PCAvDelayByIO(CB_DELAY_LOOP_WAIT); + udelay(CB_DELAY_LOOP_WAIT); } if ((wDelay < W_MAX_TIMEOUT) && (!(byWait & I2MCSR_NACK))) { break; } } - VNSvInPortB(iobase + MAC_REG_I2MDIPT, &byData); - VNSvOutPortB(iobase + MAC_REG_I2MCFG, byOrg); + byData = ioread8(iobase + MAC_REG_I2MDIPT); + iowrite8(byOrg, iobase + MAC_REG_I2MCFG); return byData; } diff --git a/drivers/staging/vt6655/tmacro.h b/drivers/staging/vt6655/tmacro.h deleted file mode 100644 index 1582c03124c9..000000000000 --- a/drivers/staging/vt6655/tmacro.h +++ /dev/null @@ -1,43 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0+ */ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * Purpose: define basic common types and macros - * - * Author: Tevin Chen - * - * Date: May 21, 1996 - * - */ - -#ifndef __TMACRO_H__ -#define __TMACRO_H__ - -/****** Common helper macros ***********************************************/ - -#if !defined(LOBYTE) -#define LOBYTE(w) ((unsigned char)(w)) -#endif -#if !defined(HIBYTE) -#define HIBYTE(w) ((unsigned char)(((unsigned short)(w) >> 8) & 0xFF)) -#endif - -#if !defined(LOWORD) -#define LOWORD(d) ((unsigned short)(d)) -#endif -#if !defined(HIWORD) -#define HIWORD(d) ((unsigned short)((((unsigned long)(d)) >> 16) & 0xFFFF)) -#endif - -#define LODWORD(q) ((q).u.dwLowDword) -#define HIDWORD(q) ((q).u.dwHighDword) - -#if !defined(MAKEWORD) -#define MAKEWORD(lb, hb) ((unsigned short)(((unsigned char)(lb)) | (((unsigned short)((unsigned char)(hb))) << 8))) -#endif -#if !defined(MAKEDWORD) -#define MAKEDWORD(lw, hw) ((unsigned long)(((unsigned short)(lw)) | (((unsigned long)((unsigned short)(hw))) << 16))) -#endif - -#endif /* __TMACRO_H__ */ diff --git a/drivers/staging/vt6655/upc.h b/drivers/staging/vt6655/upc.h index b374db5fca81..2a47f5782b71 100644 --- a/drivers/staging/vt6655/upc.h +++ b/drivers/staging/vt6655/upc.h @@ -20,37 +20,12 @@ /* For memory mapped IO */ -#define VNSvInPortB(dwIOAddress, pbyData) \ - (*(pbyData) = ioread8(dwIOAddress)) - -#define VNSvInPortW(dwIOAddress, pwData) \ - (*(pwData) = ioread16(dwIOAddress)) - -#define VNSvInPortD(dwIOAddress, pdwData) \ - (*(pdwData) = ioread32(dwIOAddress)) - -#define VNSvOutPortB(dwIOAddress, byData) \ - iowrite8((u8)(byData), dwIOAddress) - #define VNSvOutPortW(dwIOAddress, wData) \ iowrite16((u16)(wData), dwIOAddress) #define VNSvOutPortD(dwIOAddress, dwData) \ iowrite32((u32)(dwData), dwIOAddress) -#define PCAvDelayByIO(uDelayUnit) \ -do { \ - unsigned char __maybe_unused byData; \ - unsigned long ii; \ - \ - if (uDelayUnit <= 50) { \ - udelay(uDelayUnit); \ - } else { \ - for (ii = 0; ii < (uDelayUnit); ii++) \ - byData = inb(0x61); \ - } \ -} while (0) - /*--------------------- Export Classes ----------------------------*/ /*--------------------- Export Variables --------------------------*/ diff --git a/drivers/staging/vt6656/channel.c b/drivers/staging/vt6656/channel.c index aca003031995..413e2fc4a50d 100644 --- a/drivers/staging/vt6656/channel.c +++ b/drivers/staging/vt6656/channel.c @@ -55,7 +55,6 @@ static struct ieee80211_channel vnt_channels_2ghz[] = { { .center_freq = 2484, .hw_value = 14 } }; - static struct ieee80211_supported_band vnt_supported_2ghz_band = { .channels = vnt_channels_2ghz, .n_channels = ARRAY_SIZE(vnt_channels_2ghz), diff --git a/drivers/staging/vt6656/rf.c b/drivers/staging/vt6656/rf.c index acbbf8acdf1b..464602c74727 100644 --- a/drivers/staging/vt6656/rf.c +++ b/drivers/staging/vt6656/rf.c @@ -82,7 +82,6 @@ static u8 al2230_channel_table1[CB_MAX_CHANNEL_24G][3] = { {0x06, 0x66, 0x61} }; - static u8 vt3226_init_table[CB_VT3226_INIT_SEQ][3] = { {0x03, 0xff, 0x80}, {0x02, 0x82, 0xa1}, diff --git a/drivers/staging/wlan-ng/cfg80211.c b/drivers/staging/wlan-ng/cfg80211.c index 7951bd63816f..87379edce9a8 100644 --- a/drivers/staging/wlan-ng/cfg80211.c +++ b/drivers/staging/wlan-ng/cfg80211.c @@ -328,8 +328,7 @@ static int prism2_scan(struct wiphy *wiphy, (i < request->n_channels) && i < ARRAY_SIZE(prism2_channels); i++) msg1.channellist.data.data[i] = - ieee80211_frequency_to_channel( - request->channels[i]->center_freq); + ieee80211_frequency_to_channel(request->channels[i]->center_freq); msg1.channellist.data.len = request->n_channels; msg1.maxchanneltime.data = 250; @@ -476,14 +475,13 @@ static int prism2_connect(struct wiphy *wiphy, struct net_device *dev, return -EINVAL; result = prism2_domibset_uint32(wlandev, - DIDMIB_DOT11SMT_PRIVACYTABLE_WEPDEFAULTKEYID, + DIDMIB_DOT11SMT_PRIVACYTABLE_WEPDEFAULTKEYID, sme->key_idx); if (result) goto exit; /* send key to driver */ - did = didmib_dot11smt_wepdefaultkeystable_key( - sme->key_idx + 1); + did = didmib_dot11smt_wepdefaultkeystable_key(sme->key_idx + 1); result = prism2_domibset_pstr32(wlandev, did, sme->key_len, (u8 *)sme->key); @@ -589,7 +587,7 @@ static int prism2_set_tx_power(struct wiphy *wiphy, struct wireless_dev *wdev, data = MBM_TO_DBM(mbm); result = prism2_domibset_uint32(wlandev, - DIDMIB_DOT11PHY_TXPOWERTABLE_CURRENTTXPOWERLEVEL, + DIDMIB_DOT11PHY_TXPOWERTABLE_CURRENTTXPOWERLEVEL, data); if (result) { diff --git a/drivers/staging/wlan-ng/hfa384x.h b/drivers/staging/wlan-ng/hfa384x.h index 98c154a8d8c1..0611e37df6ac 100644 --- a/drivers/staging/wlan-ng/hfa384x.h +++ b/drivers/staging/wlan-ng/hfa384x.h @@ -1227,8 +1227,8 @@ struct hfa384x { struct timer_list throttle; - struct tasklet_struct reaper_bh; - struct tasklet_struct completion_bh; + struct work_struct reaper_bh; + struct work_struct completion_bh; struct work_struct usb_work; diff --git a/drivers/staging/wlan-ng/hfa384x_usb.c b/drivers/staging/wlan-ng/hfa384x_usb.c index 938e11a1a0b6..33844526c797 100644 --- a/drivers/staging/wlan-ng/hfa384x_usb.c +++ b/drivers/staging/wlan-ng/hfa384x_usb.c @@ -191,9 +191,9 @@ static void hfa384x_usbctlx_resptimerfn(struct timer_list *t); static void hfa384x_usb_throttlefn(struct timer_list *t); -static void hfa384x_usbctlx_completion_task(struct tasklet_struct *t); +static void hfa384x_usbctlx_completion_task(struct work_struct *work); -static void hfa384x_usbctlx_reaper_task(struct tasklet_struct *t); +static void hfa384x_usbctlx_reaper_task(struct work_struct *work); static int hfa384x_usbctlx_submit(struct hfa384x *hw, struct hfa384x_usbctlx *ctlx); @@ -539,8 +539,8 @@ void hfa384x_create(struct hfa384x *hw, struct usb_device *usb) /* Initialize the authentication queue */ skb_queue_head_init(&hw->authq); - tasklet_setup(&hw->reaper_bh, hfa384x_usbctlx_reaper_task); - tasklet_setup(&hw->completion_bh, hfa384x_usbctlx_completion_task); + INIT_WORK(&hw->reaper_bh, hfa384x_usbctlx_reaper_task); + INIT_WORK(&hw->completion_bh, hfa384x_usbctlx_completion_task); INIT_WORK(&hw->link_bh, prism2sta_processing_defer); INIT_WORK(&hw->usb_work, hfa384x_usb_defer); @@ -2585,20 +2585,20 @@ void hfa384x_tx_timeout(struct wlandevice *wlandev) /*---------------------------------------------------------------- * hfa384x_usbctlx_reaper_task * - * Tasklet to delete dead CTLX objects + * Deferred work callback to delete dead CTLX objects * * Arguments: - * data ptr to a struct hfa384x + * work contains ptr to a struct hfa384x * * Returns: * * Call context: - * Interrupt + * Task *---------------------------------------------------------------- */ -static void hfa384x_usbctlx_reaper_task(struct tasklet_struct *t) +static void hfa384x_usbctlx_reaper_task(struct work_struct *work) { - struct hfa384x *hw = from_tasklet(hw, t, reaper_bh); + struct hfa384x *hw = container_of(work, struct hfa384x, reaper_bh); struct hfa384x_usbctlx *ctlx, *temp; unsigned long flags; @@ -2618,21 +2618,21 @@ static void hfa384x_usbctlx_reaper_task(struct tasklet_struct *t) /*---------------------------------------------------------------- * hfa384x_usbctlx_completion_task * - * Tasklet to call completion handlers for returned CTLXs + * Deferred work callback to call completion handlers for returned CTLXs * * Arguments: - * data ptr to struct hfa384x + * work contains ptr to a struct hfa384x * * Returns: * Nothing * * Call context: - * Interrupt + * Task *---------------------------------------------------------------- */ -static void hfa384x_usbctlx_completion_task(struct tasklet_struct *t) +static void hfa384x_usbctlx_completion_task(struct work_struct *work) { - struct hfa384x *hw = from_tasklet(hw, t, completion_bh); + struct hfa384x *hw = container_of(work, struct hfa384x, reaper_bh); struct hfa384x_usbctlx *ctlx, *temp; unsigned long flags; @@ -2686,7 +2686,7 @@ static void hfa384x_usbctlx_completion_task(struct tasklet_struct *t) spin_unlock_irqrestore(&hw->ctlxq.lock, flags); if (reap) - tasklet_schedule(&hw->reaper_bh); + schedule_work(&hw->reaper_bh); } /*---------------------------------------------------------------- @@ -2743,7 +2743,7 @@ static int unlocked_usbctlx_cancel_async(struct hfa384x *hw, * aren't active and the timers should have been stopped. * * The CTLX is migrated to the "completing" queue, and the completing - * tasklet is scheduled. + * work is scheduled. * * Arguments: * hw ptr to a struct hfa384x structure @@ -2766,7 +2766,7 @@ static void unlocked_usbctlx_complete(struct hfa384x *hw, * queue. */ list_move_tail(&ctlx->list, &hw->ctlxq.completing); - tasklet_schedule(&hw->completion_bh); + schedule_work(&hw->completion_bh); switch (ctlx->state) { case CTLX_COMPLETE: diff --git a/drivers/staging/wlan-ng/prism2usb.c b/drivers/staging/wlan-ng/prism2usb.c index dc0749b8eff7..e13da7fadfff 100644 --- a/drivers/staging/wlan-ng/prism2usb.c +++ b/drivers/staging/wlan-ng/prism2usb.c @@ -165,8 +165,8 @@ static void prism2sta_disconnect_usb(struct usb_interface *interface) spin_unlock_irqrestore(&hw->ctlxq.lock, flags); /* There's no hardware to shutdown, but the driver - * might have some tasks or tasklets that must be - * stopped before we can tear everything down. + * might have some tasks that must be stopped before + * we can tear everything down. */ prism2sta_ifstate(wlandev, P80211ENUM_ifstate_disable); @@ -181,8 +181,8 @@ static void prism2sta_disconnect_usb(struct usb_interface *interface) usb_kill_urb(&hw->tx_urb); usb_kill_urb(&hw->ctlx_urb); - tasklet_kill(&hw->completion_bh); - tasklet_kill(&hw->reaper_bh); + cancel_work_sync(&hw->completion_bh); + cancel_work_sync(&hw->reaper_bh); cancel_work_sync(&hw->link_bh); cancel_work_sync(&hw->commsqual_bh); diff --git a/drivers/visorbus/Kconfig b/drivers/visorbus/Kconfig deleted file mode 100644 index fa947a79b5cd..000000000000 --- a/drivers/visorbus/Kconfig +++ /dev/null @@ -1,15 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -# -# Unisys visorbus configuration -# - -config UNISYS_VISORBUS - tristate "Unisys visorbus driver" - depends on X86_64 && ACPI - help - The visorbus driver is a virtualized bus for the Unisys s-Par firmware. - Virtualized devices allow Linux guests on a system to share disks and - network cards that do not have SR-IOV support, and to be accessed using - the partition desktop application. The visorbus driver is required to - discover devices on an s-Par guest, and must be present for any other - s-Par guest driver to function correctly. diff --git a/drivers/visorbus/Makefile b/drivers/visorbus/Makefile deleted file mode 100644 index e8df59d1301f..000000000000 --- a/drivers/visorbus/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# -# Makefile for Unisys visorbus -# - -obj-$(CONFIG_UNISYS_VISORBUS) += visorbus.o - -visorbus-y := visorbus_main.o -visorbus-y += visorchannel.o -visorbus-y += visorchipset.o diff --git a/drivers/visorbus/controlvmchannel.h b/drivers/visorbus/controlvmchannel.h deleted file mode 100644 index c87213554427..000000000000 --- a/drivers/visorbus/controlvmchannel.h +++ /dev/null @@ -1,650 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Copyright (C) 2010 - 2015 UNISYS CORPORATION - * All rights reserved. - */ - -#ifndef __CONTROLVMCHANNEL_H__ -#define __CONTROLVMCHANNEL_H__ - -#include <linux/uuid.h> -#include <linux/visorbus.h> - -/* {2B3C2D10-7EF5-4ad8-B966-3448B7386B3D} */ -#define VISOR_CONTROLVM_CHANNEL_GUID \ - GUID_INIT(0x2b3c2d10, 0x7ef5, 0x4ad8, \ - 0xb9, 0x66, 0x34, 0x48, 0xb7, 0x38, 0x6b, 0x3d) - -#define CONTROLVM_MESSAGE_MAX 64 - -/* - * Must increment this whenever you insert or delete fields within this channel - * struct. Also increment whenever you change the meaning of fields within this - * channel struct so as to break pre-existing software. Note that you can - * usually add fields to the END of the channel struct withOUT needing to - * increment this. - */ -#define VISOR_CONTROLVM_CHANNEL_VERSIONID 1 - -/* Defines for various channel queues */ -#define CONTROLVM_QUEUE_REQUEST 0 -#define CONTROLVM_QUEUE_RESPONSE 1 -#define CONTROLVM_QUEUE_EVENT 2 -#define CONTROLVM_QUEUE_ACK 3 - -/* Max num of messages stored during IOVM creation to be reused after crash */ -#define CONTROLVM_CRASHMSG_MAX 2 - -/* - * struct visor_segment_state - * @enabled: May enter other states. - * @active: Assigned to active partition. - * @alive: Configure message sent to service/server. - * @revoked: Similar to partition state ShuttingDown. - * @allocated: Memory (device/port number) has been selected by Command. - * @known: Has been introduced to the service/guest partition. - * @ready: Service/Guest partition has responded to introduction. - * @operating: Resource is configured and operating. - * @reserved: Natural alignment. - * - * Note: Don't use high bit unless we need to switch to ushort which is - * non-compliant. - */ -struct visor_segment_state { - u16 enabled:1; - u16 active:1; - u16 alive:1; - u16 revoked:1; - u16 allocated:1; - u16 known:1; - u16 ready:1; - u16 operating:1; - u16 reserved:8; -} __packed; - -static const struct visor_segment_state segment_state_running = { - 1, 1, 1, 0, 1, 1, 1, 1 -}; - -static const struct visor_segment_state segment_state_paused = { - 1, 1, 1, 0, 1, 1, 1, 0 -}; - -static const struct visor_segment_state segment_state_standby = { - 1, 1, 0, 0, 1, 1, 1, 0 -}; - -/* - * enum controlvm_id - * @CONTROLVM_INVALID: - * @CONTROLVM_BUS_CREATE: CP --> SP, GP. - * @CONTROLVM_BUS_DESTROY: CP --> SP, GP. - * @CONTROLVM_BUS_CONFIGURE: CP --> SP. - * @CONTROLVM_BUS_CHANGESTATE: CP --> SP, GP. - * @CONTROLVM_BUS_CHANGESTATE_EVENT: SP, GP --> CP. - * @CONTROLVM_DEVICE_CREATE: CP --> SP, GP. - * @CONTROLVM_DEVICE_DESTROY: CP --> SP, GP. - * @CONTROLVM_DEVICE_CONFIGURE: CP --> SP. - * @CONTROLVM_DEVICE_CHANGESTATE: CP --> SP, GP. - * @CONTROLVM_DEVICE_CHANGESTATE_EVENT: SP, GP --> CP. - * @CONTROLVM_DEVICE_RECONFIGURE: CP --> Boot. - * @CONTROLVM_CHIPSET_INIT: CP --> SP, GP. - * @CONTROLVM_CHIPSET_STOP: CP --> SP, GP. - * @CONTROLVM_CHIPSET_READY: CP --> SP. - * @CONTROLVM_CHIPSET_SELFTEST: CP --> SP. - * - * Ids for commands that may appear in either queue of a ControlVm channel. - * - * Commands that are initiated by the command partition (CP), by an IO or - * console service partition (SP), or by a guest partition (GP) are: - * - issued on the RequestQueue queue (q #0) in the ControlVm channel - * - responded to on the ResponseQueue queue (q #1) in the ControlVm channel - * - * Events that are initiated by an IO or console service partition (SP) or - * by a guest partition (GP) are: - * - issued on the EventQueue queue (q #2) in the ControlVm channel - * - responded to on the EventAckQueue queue (q #3) in the ControlVm channel - */ -enum controlvm_id { - CONTROLVM_INVALID = 0, - /* - * SWITCH commands required Parameter: SwitchNumber. - * BUS commands required Parameter: BusNumber - */ - CONTROLVM_BUS_CREATE = 0x101, - CONTROLVM_BUS_DESTROY = 0x102, - CONTROLVM_BUS_CONFIGURE = 0x104, - CONTROLVM_BUS_CHANGESTATE = 0x105, - CONTROLVM_BUS_CHANGESTATE_EVENT = 0x106, - /* DEVICE commands required Parameter: BusNumber, DeviceNumber */ - CONTROLVM_DEVICE_CREATE = 0x201, - CONTROLVM_DEVICE_DESTROY = 0x202, - CONTROLVM_DEVICE_CONFIGURE = 0x203, - CONTROLVM_DEVICE_CHANGESTATE = 0x204, - CONTROLVM_DEVICE_CHANGESTATE_EVENT = 0x205, - CONTROLVM_DEVICE_RECONFIGURE = 0x206, - /* CHIPSET commands */ - CONTROLVM_CHIPSET_INIT = 0x301, - CONTROLVM_CHIPSET_STOP = 0x302, - CONTROLVM_CHIPSET_READY = 0x304, - CONTROLVM_CHIPSET_SELFTEST = 0x305, -}; - -/* - * struct irq_info - * @reserved1: Natural alignment purposes - * @recv_irq_handle: Specifies interrupt handle. It is used to retrieve the - * corresponding interrupt pin from Monitor; and the interrupt - * pin is used to connect to the corresponding interrupt. - * Used by IOPart-GP only. - * @recv_irq_vector: Specifies interrupt vector. It, interrupt pin, and shared - * are used to connect to the corresponding interrupt. - * Used by IOPart-GP only. - * @recv_irq_shared: Specifies if the recvInterrupt is shared. It, interrupt - * pin and vector are used to connect to 0 = not shared; - * 1 = shared the corresponding interrupt. - * Used by IOPart-GP only. - * @reserved: Natural alignment purposes - */ -struct irq_info { - u64 reserved1; - u64 recv_irq_handle; - u32 recv_irq_vector; - u8 recv_irq_shared; - u8 reserved[3]; -} __packed; - -/* - * struct efi_visor_indication - * @boot_to_fw_ui: Stop in UEFI UI - * @clear_nvram: Clear NVRAM - * @clear_cmos: Clear CMOS - * @boot_to_tool: Run install tool - * @reserved: Natural alignment - */ -struct efi_visor_indication { - u64 boot_to_fw_ui:1; - u64 clear_nvram:1; - u64 clear_cmos:1; - u64 boot_to_tool:1; - /* Remaining bits are available */ - u64 reserved:60; -} __packed; - -enum visor_chipset_feature { - VISOR_CHIPSET_FEATURE_REPLY = 0x00000001, - VISOR_CHIPSET_FEATURE_PARA_HOTPLUG = 0x00000002, -}; - -/* - * struct controlvm_message_header - * @id: See CONTROLVM_ID. - * @message_size: Includes size of this struct + size of message. - * @segment_index: Index of segment containing Vm message/information. - * @completion_status: Error status code or result of message completion. - * @struct flags: - * @failed: =1 in a response to signify failure. - * @response_expected: =1 in all messages that expect a response. - * @server: =1 in all bus & device-related messages where the - * message receiver is to act as the bus or device - * server. - * @test_message: =1 for testing use only (Control and Command - * ignore this). - * @partial_completion: =1 if there are forthcoming responses/acks - * associated with this message. - * @preserve: =1 this is to let us know to preserve channel - * contents. - * @writer_in_diag: =1 the DiagWriter is active in the Diagnostic - * Partition. - * @reserve: Natural alignment. - * @reserved: Natural alignment. - * @message_handle: Identifies the particular message instance. - * @payload_vm_offset: Offset of payload area from start of this instance. - * @payload_max_bytes: Maximum bytes allocated in payload area of ControlVm - * segment. - * @payload_bytes: Actual number of bytes of payload area to copy between - * IO/Command. If non-zero, there is a payload to copy. - * - * This is the common structure that is at the beginning of every - * ControlVm message (both commands and responses) in any ControlVm - * queue. Commands are easily distinguished from responses by - * looking at the flags.response field. - */ -struct controlvm_message_header { - u32 id; - /* - * For requests, indicates the message type. For responses, indicates - * the type of message we are responding to. - */ - u32 message_size; - u32 segment_index; - u32 completion_status; - struct { - u32 failed:1; - u32 response_expected:1; - u32 server:1; - u32 test_message:1; - u32 partial_completion:1; - u32 preserve:1; - u32 writer_in_diag:1; - u32 reserve:25; - } __packed flags; - u32 reserved; - u64 message_handle; - u64 payload_vm_offset; - u32 payload_max_bytes; - u32 payload_bytes; -} __packed; - -/* - * struct controlvm_packet_device_create - For CONTROLVM_DEVICE_CREATE - * @bus_no: Bus # (0..n-1) from the msg receiver's end. - * @dev_no: Bus-relative (0..n-1) device number. - * @channel_addr: Guest physical address of the channel, which can be - * dereferenced by the receiver of this ControlVm command. - * @channel_bytes: Specifies size of the channel in bytes. - * @data_type_uuid: Specifies format of data in channel. - * @dev_inst_uuid: Instance guid for the device. - * @irq_info intr: Specifies interrupt information. - */ -struct controlvm_packet_device_create { - u32 bus_no; - u32 dev_no; - u64 channel_addr; - u64 channel_bytes; - guid_t data_type_guid; - guid_t dev_inst_guid; - struct irq_info intr; -} __packed; - -/* - * struct controlvm_packet_device_configure - For CONTROLVM_DEVICE_CONFIGURE - * @bus_no: Bus number (0..n-1) from the msg receiver's perspective. - * @dev_no: Bus-relative (0..n-1) device number. - */ -struct controlvm_packet_device_configure { - u32 bus_no; - u32 dev_no; -} __packed; - -/* Total 128 bytes */ -struct controlvm_message_device_create { - struct controlvm_message_header header; - struct controlvm_packet_device_create packet; -} __packed; - -/* Total 56 bytes */ -struct controlvm_message_device_configure { - struct controlvm_message_header header; - struct controlvm_packet_device_configure packet; -} __packed; - -/* - * struct controlvm_message_packet - This is the format for a message in any - * ControlVm queue. - * @struct create_bus: For CONTROLVM_BUS_CREATE. - * @bus_no: Bus # (0..n-1) from the msg receiver's perspective. - * @dev_count: Indicates the max number of devices on this bus. - * @channel_addr: Guest physical address of the channel, which can be - * dereferenced by the receiver of this ControlVM - * command. - * @channel_bytes: Size of the channel. - * @bus_data_type_uuid: Indicates format of data in bus channel. - * @bus_inst_uuid: Instance uuid for the bus. - * - * @struct destroy_bus: For CONTROLVM_BUS_DESTROY. - * @bus_no: Bus # (0..n-1) from the msg receiver's perspective. - * @reserved: Natural alignment purposes. - * - * @struct configure_bus: For CONTROLVM_BUS_CONFIGURE. - * @bus_no: Bus # (0..n-1) from the receiver's perspective. - * @reserved1: For alignment purposes. - * @guest_handle: This is used to convert guest physical address to - * physical address. - * @recv_bus_irq_handle: Specifies interrupt info. It is used by SP to - * register to receive interrupts from the CP. This - * interrupt is used for bus level notifications. - * The corresponding sendBusInterruptHandle is kept - * in CP. - * - * @struct create_device: For CONTROLVM_DEVICE_CREATE. - * - * @struct destroy_device: For CONTROLVM_DEVICE_DESTROY. - * @bus_no: Bus # (0..n-1) from the msg receiver's perspective. - * @dev_no: Bus-relative (0..n-1) device number. - * - * @struct configure_device: For CONTROLVM_DEVICE_CONFIGURE. - * - * @struct reconfigure_device: For CONTROLVM_DEVICE_RECONFIGURE. - * @bus_no: Bus # (0..n-1) from the msg receiver's perspective. - * @dev_no: Bus-relative (0..n-1) device number. - * - * @struct bus_change_state: For CONTROLVM_BUS_CHANGESTATE. - * @bus_no: - * @struct state: - * @reserved: Natural alignment purposes. - * - * @struct device_change_state: For CONTROLVM_DEVICE_CHANGESTATE. - * @bus_no: - * @dev_no: - * @struct state: - * @struct flags: - * @phys_device: =1 if message is for a physical device. - * @reserved: Natural alignment. - * @reserved1: Natural alignment. - * @reserved: Natural alignment purposes. - * - * @struct device_change_state_event: For CONTROLVM_DEVICE_CHANGESTATE_EVENT. - * @bus_no: - * @dev_no: - * @struct state: - * @reserved: Natural alignment purposes. - * - * @struct init_chipset: For CONTROLVM_CHIPSET_INIT. - * @bus_count: Indicates the max number of busses. - * @switch_count: Indicates the max number of switches. - * @enum features: - * @platform_number: - * - * @struct chipset_selftest: For CONTROLVM_CHIPSET_SELFTEST. - * @options: Reserved. - * @test: Bit 0 set to run embedded selftest. - * - * @addr: A physical address of something, that can be dereferenced by the - * receiver of this ControlVm command. - * - * @handle: A handle of something (depends on command id). - */ -struct controlvm_message_packet { - union { - struct { - u32 bus_no; - u32 dev_count; - u64 channel_addr; - u64 channel_bytes; - guid_t bus_data_type_guid; - guid_t bus_inst_guid; - } __packed create_bus; - struct { - u32 bus_no; - u32 reserved; - } __packed destroy_bus; - struct { - u32 bus_no; - u32 reserved1; - u64 guest_handle; - u64 recv_bus_irq_handle; - } __packed configure_bus; - struct controlvm_packet_device_create create_device; - struct { - u32 bus_no; - u32 dev_no; - } __packed destroy_device; - struct controlvm_packet_device_configure configure_device; - struct { - u32 bus_no; - u32 dev_no; - } __packed reconfigure_device; - struct { - u32 bus_no; - struct visor_segment_state state; - u8 reserved[2]; - } __packed bus_change_state; - struct { - u32 bus_no; - u32 dev_no; - struct visor_segment_state state; - struct { - u32 phys_device:1; - u32 reserved:31; - u32 reserved1; - } __packed flags; - u8 reserved[2]; - } __packed device_change_state; - struct { - u32 bus_no; - u32 dev_no; - struct visor_segment_state state; - u8 reserved[6]; - } __packed device_change_state_event; - struct { - u32 bus_count; - u32 switch_count; - enum visor_chipset_feature features; - u32 platform_number; - } __packed init_chipset; - struct { - u32 options; - u32 test; - } __packed chipset_selftest; - u64 addr; - u64 handle; - }; -} __packed; - -/* All messages in any ControlVm queue have this layout. */ -struct controlvm_message { - struct controlvm_message_header hdr; - struct controlvm_message_packet cmd; -} __packed; - -/* - * struct visor_controlvm_channel - * @struct header: - * @gp_controlvm: Guest phys addr of this channel. - * @gp_partition_tables: Guest phys addr of partition tables. - * @gp_diag_guest: Guest phys addr of diagnostic channel. - * @gp_boot_romdisk: Guest phys addr of (read* only) Boot - * ROM disk. - * @gp_boot_ramdisk: Guest phys addr of writable Boot RAM - * disk. - * @gp_acpi_table: Guest phys addr of acpi table. - * @gp_control_channel: Guest phys addr of control channel. - * @gp_diag_romdisk: Guest phys addr of diagnostic ROM disk. - * @gp_nvram: Guest phys addr of NVRAM channel. - * @request_payload_offset: Offset to request payload area. - * @event_payload_offset: Offset to event payload area. - * @request_payload_bytes: Bytes available in request payload area. - * @event_payload_bytes: Bytes available in event payload area. - * @control_channel_bytes: - * @nvram_channel_bytes: Bytes in PartitionNvram segment. - * @message_bytes: sizeof(CONTROLVM_MESSAGE). - * @message_count: CONTROLVM_MESSAGE_MAX. - * @gp_smbios_table: Guest phys addr of SMBIOS tables. - * @gp_physical_smbios_table: Guest phys addr of SMBIOS table. - * @gp_reserved: VISOR_MAX_GUESTS_PER_SERVICE. - * @virtual_guest_firmware_image_base: Guest physical address of EFI firmware - * image base. - * @virtual_guest_firmware_entry_point: Guest physical address of EFI firmware - * entry point. - * @virtual_guest_firmware_image_size: Guest EFI firmware image size. - * @virtual_guest_firmware_boot_base: GPA = 1MB where EFI firmware image is - * copied to. - * @virtual_guest_image_base: - * @virtual_guest_image_size: - * @prototype_control_channel_offset: - * @virtual_guest_partition_handle: - * @restore_action: Restore Action field to restore the - * guest partition. - * @dump_action: For Windows guests it shows if the - * visordisk is in dump mode. - * @nvram_fail_count: - * @saved_crash_message_count: = CONTROLVM_CRASHMSG_MAX. - * @saved_crash_message_offset: Offset to request payload area needed - * for crash dump. - * @installation_error: Type of error encountered during - * installation. - * @installation_text_id: Id of string to display. - * @installation_remaining_steps: Number of remaining installation steps - * (for progress bars). - * @tool_action: VISOR_TOOL_ACTIONS Installation Action - * field. - * @reserved: Alignment. - * @struct efi_visor_ind: - * @sp_reserved: - * @reserved2: Force signals to begin on 128-byte - * cache line. - * @struct request_queue: Guest partition uses this queue to send - * requests to Control. - * @struct response_queue: Control uses this queue to respond to - * service or guest partition request. - * @struct event_queue: Control uses this queue to send events - * to guest partition. - * @struct event_ack_queue: Service or guest partition uses this - * queue to ack Control events. - * @struct request_msg: Request fixed-size message pool - - * does not include payload. - * @struct response_msg: Response fixed-size message pool - - * does not include payload. - * @struct event_msg: Event fixed-size message pool - - * does not include payload. - * @struct event_ack_msg: Ack fixed-size message pool - - * does not include payload. - * @struct saved_crash_msg: Message stored during IOVM creation to - * be reused after crash. - */ -struct visor_controlvm_channel { - struct channel_header header; - u64 gp_controlvm; - u64 gp_partition_tables; - u64 gp_diag_guest; - u64 gp_boot_romdisk; - u64 gp_boot_ramdisk; - u64 gp_acpi_table; - u64 gp_control_channel; - u64 gp_diag_romdisk; - u64 gp_nvram; - u64 request_payload_offset; - u64 event_payload_offset; - u32 request_payload_bytes; - u32 event_payload_bytes; - u32 control_channel_bytes; - u32 nvram_channel_bytes; - u32 message_bytes; - u32 message_count; - u64 gp_smbios_table; - u64 gp_physical_smbios_table; - char gp_reserved[2688]; - u64 virtual_guest_firmware_image_base; - u64 virtual_guest_firmware_entry_point; - u64 virtual_guest_firmware_image_size; - u64 virtual_guest_firmware_boot_base; - u64 virtual_guest_image_base; - u64 virtual_guest_image_size; - u64 prototype_control_channel_offset; - u64 virtual_guest_partition_handle; - u16 restore_action; - u16 dump_action; - u16 nvram_fail_count; - u16 saved_crash_message_count; - u32 saved_crash_message_offset; - u32 installation_error; - u32 installation_text_id; - u16 installation_remaining_steps; - u8 tool_action; - u8 reserved; - struct efi_visor_indication efi_visor_ind; - u32 sp_reserved; - u8 reserved2[28]; - struct signal_queue_header request_queue; - struct signal_queue_header response_queue; - struct signal_queue_header event_queue; - struct signal_queue_header event_ack_queue; - struct controlvm_message request_msg[CONTROLVM_MESSAGE_MAX]; - struct controlvm_message response_msg[CONTROLVM_MESSAGE_MAX]; - struct controlvm_message event_msg[CONTROLVM_MESSAGE_MAX]; - struct controlvm_message event_ack_msg[CONTROLVM_MESSAGE_MAX]; - struct controlvm_message saved_crash_msg[CONTROLVM_CRASHMSG_MAX]; -} __packed; - -/* - * struct visor_controlvm_parameters_header - * - * The following header will be located at the beginning of PayloadVmOffset for - * various ControlVm commands. The receiver of a ControlVm command with a - * PayloadVmOffset will dereference this address and then use connection_offset, - * initiator_offset, and target_offset to get the location of UTF-8 formatted - * strings that can be parsed to obtain command-specific information. The value - * of total_length should equal PayloadBytes. The format of the strings at - * PayloadVmOffset will take different forms depending on the message. - */ -struct visor_controlvm_parameters_header { - u32 total_length; - u32 header_length; - u32 connection_offset; - u32 connection_length; - u32 initiator_offset; - u32 initiator_length; - u32 target_offset; - u32 target_length; - u32 client_offset; - u32 client_length; - u32 name_offset; - u32 name_length; - guid_t id; - u32 revision; - /* Natural alignment */ - u32 reserved; -} __packed; - -/* General Errors------------------------------------------------------[0-99] */ -#define CONTROLVM_RESP_SUCCESS 0 -#define CONTROLVM_RESP_ALREADY_DONE 1 -#define CONTROLVM_RESP_IOREMAP_FAILED 2 -#define CONTROLVM_RESP_KMALLOC_FAILED 3 -#define CONTROLVM_RESP_ID_UNKNOWN 4 -#define CONTROLVM_RESP_ID_INVALID_FOR_CLIENT 5 -/* CONTROLVM_INIT_CHIPSET-------------------------------------------[100-199] */ -#define CONTROLVM_RESP_CLIENT_SWITCHCOUNT_NONZERO 100 -#define CONTROLVM_RESP_EXPECTED_CHIPSET_INIT 101 -/* Maximum Limit----------------------------------------------------[200-299] */ -/* BUS_CREATE */ -#define CONTROLVM_RESP_ERROR_MAX_BUSES 201 -/* DEVICE_CREATE */ -#define CONTROLVM_RESP_ERROR_MAX_DEVICES 202 -/* Payload and Parameter Related------------------------------------[400-499] */ -/* SWITCH_ATTACHEXTPORT, DEVICE_CONFIGURE */ -#define CONTROLVM_RESP_PAYLOAD_INVALID 400 -/* Multiple */ -#define CONTROLVM_RESP_INITIATOR_PARAMETER_INVALID 401 -/* DEVICE_CONFIGURE */ -#define CONTROLVM_RESP_TARGET_PARAMETER_INVALID 402 -/* DEVICE_CONFIGURE */ -#define CONTROLVM_RESP_CLIENT_PARAMETER_INVALID 403 -/* Specified[Packet Structure] Value--------------------------------[500-599] */ -/* SWITCH_ATTACHINTPORT */ -/* BUS_CONFIGURE, DEVICE_CREATE, DEVICE_CONFIG, DEVICE_DESTROY */ -#define CONTROLVM_RESP_BUS_INVALID 500 -/* SWITCH_ATTACHINTPORT*/ -/* DEVICE_CREATE, DEVICE_CONFIGURE, DEVICE_DESTROY */ -#define CONTROLVM_RESP_DEVICE_INVALID 501 -/* DEVICE_CREATE, DEVICE_CONFIGURE */ -#define CONTROLVM_RESP_CHANNEL_INVALID 502 -/* Partition Driver Callback Interface------------------------------[600-699] */ -/* BUS_CREATE, BUS_DESTROY, DEVICE_CREATE, DEVICE_DESTROY */ -#define CONTROLVM_RESP_VIRTPCI_DRIVER_FAILURE 604 -/* Unable to invoke VIRTPCI callback. VIRTPCI Callback returned error. */ -/* BUS_CREATE, BUS_DESTROY, DEVICE_CREATE, DEVICE_DESTROY */ -#define CONTROLVM_RESP_VIRTPCI_DRIVER_CALLBACK_ERROR 605 -/* Generic device callback returned error. */ -/* SWITCH_ATTACHEXTPORT, SWITCH_DETACHEXTPORT, DEVICE_CONFIGURE */ -#define CONTROLVM_RESP_GENERIC_DRIVER_CALLBACK_ERROR 606 -/* Bus Related------------------------------------------------------[700-799] */ -/* BUS_DESTROY */ -#define CONTROLVM_RESP_ERROR_BUS_DEVICE_ATTACHED 700 -/* Channel Related--------------------------------------------------[800-899] */ -/* GET_CHANNELINFO, DEVICE_DESTROY */ -#define CONTROLVM_RESP_CHANNEL_TYPE_UNKNOWN 800 -/* DEVICE_CREATE */ -#define CONTROLVM_RESP_CHANNEL_SIZE_TOO_SMALL 801 -/* Chipset Shutdown Related---------------------------------------[1000-1099] */ -#define CONTROLVM_RESP_CHIPSET_SHUTDOWN_FAILED 1000 -#define CONTROLVM_RESP_CHIPSET_SHUTDOWN_ALREADY_ACTIVE 1001 -/* Chipset Stop Related-------------------------------------------[1100-1199] */ -#define CONTROLVM_RESP_CHIPSET_STOP_FAILED_BUS 1100 -#define CONTROLVM_RESP_CHIPSET_STOP_FAILED_SWITCH 1101 -/* Device Related-------------------------------------------------[1400-1499] */ -#define CONTROLVM_RESP_DEVICE_UDEV_TIMEOUT 1400 - -/* __CONTROLVMCHANNEL_H__ */ -#endif diff --git a/drivers/visorbus/vbuschannel.h b/drivers/visorbus/vbuschannel.h deleted file mode 100644 index 98711fb6d66e..000000000000 --- a/drivers/visorbus/vbuschannel.h +++ /dev/null @@ -1,95 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Copyright (C) 2010 - 2015 UNISYS CORPORATION - * All rights reserved. - */ - -#ifndef __VBUSCHANNEL_H__ -#define __VBUSCHANNEL_H__ - -/* - * The vbus channel is the channel area provided via the BUS_CREATE controlvm - * message for each virtual bus. This channel area is provided to both server - * and client ends of the bus. The channel header area is initialized by - * the server, and the remaining information is filled in by the client. - * We currently use this for the client to provide various information about - * the client devices and client drivers for the server end to see. - */ - -#include <linux/uuid.h> -#include <linux/visorbus.h> - -/* {193b331b-c58f-11da-95a9-00e08161165f} */ -#define VISOR_VBUS_CHANNEL_GUID \ - GUID_INIT(0x193b331b, 0xc58f, 0x11da, \ - 0x95, 0xa9, 0x0, 0xe0, 0x81, 0x61, 0x16, 0x5f) - -/* - * Must increment this whenever you insert or delete fields within this channel - * struct. Also increment whenever you change the meaning of fields within this - * channel struct so as to break pre-existing software. Note that you can - * usually add fields to the END of the channel struct withOUT needing to - * increment this. - */ -#define VISOR_VBUS_CHANNEL_VERSIONID 1 - -/* - * struct visor_vbus_deviceinfo - * @devtype: Short string identifying the device type. - * @drvname: Driver .sys file name. - * @infostrs: Kernel vversion. - * @reserved: Pad size to 256 bytes. - * - * An array of this struct is present in the channel area for each vbus. It is - * filled in by the client side to provide info about the device and driver from - * the client's perspective. - */ -struct visor_vbus_deviceinfo { - u8 devtype[16]; - u8 drvname[16]; - u8 infostrs[96]; - u8 reserved[128]; -} __packed; - -/* - * struct visor_vbus_headerinfo - * @struct_bytes: Size of this struct in bytes. - * @device_info_struct_bytes: Size of VISOR_VBUS_DEVICEINFO. - * @dev_info_count: Num of items in DevInfo member. This is the - * allocated size. - * @chp_info_offset: Byte offset from beginning of this struct to the - * ChpInfo struct. - * @bus_info_offset: Byte offset from beginning of this struct to the - * BusInfo struct. - * @dev_info_offset: Byte offset from beginning of this struct to the - * DevInfo array. - * @reserved: Natural alignment. - */ -struct visor_vbus_headerinfo { - u32 struct_bytes; - u32 device_info_struct_bytes; - u32 dev_info_count; - u32 chp_info_offset; - u32 bus_info_offset; - u32 dev_info_offset; - u8 reserved[104]; -} __packed; - -/* - * struct visor_vbus_channel - * @channel_header: Initialized by server. - * @hdr_info: Initialized by server. - * @chp_info: Describes client chipset device and driver. - * @bus_info: Describes client bus device and driver. - * @dev_info: Describes client device and driver for each device on the - * bus. - */ -struct visor_vbus_channel { - struct channel_header channel_header; - struct visor_vbus_headerinfo hdr_info; - struct visor_vbus_deviceinfo chp_info; - struct visor_vbus_deviceinfo bus_info; - struct visor_vbus_deviceinfo dev_info[]; -} __packed; - -#endif diff --git a/drivers/visorbus/visorbus_main.c b/drivers/visorbus/visorbus_main.c deleted file mode 100644 index 152fd29f04f2..000000000000 --- a/drivers/visorbus/visorbus_main.c +++ /dev/null @@ -1,1234 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Copyright � 2010 - 2015 UNISYS CORPORATION - * All rights reserved. - */ - -#include <linux/ctype.h> -#include <linux/debugfs.h> -#include <linux/module.h> -#include <linux/slab.h> -#include <linux/visorbus.h> -#include <linux/uuid.h> - -#include "visorbus_private.h" - -static const guid_t visor_vbus_channel_guid = VISOR_VBUS_CHANNEL_GUID; - -/* Display string that is guaranteed to be no longer the 99 characters */ -#define LINESIZE 99 -#define POLLJIFFIES_NORMALCHANNEL 10 - -/* stores whether bus_registration was successful */ -static bool initialized; -static struct dentry *visorbus_debugfs_dir; - -/* - * DEVICE type attributes - * - * The modalias file will contain the guid of the device. - */ -static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, - char *buf) -{ - struct visor_device *vdev; - const guid_t *guid; - - vdev = to_visor_device(dev); - guid = visorchannel_get_guid(vdev->visorchannel); - return sprintf(buf, "visorbus:%pUl\n", guid); -} -static DEVICE_ATTR_RO(modalias); - -static struct attribute *visorbus_dev_attrs[] = { - &dev_attr_modalias.attr, - NULL, -}; - -ATTRIBUTE_GROUPS(visorbus_dev); - -/* filled in with info about parent chipset driver when we register with it */ -static struct visor_vbus_deviceinfo chipset_driverinfo; -/* filled in with info about this driver, wrt it servicing client busses */ -static struct visor_vbus_deviceinfo clientbus_driverinfo; - -/* list of visor_device structs, linked via .list_all */ -static LIST_HEAD(list_all_bus_instances); -/* list of visor_device structs, linked via .list_all */ -static LIST_HEAD(list_all_device_instances); - -/* - * Generic function useful for validating any type of channel when it is - * received by the client that will be accessing the channel. - * Note that <logCtx> is only needed for callers in the EFI environment, and - * is used to pass the EFI_DIAG_CAPTURE_PROTOCOL needed to log messages. - */ -int visor_check_channel(struct channel_header *ch, struct device *dev, - const guid_t *expected_guid, char *chname, - u64 expected_min_bytes, u32 expected_version, - u64 expected_signature) -{ - if (!guid_is_null(expected_guid)) { - /* caller wants us to verify type GUID */ - if (!guid_equal(&ch->chtype, expected_guid)) { - dev_err(dev, "Channel mismatch on channel=%s(%pUL) field=type expected=%pUL actual=%pUL\n", - chname, expected_guid, expected_guid, - &ch->chtype); - return 0; - } - } - /* verify channel size */ - if (expected_min_bytes > 0) { - if (ch->size < expected_min_bytes) { - dev_err(dev, "Channel mismatch on channel=%s(%pUL) field=size expected=0x%-8.8Lx actual=0x%-8.8Lx\n", - chname, expected_guid, - (unsigned long long)expected_min_bytes, - ch->size); - return 0; - } - } - /* verify channel version */ - if (expected_version > 0) { - if (ch->version_id != expected_version) { - dev_err(dev, "Channel mismatch on channel=%s(%pUL) field=version expected=0x%-8.8lx actual=0x%-8.8x\n", - chname, expected_guid, - (unsigned long)expected_version, - ch->version_id); - return 0; - } - } - /* verify channel signature */ - if (expected_signature > 0) { - if (ch->signature != expected_signature) { - dev_err(dev, "Channel mismatch on channel=%s(%pUL) field=signature expected=0x%-8.8Lx actual=0x%-8.8Lx\n", - chname, expected_guid, expected_signature, - ch->signature); - return 0; - } - } - return 1; -} - -static int visorbus_uevent(struct device *xdev, struct kobj_uevent_env *env) -{ - struct visor_device *dev; - const guid_t *guid; - - dev = to_visor_device(xdev); - guid = visorchannel_get_guid(dev->visorchannel); - return add_uevent_var(env, "MODALIAS=visorbus:%pUl", guid); -} - -/* - * visorbus_match() - called automatically upon adding a visor_device - * (device_add), or adding a visor_driver - * (visorbus_register_visor_driver) - * @xdev: struct device for the device being matched - * @xdrv: struct device_driver for driver to match device against - * - * Return: 1 iff the provided driver can control the specified device - */ -static int visorbus_match(struct device *xdev, struct device_driver *xdrv) -{ - const guid_t *channel_type; - int i; - struct visor_device *dev; - struct visor_driver *drv; - struct visorchannel *chan; - - dev = to_visor_device(xdev); - channel_type = visorchannel_get_guid(dev->visorchannel); - drv = to_visor_driver(xdrv); - chan = dev->visorchannel; - if (!drv->channel_types) - return 0; - for (i = 0; !guid_is_null(&drv->channel_types[i].guid); i++) - if (guid_equal(&drv->channel_types[i].guid, channel_type) && - visor_check_channel(visorchannel_get_header(chan), - xdev, - &drv->channel_types[i].guid, - (char *)drv->channel_types[i].name, - drv->channel_types[i].min_bytes, - drv->channel_types[i].version, - VISOR_CHANNEL_SIGNATURE)) - return i + 1; - return 0; -} - -/* - * This describes the TYPE of bus. - * (Don't confuse this with an INSTANCE of the bus.) - */ -static struct bus_type visorbus_type = { - .name = "visorbus", - .match = visorbus_match, - .uevent = visorbus_uevent, - .dev_groups = visorbus_dev_groups, -}; - -struct visor_busdev { - u32 bus_no; - u32 dev_no; -}; - -static int match_visorbus_dev_by_id(struct device *dev, const void *data) -{ - struct visor_device *vdev = to_visor_device(dev); - const struct visor_busdev *id = data; - - if (vdev->chipset_bus_no == id->bus_no && - vdev->chipset_dev_no == id->dev_no) - return 1; - return 0; -} - -struct visor_device *visorbus_get_device_by_id(u32 bus_no, u32 dev_no, - struct visor_device *from) -{ - struct device *dev; - struct device *dev_start = NULL; - struct visor_busdev id = { - .bus_no = bus_no, - .dev_no = dev_no - }; - - if (from) - dev_start = &from->device; - dev = bus_find_device(&visorbus_type, dev_start, (void *)&id, - match_visorbus_dev_by_id); - if (!dev) - return NULL; - return to_visor_device(dev); -} - -/* - * visorbus_release_busdevice() - called when device_unregister() is called for - * the bus device instance, after all other tasks - * involved with destroying the dev are complete - * @xdev: struct device for the bus being released - */ -static void visorbus_release_busdevice(struct device *xdev) -{ - struct visor_device *dev = dev_get_drvdata(xdev); - - debugfs_remove(dev->debugfs_bus_info); - debugfs_remove_recursive(dev->debugfs_dir); - visorchannel_destroy(dev->visorchannel); - kfree(dev); -} - -/* - * visorbus_release_device() - called when device_unregister() is called for - * each child device instance - * @xdev: struct device for the visor device being released - */ -static void visorbus_release_device(struct device *xdev) -{ - struct visor_device *dev = to_visor_device(xdev); - - visorchannel_destroy(dev->visorchannel); - kfree(dev); -} - -/* - * BUS specific channel attributes to appear under - * /sys/bus/visorbus<x>/dev<y>/channel - */ - -static ssize_t physaddr_show(struct device *dev, struct device_attribute *attr, - char *buf) -{ - struct visor_device *vdev = to_visor_device(dev); - - return sprintf(buf, "0x%llx\n", - visorchannel_get_physaddr(vdev->visorchannel)); -} -static DEVICE_ATTR_RO(physaddr); - -static ssize_t nbytes_show(struct device *dev, struct device_attribute *attr, - char *buf) -{ - struct visor_device *vdev = to_visor_device(dev); - - return sprintf(buf, "0x%lx\n", - visorchannel_get_nbytes(vdev->visorchannel)); -} -static DEVICE_ATTR_RO(nbytes); - -static ssize_t clientpartition_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct visor_device *vdev = to_visor_device(dev); - - return sprintf(buf, "0x%llx\n", - visorchannel_get_clientpartition(vdev->visorchannel)); -} -static DEVICE_ATTR_RO(clientpartition); - -static ssize_t typeguid_show(struct device *dev, struct device_attribute *attr, - char *buf) -{ - struct visor_device *vdev = to_visor_device(dev); - char typeid[LINESIZE]; - - return sprintf(buf, "%s\n", - visorchannel_id(vdev->visorchannel, typeid)); -} -static DEVICE_ATTR_RO(typeguid); - -static ssize_t zoneguid_show(struct device *dev, struct device_attribute *attr, - char *buf) -{ - struct visor_device *vdev = to_visor_device(dev); - char zoneid[LINESIZE]; - - return sprintf(buf, "%s\n", - visorchannel_zoneid(vdev->visorchannel, zoneid)); -} -static DEVICE_ATTR_RO(zoneguid); - -static ssize_t typename_show(struct device *dev, struct device_attribute *attr, - char *buf) -{ - int i = 0; - struct bus_type *xbus = dev->bus; - struct device_driver *xdrv = dev->driver; - struct visor_driver *drv = NULL; - - if (!xdrv) - return 0; - i = xbus->match(dev, xdrv); - if (!i) - return 0; - drv = to_visor_driver(xdrv); - return sprintf(buf, "%s\n", drv->channel_types[i - 1].name); -} -static DEVICE_ATTR_RO(typename); - -static struct attribute *channel_attrs[] = { - &dev_attr_physaddr.attr, - &dev_attr_nbytes.attr, - &dev_attr_clientpartition.attr, - &dev_attr_typeguid.attr, - &dev_attr_zoneguid.attr, - &dev_attr_typename.attr, - NULL -}; - -ATTRIBUTE_GROUPS(channel); - -/* - * BUS instance attributes - * - * define & implement display of bus attributes under - * /sys/bus/visorbus/devices/visorbus<n>. - */ -static ssize_t partition_handle_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct visor_device *vdev = to_visor_device(dev); - u64 handle = visorchannel_get_clientpartition(vdev->visorchannel); - - return sprintf(buf, "0x%llx\n", handle); -} -static DEVICE_ATTR_RO(partition_handle); - -static ssize_t partition_guid_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct visor_device *vdev = to_visor_device(dev); - - return sprintf(buf, "{%pUb}\n", &vdev->partition_guid); -} -static DEVICE_ATTR_RO(partition_guid); - -static ssize_t partition_name_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct visor_device *vdev = to_visor_device(dev); - - return sprintf(buf, "%s\n", vdev->name); -} -static DEVICE_ATTR_RO(partition_name); - -static ssize_t channel_addr_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct visor_device *vdev = to_visor_device(dev); - u64 addr = visorchannel_get_physaddr(vdev->visorchannel); - - return sprintf(buf, "0x%llx\n", addr); -} -static DEVICE_ATTR_RO(channel_addr); - -static ssize_t channel_bytes_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct visor_device *vdev = to_visor_device(dev); - u64 nbytes = visorchannel_get_nbytes(vdev->visorchannel); - - return sprintf(buf, "0x%llx\n", nbytes); -} -static DEVICE_ATTR_RO(channel_bytes); - -static ssize_t channel_id_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct visor_device *vdev = to_visor_device(dev); - int len = 0; - - visorchannel_id(vdev->visorchannel, buf); - len = strlen(buf); - buf[len++] = '\n'; - return len; -} -static DEVICE_ATTR_RO(channel_id); - -static struct attribute *visorbus_attrs[] = { - &dev_attr_partition_handle.attr, - &dev_attr_partition_guid.attr, - &dev_attr_partition_name.attr, - &dev_attr_channel_addr.attr, - &dev_attr_channel_bytes.attr, - &dev_attr_channel_id.attr, - NULL -}; - -ATTRIBUTE_GROUPS(visorbus); - -/* - * BUS debugfs entries - * - * define & implement display of debugfs attributes under - * /sys/kernel/debug/visorbus/visorbus<n>. - */ - -/* - * vbuschannel_print_devinfo() - format a struct visor_vbus_deviceinfo - * and write it to a seq_file - * @devinfo: the struct visor_vbus_deviceinfo to format - * @seq: seq_file to write to - * @devix: the device index to be included in the output data, or -1 if no - * device index is to be included - * - * Reads @devInfo, and writes it in human-readable notation to @seq. - */ -static void vbuschannel_print_devinfo(struct visor_vbus_deviceinfo *devinfo, - struct seq_file *seq, int devix) -{ - /* uninitialized vbus device entry */ - if (!isprint(devinfo->devtype[0])) - return; - if (devix >= 0) - seq_printf(seq, "[%d]", devix); - else - /* vbus device entry is for bus or chipset */ - seq_puts(seq, " "); - /* - * Note: because the s-Par back-end is free to scribble in this area, - * we never assume '\0'-termination. - */ - seq_printf(seq, "%-*.*s ", (int)sizeof(devinfo->devtype), - (int)sizeof(devinfo->devtype), devinfo->devtype); - seq_printf(seq, "%-*.*s ", (int)sizeof(devinfo->drvname), - (int)sizeof(devinfo->drvname), devinfo->drvname); - seq_printf(seq, "%.*s\n", (int)sizeof(devinfo->infostrs), - devinfo->infostrs); -} - -static int bus_info_debugfs_show(struct seq_file *seq, void *v) -{ - int i = 0; - unsigned long off; - struct visor_vbus_deviceinfo dev_info; - struct visor_device *vdev = seq->private; - struct visorchannel *channel = vdev->visorchannel; - - if (!channel) - return 0; - - seq_printf(seq, - "Client device/driver info for %s partition (vbus #%u):\n", - ((vdev->name) ? (char *)(vdev->name) : ""), - vdev->chipset_bus_no); - if (visorchannel_read(channel, - offsetof(struct visor_vbus_channel, chp_info), - &dev_info, sizeof(dev_info)) >= 0) - vbuschannel_print_devinfo(&dev_info, seq, -1); - if (visorchannel_read(channel, - offsetof(struct visor_vbus_channel, bus_info), - &dev_info, sizeof(dev_info)) >= 0) - vbuschannel_print_devinfo(&dev_info, seq, -1); - - off = offsetof(struct visor_vbus_channel, dev_info); - while (off + sizeof(dev_info) <= visorchannel_get_nbytes(channel)) { - if (visorchannel_read(channel, off, &dev_info, - sizeof(dev_info)) >= 0) - vbuschannel_print_devinfo(&dev_info, seq, i); - off += sizeof(dev_info); - i++; - } - return 0; -} - -static int bus_info_debugfs_open(struct inode *inode, struct file *file) -{ - return single_open(file, bus_info_debugfs_show, inode->i_private); -} - -static const struct file_operations bus_info_debugfs_fops = { - .owner = THIS_MODULE, - .open = bus_info_debugfs_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static void dev_periodic_work(struct timer_list *t) -{ - struct visor_device *dev = from_timer(dev, t, timer); - struct visor_driver *drv = to_visor_driver(dev->device.driver); - - drv->channel_interrupt(dev); - mod_timer(&dev->timer, jiffies + POLLJIFFIES_NORMALCHANNEL); -} - -static int dev_start_periodic_work(struct visor_device *dev) -{ - if (dev->being_removed || dev->timer_active) - return -EINVAL; - - /* now up by at least 2 */ - get_device(&dev->device); - dev->timer.expires = jiffies + POLLJIFFIES_NORMALCHANNEL; - add_timer(&dev->timer); - dev->timer_active = true; - return 0; -} - -static void dev_stop_periodic_work(struct visor_device *dev) -{ - if (!dev->timer_active) - return; - - del_timer_sync(&dev->timer); - dev->timer_active = false; - put_device(&dev->device); -} - -/* - * visordriver_remove_device() - handle visor device going away - * @xdev: struct device for the visor device being removed - * - * This is called when device_unregister() is called for each child device - * instance, to notify the appropriate visorbus function driver that the device - * is going away, and to decrease the reference count of the device. - * - * Return: 0 iff successful - */ -static int visordriver_remove_device(struct device *xdev) -{ - struct visor_device *dev = to_visor_device(xdev); - struct visor_driver *drv = to_visor_driver(xdev->driver); - - mutex_lock(&dev->visordriver_callback_lock); - dev->being_removed = true; - drv->remove(dev); - mutex_unlock(&dev->visordriver_callback_lock); - dev_stop_periodic_work(dev); - put_device(&dev->device); - return 0; -} - -/* - * visorbus_unregister_visor_driver() - unregisters the provided driver - * @drv: the driver to unregister - * - * A visor function driver calls this function to unregister the driver, - * i.e., within its module_exit function. - */ -void visorbus_unregister_visor_driver(struct visor_driver *drv) -{ - driver_unregister(&drv->driver); -} -EXPORT_SYMBOL_GPL(visorbus_unregister_visor_driver); - -/* - * visorbus_read_channel() - reads from the designated channel into - * the provided buffer - * @dev: the device whose channel is read from - * @offset: the offset into the channel at which reading starts - * @dest: the destination buffer that is written into from the channel - * @nbytes: the number of bytes to read from the channel - * - * If receiving a message, use the visorchannel_signalremove() function instead. - * - * Return: integer indicating success (zero) or failure (non-zero) - */ -int visorbus_read_channel(struct visor_device *dev, unsigned long offset, - void *dest, unsigned long nbytes) -{ - return visorchannel_read(dev->visorchannel, offset, dest, nbytes); -} -EXPORT_SYMBOL_GPL(visorbus_read_channel); - -/* - * visorbus_write_channel() - writes the provided buffer into the designated - * channel - * @dev: the device whose channel is written to - * @offset: the offset into the channel at which writing starts - * @src: the source buffer that is written into the channel - * @nbytes: the number of bytes to write into the channel - * - * If sending a message, use the visorchannel_signalinsert() function instead. - * - * Return: integer indicating success (zero) or failure (non-zero) - */ -int visorbus_write_channel(struct visor_device *dev, unsigned long offset, - void *src, unsigned long nbytes) -{ - return visorchannel_write(dev->visorchannel, offset, src, nbytes); -} -EXPORT_SYMBOL_GPL(visorbus_write_channel); - -/* - * visorbus_enable_channel_interrupts() - enables interrupts on the - * designated device - * @dev: the device on which to enable interrupts - * - * Currently we don't yet have a real interrupt, so for now we just call the - * interrupt function periodically via a timer. - */ -int visorbus_enable_channel_interrupts(struct visor_device *dev) -{ - struct visor_driver *drv = to_visor_driver(dev->device.driver); - - if (!drv->channel_interrupt) { - dev_err(&dev->device, "%s no interrupt function!\n", __func__); - return -ENOENT; - } - - return dev_start_periodic_work(dev); -} -EXPORT_SYMBOL_GPL(visorbus_enable_channel_interrupts); - -/* - * visorbus_disable_channel_interrupts() - disables interrupts on the - * designated device - * @dev: the device on which to disable interrupts - */ -void visorbus_disable_channel_interrupts(struct visor_device *dev) -{ - dev_stop_periodic_work(dev); -} -EXPORT_SYMBOL_GPL(visorbus_disable_channel_interrupts); - -/* - * create_visor_device() - create visor device as a result of receiving the - * controlvm device_create message for a new device - * @dev: a freshly-zeroed struct visor_device, containing only filled-in values - * for chipset_bus_no and chipset_dev_no, that will be initialized - * - * This is how everything starts from the device end. - * This function is called when a channel first appears via a ControlVM - * message. In response, this function allocates a visor_device to correspond - * to the new channel, and attempts to connect it the appropriate * driver. If - * the appropriate driver is found, the visor_driver.probe() function for that - * driver will be called, and will be passed the new * visor_device that we - * just created. - * - * It's ok if the appropriate driver is not yet loaded, because in that case - * the new device struct will just stick around in the bus' list of devices. - * When the appropriate driver calls visorbus_register_visor_driver(), the - * visor_driver.probe() for the new driver will be called with the new device. - * - * Return: 0 if successful, otherwise the negative value returned by - * device_add() indicating the reason for failure - */ -int create_visor_device(struct visor_device *dev) -{ - int err; - u32 chipset_bus_no = dev->chipset_bus_no; - u32 chipset_dev_no = dev->chipset_dev_no; - - mutex_init(&dev->visordriver_callback_lock); - dev->device.bus = &visorbus_type; - dev->device.groups = channel_groups; - device_initialize(&dev->device); - dev->device.release = visorbus_release_device; - /* keep a reference just for us (now 2) */ - get_device(&dev->device); - timer_setup(&dev->timer, dev_periodic_work, 0); - /* - * bus_id must be a unique name with respect to this bus TYPE (NOT bus - * instance). That's why we need to include the bus number within the - * name. - */ - err = dev_set_name(&dev->device, "vbus%u:dev%u", - chipset_bus_no, chipset_dev_no); - if (err) - goto err_put; - /* - * device_add does this: - * bus_add_device(dev) - * ->device_attach(dev) - * ->for each driver drv registered on the bus that dev is on - * if (dev.drv) ** device already has a driver ** - * ** not sure we could ever get here... ** - * else - * if (bus.match(dev,drv)) [visorbus_match] - * dev.drv = drv - * if (!drv.probe(dev)) [visordriver_probe_device] - * dev.drv = NULL - * - * Note that device_add does NOT fail if no driver failed to claim the - * device. The device will be linked onto bus_type.klist_devices - * regardless (use bus_for_each_dev). - */ - err = device_add(&dev->device); - if (err < 0) - goto err_put; - list_add_tail(&dev->list_all, &list_all_device_instances); - dev->state.created = 1; - visorbus_response(dev, err, CONTROLVM_DEVICE_CREATE); - /* success: reference kept via unmatched get_device() */ - return 0; - -err_put: - put_device(&dev->device); - dev_err(&dev->device, "Creating visor device failed. %d\n", err); - return err; -} - -void remove_visor_device(struct visor_device *dev) -{ - list_del(&dev->list_all); - put_device(&dev->device); - if (dev->pending_msg_hdr) - visorbus_response(dev, 0, CONTROLVM_DEVICE_DESTROY); - device_unregister(&dev->device); -} - -static int get_vbus_header_info(struct visorchannel *chan, - struct device *dev, - struct visor_vbus_headerinfo *hdr_info) -{ - int err; - - if (!visor_check_channel(visorchannel_get_header(chan), - dev, - &visor_vbus_channel_guid, - "vbus", - sizeof(struct visor_vbus_channel), - VISOR_VBUS_CHANNEL_VERSIONID, - VISOR_CHANNEL_SIGNATURE)) - return -EINVAL; - - err = visorchannel_read(chan, sizeof(struct channel_header), hdr_info, - sizeof(*hdr_info)); - if (err < 0) - return err; - if (hdr_info->struct_bytes < sizeof(struct visor_vbus_headerinfo)) - return -EINVAL; - if (hdr_info->device_info_struct_bytes < - sizeof(struct visor_vbus_deviceinfo)) - return -EINVAL; - return 0; -} - -/* - * write_vbus_chp_info() - write the contents of <info> to the struct - * visor_vbus_channel.chp_info - * @chan: indentifies the s-Par channel that will be updated - * @hdr_info: used to find appropriate channel offset to write data - * @info: contains the information to write - * - * Writes chipset info into the channel memory to be used for diagnostic - * purposes. - * - * Returns no value since this is debug information and not needed for - * device functionality. - */ -static void write_vbus_chp_info(struct visorchannel *chan, - struct visor_vbus_headerinfo *hdr_info, - struct visor_vbus_deviceinfo *info) -{ - int off; - - if (hdr_info->chp_info_offset == 0) - return; - - off = sizeof(struct channel_header) + hdr_info->chp_info_offset; - visorchannel_write(chan, off, info, sizeof(*info)); -} - -/* - * write_vbus_bus_info() - write the contents of <info> to the struct - * visor_vbus_channel.bus_info - * @chan: indentifies the s-Par channel that will be updated - * @hdr_info: used to find appropriate channel offset to write data - * @info: contains the information to write - * - * Writes bus info into the channel memory to be used for diagnostic - * purposes. - * - * Returns no value since this is debug information and not needed for - * device functionality. - */ -static void write_vbus_bus_info(struct visorchannel *chan, - struct visor_vbus_headerinfo *hdr_info, - struct visor_vbus_deviceinfo *info) -{ - int off; - - if (hdr_info->bus_info_offset == 0) - return; - - off = sizeof(struct channel_header) + hdr_info->bus_info_offset; - visorchannel_write(chan, off, info, sizeof(*info)); -} - -/* - * write_vbus_dev_info() - write the contents of <info> to the struct - * visor_vbus_channel.dev_info[<devix>] - * @chan: indentifies the s-Par channel that will be updated - * @hdr_info: used to find appropriate channel offset to write data - * @info: contains the information to write - * @devix: the relative device number (0..n-1) of the device on the bus - * - * Writes device info into the channel memory to be used for diagnostic - * purposes. - * - * Returns no value since this is debug information and not needed for - * device functionality. - */ -static void write_vbus_dev_info(struct visorchannel *chan, - struct visor_vbus_headerinfo *hdr_info, - struct visor_vbus_deviceinfo *info, - unsigned int devix) -{ - int off; - - if (hdr_info->dev_info_offset == 0) - return; - off = (sizeof(struct channel_header) + hdr_info->dev_info_offset) + - (hdr_info->device_info_struct_bytes * devix); - visorchannel_write(chan, off, info, sizeof(*info)); -} - -static void bus_device_info_init( - struct visor_vbus_deviceinfo *bus_device_info_ptr, - const char *dev_type, const char *drv_name) -{ - memset(bus_device_info_ptr, 0, sizeof(struct visor_vbus_deviceinfo)); - snprintf(bus_device_info_ptr->devtype, - sizeof(bus_device_info_ptr->devtype), - "%s", (dev_type) ? dev_type : "unknownType"); - snprintf(bus_device_info_ptr->drvname, - sizeof(bus_device_info_ptr->drvname), - "%s", (drv_name) ? drv_name : "unknownDriver"); - snprintf(bus_device_info_ptr->infostrs, - sizeof(bus_device_info_ptr->infostrs), "kernel ver. %s", - utsname()->release); -} - -/* - * publish_vbus_dev_info() - for a child device just created on a client bus, - * fill in information about the driver that is - * controlling this device into the appropriate slot - * within the vbus channel of the bus instance - * @visordev: struct visor_device for the desired device - */ -static void publish_vbus_dev_info(struct visor_device *visordev) -{ - int i; - struct visor_device *bdev; - struct visor_driver *visordrv; - u32 bus_no = visordev->chipset_bus_no; - u32 dev_no = visordev->chipset_dev_no; - struct visor_vbus_deviceinfo dev_info; - const char *chan_type_name = NULL; - struct visor_vbus_headerinfo *hdr_info; - - if (!visordev->device.driver) - return; - bdev = visorbus_get_device_by_id(bus_no, BUS_ROOT_DEVICE, NULL); - if (!bdev) - return; - hdr_info = (struct visor_vbus_headerinfo *)bdev->vbus_hdr_info; - if (!hdr_info) - return; - visordrv = to_visor_driver(visordev->device.driver); - - /* - * Within the list of device types (by GUID) that the driver - * says it supports, find out which one of those types matches - * the type of this device, so that we can include the device - * type name - */ - for (i = 0; visordrv->channel_types[i].name; i++) { - if (guid_equal(&visordrv->channel_types[i].guid, - &visordev->channel_type_guid)) { - chan_type_name = visordrv->channel_types[i].name; - break; - } - } - bus_device_info_init(&dev_info, chan_type_name, visordrv->name); - write_vbus_dev_info(bdev->visorchannel, hdr_info, &dev_info, dev_no); - write_vbus_chp_info(bdev->visorchannel, hdr_info, &chipset_driverinfo); - write_vbus_bus_info(bdev->visorchannel, hdr_info, - &clientbus_driverinfo); -} - -/* - * visordriver_probe_device() - handle new visor device coming online - * @xdev: struct device for the visor device being probed - * - * This is called automatically upon adding a visor_device (device_add), or - * adding a visor_driver (visorbus_register_visor_driver), but only after - * visorbus_match() has returned 1 to indicate a successful match between - * driver and device. - * - * If successful, a reference to the device will be held onto via get_device(). - * - * Return: 0 if successful, meaning the function driver's probe() function - * was successful with this device, otherwise a negative errno - * value indicating failure reason - */ -static int visordriver_probe_device(struct device *xdev) -{ - int err; - struct visor_driver *drv = to_visor_driver(xdev->driver); - struct visor_device *dev = to_visor_device(xdev); - - mutex_lock(&dev->visordriver_callback_lock); - dev->being_removed = false; - err = drv->probe(dev); - if (err) { - mutex_unlock(&dev->visordriver_callback_lock); - return err; - } - /* success: reference kept via unmatched get_device() */ - get_device(&dev->device); - publish_vbus_dev_info(dev); - mutex_unlock(&dev->visordriver_callback_lock); - return 0; -} - -/* - * visorbus_register_visor_driver() - registers the provided visor driver for - * handling one or more visor device - * types (channel_types) - * @drv: the driver to register - * - * A visor function driver calls this function to register the driver. The - * caller MUST fill in the following fields within the #drv structure: - * name, version, owner, channel_types, probe, remove - * - * Here's how the whole Linux bus / driver / device model works. - * - * At system start-up, the visorbus kernel module is loaded, which registers - * visorbus_type as a bus type, using bus_register(). - * - * All kernel modules that support particular device types on a - * visorbus bus are loaded. Each of these kernel modules calls - * visorbus_register_visor_driver() in their init functions, passing a - * visor_driver struct. visorbus_register_visor_driver() in turn calls - * register_driver(&visor_driver.driver). This .driver member is - * initialized with generic methods (like probe), whose sole responsibility - * is to act as a broker for the real methods, which are within the - * visor_driver struct. (This is the way the subclass behavior is - * implemented, since visor_driver is essentially a subclass of the - * generic driver.) Whenever a driver_register() happens, core bus code in - * the kernel does (see device_attach() in drivers/base/dd.c): - * - * for each dev associated with the bus (the bus that driver is on) that - * does not yet have a driver - * if bus.match(dev,newdriver) == yes_matched ** .match specified - * ** during bus_register(). - * newdriver.probe(dev) ** for visor drivers, this will call - * ** the generic driver.probe implemented in visorbus.c, - * ** which in turn calls the probe specified within the - * ** struct visor_driver (which was specified by the - * ** actual device driver as part of - * ** visorbus_register_visor_driver()). - * - * The above dance also happens when a new device appears. - * So the question is, how are devices created within the system? - * Basically, just call device_add(dev). See pci_bus_add_devices(). - * pci_scan_device() shows an example of how to build a device struct. It - * returns the newly-created struct to pci_scan_single_device(), who adds it - * to the list of devices at PCIBUS.devices. That list of devices is what - * is traversed by pci_bus_add_devices(). - * - * Return: integer indicating success (zero) or failure (non-zero) - */ -int visorbus_register_visor_driver(struct visor_driver *drv) -{ - /* can't register on a nonexistent bus */ - if (!initialized) - return -ENODEV; - if (!drv->probe) - return -EINVAL; - if (!drv->remove) - return -EINVAL; - if (!drv->pause) - return -EINVAL; - if (!drv->resume) - return -EINVAL; - - drv->driver.name = drv->name; - drv->driver.bus = &visorbus_type; - drv->driver.probe = visordriver_probe_device; - drv->driver.remove = visordriver_remove_device; - drv->driver.owner = drv->owner; - /* - * driver_register does this: - * bus_add_driver(drv) - * ->if (drv.bus) ** (bus_type) ** - * driver_attach(drv) - * for each dev with bus type of drv.bus - * if (!dev.drv) ** no driver assigned yet ** - * if (bus.match(dev,drv)) [visorbus_match] - * dev.drv = drv - * if (!drv.probe(dev)) [visordriver_probe_device] - * dev.drv = NULL - */ - return driver_register(&drv->driver); -} -EXPORT_SYMBOL_GPL(visorbus_register_visor_driver); - -/* - * visorbus_create_instance() - create a device instance for the visorbus itself - * @dev: struct visor_device indicating the bus instance - * - * Return: 0 for success, otherwise negative errno value indicating reason for - * failure - */ -int visorbus_create_instance(struct visor_device *dev) -{ - int id = dev->chipset_bus_no; - int err; - struct visor_vbus_headerinfo *hdr_info; - - hdr_info = kzalloc(sizeof(*hdr_info), GFP_KERNEL); - if (!hdr_info) - return -ENOMEM; - dev_set_name(&dev->device, "visorbus%d", id); - dev->device.bus = &visorbus_type; - dev->device.groups = visorbus_groups; - dev->device.release = visorbus_release_busdevice; - dev->debugfs_dir = debugfs_create_dir(dev_name(&dev->device), - visorbus_debugfs_dir); - dev->debugfs_bus_info = debugfs_create_file("client_bus_info", 0440, - dev->debugfs_dir, dev, - &bus_info_debugfs_fops); - dev_set_drvdata(&dev->device, dev); - err = get_vbus_header_info(dev->visorchannel, &dev->device, hdr_info); - if (err < 0) - goto err_debugfs_dir; - err = device_register(&dev->device); - if (err < 0) - goto err_debugfs_dir; - list_add_tail(&dev->list_all, &list_all_bus_instances); - dev->state.created = 1; - dev->vbus_hdr_info = (void *)hdr_info; - write_vbus_chp_info(dev->visorchannel, hdr_info, &chipset_driverinfo); - write_vbus_bus_info(dev->visorchannel, hdr_info, &clientbus_driverinfo); - visorbus_response(dev, err, CONTROLVM_BUS_CREATE); - return 0; - -err_debugfs_dir: - debugfs_remove_recursive(dev->debugfs_dir); - kfree(hdr_info); - dev_err(&dev->device, "%s failed: %d\n", __func__, err); - return err; -} - -/* - * visorbus_remove_instance() - remove a device instance for the visorbus itself - * @dev: struct visor_device indentifying the bus to remove - */ -void visorbus_remove_instance(struct visor_device *dev) -{ - /* - * Note that this will result in the release method for - * dev->dev being called, which will call - * visorbus_release_busdevice(). This has something to do with - * the put_device() done in device_unregister(), but I have never - * successfully been able to trace thru the code to see where/how - * release() gets called. But I know it does. - */ - kfree(dev->vbus_hdr_info); - list_del(&dev->list_all); - if (dev->pending_msg_hdr) - visorbus_response(dev, 0, CONTROLVM_BUS_DESTROY); - device_unregister(&dev->device); -} - -/* - * remove_all_visor_devices() - remove all child visorbus device instances - */ -static void remove_all_visor_devices(void) -{ - struct list_head *listentry, *listtmp; - - list_for_each_safe(listentry, listtmp, &list_all_device_instances) { - struct visor_device *dev; - - dev = list_entry(listentry, struct visor_device, list_all); - remove_visor_device(dev); - } -} - -/* - * pause_state_change_complete() - the callback function to be called by a - * visorbus function driver when a - * pending "pause device" operation has - * completed - * @dev: struct visor_device identifying the paused device - * @status: 0 iff the pause state change completed successfully, otherwise - * a negative errno value indicating the reason for failure - */ -static void pause_state_change_complete(struct visor_device *dev, int status) -{ - if (!dev->pausing) - return; - - dev->pausing = false; - visorbus_device_changestate_response(dev, status, - segment_state_standby); -} - -/* - * resume_state_change_complete() - the callback function to be called by a - * visorbus function driver when a - * pending "resume device" operation has - * completed - * @dev: struct visor_device identifying the resumed device - * @status: 0 iff the resume state change completed successfully, otherwise - * a negative errno value indicating the reason for failure - */ -static void resume_state_change_complete(struct visor_device *dev, int status) -{ - if (!dev->resuming) - return; - - dev->resuming = false; - /* - * Notify the chipset driver that the resume is complete, - * which will presumably want to send some sort of response to - * the initiator. - */ - visorbus_device_changestate_response(dev, status, - segment_state_running); -} - -/* - * visorchipset_initiate_device_pause_resume() - start a pause or resume - * operation for a visor device - * @dev: struct visor_device identifying the device being paused or resumed - * @is_pause: true to indicate pause operation, false to indicate resume - * - * Tell the subordinate function driver for a specific device to pause - * or resume that device. Success/failure result is returned asynchronously - * via a callback function; see pause_state_change_complete() and - * resume_state_change_complete(). - */ -static int visorchipset_initiate_device_pause_resume(struct visor_device *dev, - bool is_pause) -{ - int err; - struct visor_driver *drv; - - /* If no driver associated with the device nothing to pause/resume */ - if (!dev->device.driver) - return 0; - if (dev->pausing || dev->resuming) - return -EBUSY; - - drv = to_visor_driver(dev->device.driver); - if (is_pause) { - dev->pausing = true; - err = drv->pause(dev, pause_state_change_complete); - } else { - /* - * The vbus_dev_info structure in the channel was been cleared, - * make sure it is valid. - */ - publish_vbus_dev_info(dev); - dev->resuming = true; - err = drv->resume(dev, resume_state_change_complete); - } - return err; -} - -/* - * visorchipset_device_pause() - start a pause operation for a visor device - * @dev_info: struct visor_device identifying the device being paused - * - * Tell the subordinate function driver for a specific device to pause - * that device. Success/failure result is returned asynchronously - * via a callback function; see pause_state_change_complete(). - */ -int visorchipset_device_pause(struct visor_device *dev_info) -{ - int err; - - err = visorchipset_initiate_device_pause_resume(dev_info, true); - if (err < 0) { - dev_info->pausing = false; - return err; - } - return 0; -} - -/* - * visorchipset_device_resume() - start a resume operation for a visor device - * @dev_info: struct visor_device identifying the device being resumed - * - * Tell the subordinate function driver for a specific device to resume - * that device. Success/failure result is returned asynchronously - * via a callback function; see resume_state_change_complete(). - */ -int visorchipset_device_resume(struct visor_device *dev_info) -{ - int err; - - err = visorchipset_initiate_device_pause_resume(dev_info, false); - if (err < 0) { - dev_info->resuming = false; - return err; - } - return 0; -} - -int visorbus_init(void) -{ - int err; - - visorbus_debugfs_dir = debugfs_create_dir("visorbus", NULL); - bus_device_info_init(&clientbus_driverinfo, "clientbus", "visorbus"); - err = bus_register(&visorbus_type); - if (err < 0) - return err; - initialized = true; - bus_device_info_init(&chipset_driverinfo, "chipset", "visorchipset"); - return 0; -} - -void visorbus_exit(void) -{ - struct list_head *listentry, *listtmp; - - remove_all_visor_devices(); - list_for_each_safe(listentry, listtmp, &list_all_bus_instances) { - struct visor_device *dev; - - dev = list_entry(listentry, struct visor_device, list_all); - visorbus_remove_instance(dev); - } - bus_unregister(&visorbus_type); - initialized = false; - debugfs_remove_recursive(visorbus_debugfs_dir); -} diff --git a/drivers/visorbus/visorbus_private.h b/drivers/visorbus/visorbus_private.h deleted file mode 100644 index 6956de605827..000000000000 --- a/drivers/visorbus/visorbus_private.h +++ /dev/null @@ -1,48 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Copyright (C) 2010 - 2015 UNISYS CORPORATION - * All rights reserved. - */ - -#ifndef __VISORBUS_PRIVATE_H__ -#define __VISORBUS_PRIVATE_H__ - -#include <linux/uuid.h> -#include <linux/utsname.h> -#include <linux/visorbus.h> - -#include "controlvmchannel.h" -#include "vbuschannel.h" - -struct visor_device *visorbus_get_device_by_id(u32 bus_no, u32 dev_no, - struct visor_device *from); -int visorbus_create_instance(struct visor_device *dev); -void visorbus_remove_instance(struct visor_device *bus_info); -int create_visor_device(struct visor_device *dev_info); -void remove_visor_device(struct visor_device *dev_info); -int visorchipset_device_pause(struct visor_device *dev_info); -int visorchipset_device_resume(struct visor_device *dev_info); -void visorbus_response(struct visor_device *p, int response, int controlvm_id); -void visorbus_device_changestate_response(struct visor_device *p, int response, - struct visor_segment_state state); -int visorbus_init(void); -void visorbus_exit(void); - -/* visorchannel access functions */ -struct visorchannel *visorchannel_create(u64 physaddr, gfp_t gfp, - const guid_t *guid, bool needs_lock); -void visorchannel_destroy(struct visorchannel *channel); -int visorchannel_read(struct visorchannel *channel, ulong offset, - void *dest, ulong nbytes); -int visorchannel_write(struct visorchannel *channel, ulong offset, - void *dest, ulong nbytes); -u64 visorchannel_get_physaddr(struct visorchannel *channel); -ulong visorchannel_get_nbytes(struct visorchannel *channel); -char *visorchannel_id(struct visorchannel *channel, char *s); -char *visorchannel_zoneid(struct visorchannel *channel, char *s); -u64 visorchannel_get_clientpartition(struct visorchannel *channel); -int visorchannel_set_clientpartition(struct visorchannel *channel, - u64 partition_handle); -char *visorchannel_guid_id(const guid_t *guid, char *s); -void *visorchannel_get_header(struct visorchannel *channel); -#endif diff --git a/drivers/visorbus/visorchannel.c b/drivers/visorbus/visorchannel.c deleted file mode 100644 index bd890e0f456b..000000000000 --- a/drivers/visorbus/visorchannel.c +++ /dev/null @@ -1,434 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Copyright (C) 2010 - 2015 UNISYS CORPORATION - * All rights reserved. - */ - -/* - * This provides s-Par channel communication primitives, which are - * independent of the mechanism used to access the channel data. - */ - -#include <linux/uuid.h> -#include <linux/io.h> -#include <linux/slab.h> -#include <linux/visorbus.h> - -#include "visorbus_private.h" -#include "controlvmchannel.h" - -#define VISOR_DRV_NAME "visorchannel" - -#define VISOR_CONSOLEVIDEO_CHANNEL_GUID \ - GUID_INIT(0x3cd6e705, 0xd6a2, 0x4aa5, \ - 0xad, 0x5c, 0x7b, 0x8, 0x88, 0x9d, 0xff, 0xe2) - -static const guid_t visor_video_guid = VISOR_CONSOLEVIDEO_CHANNEL_GUID; - -struct visorchannel { - u64 physaddr; - ulong nbytes; - void *mapped; - bool requested; - struct channel_header chan_hdr; - guid_t guid; - /* - * channel creator knows if more than one thread will be inserting or - * removing - */ - bool needs_lock; - /* protect head writes in chan_hdr */ - spinlock_t insert_lock; - /* protect tail writes in chan_hdr */ - spinlock_t remove_lock; - guid_t type; - guid_t inst; -}; - -void visorchannel_destroy(struct visorchannel *channel) -{ - if (!channel) - return; - - if (channel->mapped) { - memunmap(channel->mapped); - if (channel->requested) - release_mem_region(channel->physaddr, channel->nbytes); - } - kfree(channel); -} - -u64 visorchannel_get_physaddr(struct visorchannel *channel) -{ - return channel->physaddr; -} - -ulong visorchannel_get_nbytes(struct visorchannel *channel) -{ - return channel->nbytes; -} - -char *visorchannel_guid_id(const guid_t *guid, char *s) -{ - sprintf(s, "%pUL", guid); - return s; -} - -char *visorchannel_id(struct visorchannel *channel, char *s) -{ - return visorchannel_guid_id(&channel->guid, s); -} - -char *visorchannel_zoneid(struct visorchannel *channel, char *s) -{ - return visorchannel_guid_id(&channel->chan_hdr.zone_guid, s); -} - -u64 visorchannel_get_clientpartition(struct visorchannel *channel) -{ - return channel->chan_hdr.partition_handle; -} - -int visorchannel_set_clientpartition(struct visorchannel *channel, - u64 partition_handle) -{ - channel->chan_hdr.partition_handle = partition_handle; - return 0; -} - -/** - * visorchannel_get_guid() - queries the GUID of the designated channel - * @channel: the channel to query - * - * Return: the GUID of the provided channel - */ -const guid_t *visorchannel_get_guid(struct visorchannel *channel) -{ - return &channel->guid; -} -EXPORT_SYMBOL_GPL(visorchannel_get_guid); - -int visorchannel_read(struct visorchannel *channel, ulong offset, void *dest, - ulong nbytes) -{ - if (offset + nbytes > channel->nbytes) - return -EIO; - - memcpy(dest, channel->mapped + offset, nbytes); - return 0; -} - -int visorchannel_write(struct visorchannel *channel, ulong offset, void *dest, - ulong nbytes) -{ - size_t chdr_size = sizeof(struct channel_header); - size_t copy_size; - - if (offset + nbytes > channel->nbytes) - return -EIO; - - if (offset < chdr_size) { - copy_size = min(chdr_size - offset, nbytes); - memcpy(((char *)(&channel->chan_hdr)) + offset, - dest, copy_size); - } - memcpy(channel->mapped + offset, dest, nbytes); - return 0; -} - -void *visorchannel_get_header(struct visorchannel *channel) -{ - return &channel->chan_hdr; -} - -/* - * Return offset of a specific SIGNAL_QUEUE_HEADER from the beginning of a - * channel header - */ -static int sig_queue_offset(struct channel_header *chan_hdr, int q) -{ - return ((chan_hdr)->ch_space_offset + - ((q) * sizeof(struct signal_queue_header))); -} - -/* - * Return offset of a specific queue entry (data) from the beginning of a - * channel header - */ -static int sig_data_offset(struct channel_header *chan_hdr, int q, - struct signal_queue_header *sig_hdr, int slot) -{ - return (sig_queue_offset(chan_hdr, q) + sig_hdr->sig_base_offset + - (slot * sig_hdr->signal_size)); -} - -/* - * Write the contents of a specific field within a SIGNAL_QUEUE_HEADER back into - * host memory - */ -#define SIG_WRITE_FIELD(channel, queue, sig_hdr, FIELD) \ - visorchannel_write(channel, \ - sig_queue_offset(&channel->chan_hdr, queue) + \ - offsetof(struct signal_queue_header, FIELD), \ - &((sig_hdr)->FIELD), \ - sizeof((sig_hdr)->FIELD)) - -static int sig_read_header(struct visorchannel *channel, u32 queue, - struct signal_queue_header *sig_hdr) -{ - if (channel->chan_hdr.ch_space_offset < sizeof(struct channel_header)) - return -EINVAL; - - /* Read the appropriate SIGNAL_QUEUE_HEADER into local memory. */ - return visorchannel_read(channel, - sig_queue_offset(&channel->chan_hdr, queue), - sig_hdr, sizeof(struct signal_queue_header)); -} - -static int sig_read_data(struct visorchannel *channel, u32 queue, - struct signal_queue_header *sig_hdr, u32 slot, - void *data) -{ - int signal_data_offset = sig_data_offset(&channel->chan_hdr, queue, - sig_hdr, slot); - - return visorchannel_read(channel, signal_data_offset, - data, sig_hdr->signal_size); -} - -static int sig_write_data(struct visorchannel *channel, u32 queue, - struct signal_queue_header *sig_hdr, u32 slot, - void *data) -{ - int signal_data_offset = sig_data_offset(&channel->chan_hdr, queue, - sig_hdr, slot); - - return visorchannel_write(channel, signal_data_offset, - data, sig_hdr->signal_size); -} - -static int signalremove_inner(struct visorchannel *channel, u32 queue, - void *msg) -{ - struct signal_queue_header sig_hdr; - int error; - - error = sig_read_header(channel, queue, &sig_hdr); - if (error) - return error; - /* No signals to remove; have caller try again. */ - if (sig_hdr.head == sig_hdr.tail) - return -EAGAIN; - sig_hdr.tail = (sig_hdr.tail + 1) % sig_hdr.max_slots; - error = sig_read_data(channel, queue, &sig_hdr, sig_hdr.tail, msg); - if (error) - return error; - sig_hdr.num_received++; - /* - * For each data field in SIGNAL_QUEUE_HEADER that was modified, update - * host memory. Required for channel sync. - */ - mb(); - error = SIG_WRITE_FIELD(channel, queue, &sig_hdr, tail); - if (error) - return error; - error = SIG_WRITE_FIELD(channel, queue, &sig_hdr, num_received); - if (error) - return error; - return 0; -} - -/** - * visorchannel_signalremove() - removes a message from the designated - * channel/queue - * @channel: the channel the message will be removed from - * @queue: the queue the message will be removed from - * @msg: the message to remove - * - * Return: integer error code indicating the status of the removal - */ -int visorchannel_signalremove(struct visorchannel *channel, u32 queue, - void *msg) -{ - int rc; - unsigned long flags; - - if (channel->needs_lock) { - spin_lock_irqsave(&channel->remove_lock, flags); - rc = signalremove_inner(channel, queue, msg); - spin_unlock_irqrestore(&channel->remove_lock, flags); - } else { - rc = signalremove_inner(channel, queue, msg); - } - - return rc; -} -EXPORT_SYMBOL_GPL(visorchannel_signalremove); - -static bool queue_empty(struct visorchannel *channel, u32 queue) -{ - struct signal_queue_header sig_hdr; - - if (sig_read_header(channel, queue, &sig_hdr)) - return true; - return (sig_hdr.head == sig_hdr.tail); -} - -/** - * visorchannel_signalempty() - checks if the designated channel/queue contains - * any messages - * @channel: the channel to query - * @queue: the queue in the channel to query - * - * Return: boolean indicating whether any messages in the designated - * channel/queue are present - */ -bool visorchannel_signalempty(struct visorchannel *channel, u32 queue) -{ - bool rc; - unsigned long flags; - - if (!channel->needs_lock) - return queue_empty(channel, queue); - spin_lock_irqsave(&channel->remove_lock, flags); - rc = queue_empty(channel, queue); - spin_unlock_irqrestore(&channel->remove_lock, flags); - return rc; -} -EXPORT_SYMBOL_GPL(visorchannel_signalempty); - -static int signalinsert_inner(struct visorchannel *channel, u32 queue, - void *msg) -{ - struct signal_queue_header sig_hdr; - int err; - - err = sig_read_header(channel, queue, &sig_hdr); - if (err) - return err; - sig_hdr.head = (sig_hdr.head + 1) % sig_hdr.max_slots; - if (sig_hdr.head == sig_hdr.tail) { - sig_hdr.num_overflows++; - err = SIG_WRITE_FIELD(channel, queue, &sig_hdr, num_overflows); - if (err) - return err; - return -EIO; - } - err = sig_write_data(channel, queue, &sig_hdr, sig_hdr.head, msg); - if (err) - return err; - sig_hdr.num_sent++; - /* - * For each data field in SIGNAL_QUEUE_HEADER that was modified, update - * host memory. Required for channel sync. - */ - mb(); - err = SIG_WRITE_FIELD(channel, queue, &sig_hdr, head); - if (err) - return err; - err = SIG_WRITE_FIELD(channel, queue, &sig_hdr, num_sent); - if (err) - return err; - return 0; -} - -/* - * visorchannel_create() - creates the struct visorchannel abstraction for a - * data area in memory, but does NOT modify this data - * area - * @physaddr: physical address of start of channel - * @gfp: gfp_t to use when allocating memory for the data struct - * @guid: GUID that identifies channel type; - * @needs_lock: must specify true if you have multiple threads of execution - * that will be calling visorchannel methods of this - * visorchannel at the same time - * - * Return: pointer to visorchannel that was created if successful, - * otherwise NULL - */ -struct visorchannel *visorchannel_create(u64 physaddr, gfp_t gfp, - const guid_t *guid, bool needs_lock) -{ - struct visorchannel *channel; - int err; - size_t size = sizeof(struct channel_header); - - if (physaddr == 0) - return NULL; - - channel = kzalloc(sizeof(*channel), gfp); - if (!channel) - return NULL; - channel->needs_lock = needs_lock; - spin_lock_init(&channel->insert_lock); - spin_lock_init(&channel->remove_lock); - /* - * Video driver constains the efi framebuffer so it will get a conflict - * resource when requesting its full mem region. Since we are only - * using the efi framebuffer for video we can ignore this. Remember that - * we haven't requested it so we don't try to release later on. - */ - channel->requested = request_mem_region(physaddr, size, VISOR_DRV_NAME); - if (!channel->requested && !guid_equal(guid, &visor_video_guid)) - /* we only care about errors if this is not the video channel */ - goto err_destroy_channel; - channel->mapped = memremap(physaddr, size, MEMREMAP_WB); - if (!channel->mapped) { - release_mem_region(physaddr, size); - goto err_destroy_channel; - } - channel->physaddr = physaddr; - channel->nbytes = size; - err = visorchannel_read(channel, 0, &channel->chan_hdr, size); - if (err) - goto err_destroy_channel; - size = (ulong)channel->chan_hdr.size; - memunmap(channel->mapped); - if (channel->requested) - release_mem_region(channel->physaddr, channel->nbytes); - channel->mapped = NULL; - channel->requested = request_mem_region(channel->physaddr, size, - VISOR_DRV_NAME); - if (!channel->requested && !guid_equal(guid, &visor_video_guid)) - /* we only care about errors if this is not the video channel */ - goto err_destroy_channel; - channel->mapped = memremap(channel->physaddr, size, MEMREMAP_WB); - if (!channel->mapped) { - release_mem_region(channel->physaddr, size); - goto err_destroy_channel; - } - channel->nbytes = size; - guid_copy(&channel->guid, guid); - return channel; - -err_destroy_channel: - visorchannel_destroy(channel); - return NULL; -} - -/** - * visorchannel_signalinsert() - inserts a message into the designated - * channel/queue - * @channel: the channel the message will be added to - * @queue: the queue the message will be added to - * @msg: the message to insert - * - * Return: integer error code indicating the status of the insertion - */ -int visorchannel_signalinsert(struct visorchannel *channel, u32 queue, - void *msg) -{ - int rc; - unsigned long flags; - - if (channel->needs_lock) { - spin_lock_irqsave(&channel->insert_lock, flags); - rc = signalinsert_inner(channel, queue, msg); - spin_unlock_irqrestore(&channel->insert_lock, flags); - } else { - rc = signalinsert_inner(channel, queue, msg); - } - - return rc; -} -EXPORT_SYMBOL_GPL(visorchannel_signalinsert); diff --git a/drivers/visorbus/visorchipset.c b/drivers/visorbus/visorchipset.c deleted file mode 100644 index 5668cad86e37..000000000000 --- a/drivers/visorbus/visorchipset.c +++ /dev/null @@ -1,1691 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Copyright (C) 2010 - 2015 UNISYS CORPORATION - * All rights reserved. - */ - -#include <linux/acpi.h> -#include <linux/crash_dump.h> -#include <linux/visorbus.h> - -#include "visorbus_private.h" - -/* {72120008-4AAB-11DC-8530-444553544200} */ -#define VISOR_SIOVM_GUID GUID_INIT(0x72120008, 0x4AAB, 0x11DC, 0x85, 0x30, \ - 0x44, 0x45, 0x53, 0x54, 0x42, 0x00) - -static const guid_t visor_vhba_channel_guid = VISOR_VHBA_CHANNEL_GUID; -static const guid_t visor_siovm_guid = VISOR_SIOVM_GUID; -static const guid_t visor_controlvm_channel_guid = VISOR_CONTROLVM_CHANNEL_GUID; - -#define POLLJIFFIES_CONTROLVM_FAST 1 -#define POLLJIFFIES_CONTROLVM_SLOW 100 - -#define MAX_CONTROLVM_PAYLOAD_BYTES (1024 * 128) - -#define UNISYS_VISOR_LEAF_ID 0x40000000 - -/* The s-Par leaf ID returns "UnisysSpar64" encoded across ebx, ecx, edx */ -#define UNISYS_VISOR_ID_EBX 0x73696e55 -#define UNISYS_VISOR_ID_ECX 0x70537379 -#define UNISYS_VISOR_ID_EDX 0x34367261 - -/* - * When the controlvm channel is idle for at least MIN_IDLE_SECONDS, we switch - * to slow polling mode. As soon as we get a controlvm message, we switch back - * to fast polling mode. - */ -#define MIN_IDLE_SECONDS 10 - -struct parser_context { - unsigned long allocbytes; - unsigned long param_bytes; - u8 *curr; - unsigned long bytes_remaining; - bool byte_stream; - struct visor_controlvm_parameters_header data; -}; - -/* VMCALL_CONTROLVM_ADDR: Used by all guests, not just IO. */ -#define VMCALL_CONTROLVM_ADDR 0x0501 - -enum vmcall_result { - VMCALL_RESULT_SUCCESS = 0, - VMCALL_RESULT_INVALID_PARAM = 1, - VMCALL_RESULT_DATA_UNAVAILABLE = 2, - VMCALL_RESULT_FAILURE_UNAVAILABLE = 3, - VMCALL_RESULT_DEVICE_ERROR = 4, - VMCALL_RESULT_DEVICE_NOT_READY = 5 -}; - -/* - * struct vmcall_io_controlvm_addr_params - Structure for IO VMCALLS. Has - * parameters to VMCALL_CONTROLVM_ADDR - * interface. - * @address: The Guest-relative physical address of the ControlVm channel. - * This VMCall fills this in with the appropriate address. - * Contents provided by this VMCALL (OUT). - * @channel_bytes: The size of the ControlVm channel in bytes This VMCall fills - * this in with the appropriate address. Contents provided by - * this VMCALL (OUT). - * @unused: Unused Bytes in the 64-Bit Aligned Struct. - */ -struct vmcall_io_controlvm_addr_params { - u64 address; - u32 channel_bytes; - u8 unused[4]; -} __packed; - -struct visorchipset_device { - struct acpi_device *acpi_device; - unsigned long poll_jiffies; - /* when we got our last controlvm message */ - unsigned long most_recent_message_jiffies; - struct delayed_work periodic_controlvm_work; - struct visorchannel *controlvm_channel; - unsigned long controlvm_payload_bytes_buffered; - /* - * The following variables are used to handle the scenario where we are - * unable to offload the payload from a controlvm message due to memory - * requirements. In this scenario, we simply stash the controlvm - * message, then attempt to process it again the next time - * controlvm_periodic_work() runs. - */ - struct controlvm_message controlvm_pending_msg; - bool controlvm_pending_msg_valid; - struct vmcall_io_controlvm_addr_params controlvm_params; -}; - -static struct visorchipset_device *chipset_dev; - -struct parahotplug_request { - struct list_head list; - int id; - unsigned long expiration; - struct controlvm_message msg; -}; - -/* prototypes for attributes */ -static ssize_t toolaction_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - u8 tool_action = 0; - int err; - - err = visorchannel_read(chipset_dev->controlvm_channel, - offsetof(struct visor_controlvm_channel, - tool_action), - &tool_action, sizeof(u8)); - if (err) - return err; - return sprintf(buf, "%u\n", tool_action); -} - -static ssize_t toolaction_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - u8 tool_action; - int err; - - if (kstrtou8(buf, 10, &tool_action)) - return -EINVAL; - err = visorchannel_write(chipset_dev->controlvm_channel, - offsetof(struct visor_controlvm_channel, - tool_action), - &tool_action, sizeof(u8)); - if (err) - return err; - return count; -} -static DEVICE_ATTR_RW(toolaction); - -static ssize_t boottotool_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct efi_visor_indication efi_visor_indication; - int err; - - err = visorchannel_read(chipset_dev->controlvm_channel, - offsetof(struct visor_controlvm_channel, - efi_visor_ind), - &efi_visor_indication, - sizeof(struct efi_visor_indication)); - if (err) - return err; - return sprintf(buf, "%u\n", efi_visor_indication.boot_to_tool); -} - -static ssize_t boottotool_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - int val, err; - struct efi_visor_indication efi_visor_indication; - - if (kstrtoint(buf, 10, &val)) - return -EINVAL; - efi_visor_indication.boot_to_tool = val; - err = visorchannel_write(chipset_dev->controlvm_channel, - offsetof(struct visor_controlvm_channel, - efi_visor_ind), - &(efi_visor_indication), - sizeof(struct efi_visor_indication)); - if (err) - return err; - return count; -} -static DEVICE_ATTR_RW(boottotool); - -static ssize_t error_show(struct device *dev, struct device_attribute *attr, - char *buf) -{ - u32 error = 0; - int err; - - err = visorchannel_read(chipset_dev->controlvm_channel, - offsetof(struct visor_controlvm_channel, - installation_error), - &error, sizeof(u32)); - if (err) - return err; - return sprintf(buf, "%u\n", error); -} - -static ssize_t error_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - u32 error; - int err; - - if (kstrtou32(buf, 10, &error)) - return -EINVAL; - err = visorchannel_write(chipset_dev->controlvm_channel, - offsetof(struct visor_controlvm_channel, - installation_error), - &error, sizeof(u32)); - if (err) - return err; - return count; -} -static DEVICE_ATTR_RW(error); - -static ssize_t textid_show(struct device *dev, struct device_attribute *attr, - char *buf) -{ - u32 text_id = 0; - int err; - - err = visorchannel_read(chipset_dev->controlvm_channel, - offsetof(struct visor_controlvm_channel, - installation_text_id), - &text_id, sizeof(u32)); - if (err) - return err; - return sprintf(buf, "%u\n", text_id); -} - -static ssize_t textid_store(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count) -{ - u32 text_id; - int err; - - if (kstrtou32(buf, 10, &text_id)) - return -EINVAL; - err = visorchannel_write(chipset_dev->controlvm_channel, - offsetof(struct visor_controlvm_channel, - installation_text_id), - &text_id, sizeof(u32)); - if (err) - return err; - return count; -} -static DEVICE_ATTR_RW(textid); - -static ssize_t remaining_steps_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - u16 remaining_steps = 0; - int err; - - err = visorchannel_read(chipset_dev->controlvm_channel, - offsetof(struct visor_controlvm_channel, - installation_remaining_steps), - &remaining_steps, sizeof(u16)); - if (err) - return err; - return sprintf(buf, "%hu\n", remaining_steps); -} - -static ssize_t remaining_steps_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - u16 remaining_steps; - int err; - - if (kstrtou16(buf, 10, &remaining_steps)) - return -EINVAL; - err = visorchannel_write(chipset_dev->controlvm_channel, - offsetof(struct visor_controlvm_channel, - installation_remaining_steps), - &remaining_steps, sizeof(u16)); - if (err) - return err; - return count; -} -static DEVICE_ATTR_RW(remaining_steps); - -static void controlvm_init_response(struct controlvm_message *msg, - struct controlvm_message_header *msg_hdr, - int response) -{ - memset(msg, 0, sizeof(struct controlvm_message)); - memcpy(&msg->hdr, msg_hdr, sizeof(struct controlvm_message_header)); - msg->hdr.payload_bytes = 0; - msg->hdr.payload_vm_offset = 0; - msg->hdr.payload_max_bytes = 0; - if (response < 0) { - msg->hdr.flags.failed = 1; - msg->hdr.completion_status = (u32)(-response); - } -} - -static int controlvm_respond_chipset_init( - struct controlvm_message_header *msg_hdr, - int response, - enum visor_chipset_feature features) -{ - struct controlvm_message outmsg; - - controlvm_init_response(&outmsg, msg_hdr, response); - outmsg.cmd.init_chipset.features = features; - return visorchannel_signalinsert(chipset_dev->controlvm_channel, - CONTROLVM_QUEUE_REQUEST, &outmsg); -} - -static int chipset_init(struct controlvm_message *inmsg) -{ - static int chipset_inited; - enum visor_chipset_feature features = 0; - int rc = CONTROLVM_RESP_SUCCESS; - int res = 0; - - if (chipset_inited) { - rc = -CONTROLVM_RESP_ALREADY_DONE; - res = -EIO; - goto out_respond; - } - chipset_inited = 1; - /* - * Set features to indicate we support parahotplug (if Command also - * supports it). Set the "reply" bit so Command knows this is a - * features-aware driver. - */ - features = inmsg->cmd.init_chipset.features & - VISOR_CHIPSET_FEATURE_PARA_HOTPLUG; - features |= VISOR_CHIPSET_FEATURE_REPLY; - -out_respond: - if (inmsg->hdr.flags.response_expected) - res = controlvm_respond_chipset_init(&inmsg->hdr, rc, features); - - return res; -} - -static int controlvm_respond(struct controlvm_message_header *msg_hdr, - int response, struct visor_segment_state *state) -{ - struct controlvm_message outmsg; - - controlvm_init_response(&outmsg, msg_hdr, response); - if (outmsg.hdr.flags.test_message == 1) - return -EINVAL; - if (state) { - outmsg.cmd.device_change_state.state = *state; - outmsg.cmd.device_change_state.flags.phys_device = 1; - } - return visorchannel_signalinsert(chipset_dev->controlvm_channel, - CONTROLVM_QUEUE_REQUEST, &outmsg); -} - -enum crash_obj_type { - CRASH_DEV, - CRASH_BUS, -}; - -static int save_crash_message(struct controlvm_message *msg, - enum crash_obj_type cr_type) -{ - u32 local_crash_msg_offset; - u16 local_crash_msg_count; - int err; - - err = visorchannel_read(chipset_dev->controlvm_channel, - offsetof(struct visor_controlvm_channel, - saved_crash_message_count), - &local_crash_msg_count, sizeof(u16)); - if (err) { - dev_err(&chipset_dev->acpi_device->dev, - "failed to read message count\n"); - return err; - } - if (local_crash_msg_count != CONTROLVM_CRASHMSG_MAX) { - dev_err(&chipset_dev->acpi_device->dev, - "invalid number of messages\n"); - return -EIO; - } - err = visorchannel_read(chipset_dev->controlvm_channel, - offsetof(struct visor_controlvm_channel, - saved_crash_message_offset), - &local_crash_msg_offset, sizeof(u32)); - if (err) { - dev_err(&chipset_dev->acpi_device->dev, - "failed to read offset\n"); - return err; - } - switch (cr_type) { - case CRASH_DEV: - local_crash_msg_offset += sizeof(struct controlvm_message); - err = visorchannel_write(chipset_dev->controlvm_channel, - local_crash_msg_offset, msg, - sizeof(struct controlvm_message)); - if (err) { - dev_err(&chipset_dev->acpi_device->dev, - "failed to write dev msg\n"); - return err; - } - break; - case CRASH_BUS: - err = visorchannel_write(chipset_dev->controlvm_channel, - local_crash_msg_offset, msg, - sizeof(struct controlvm_message)); - if (err) { - dev_err(&chipset_dev->acpi_device->dev, - "failed to write bus msg\n"); - return err; - } - break; - default: - dev_err(&chipset_dev->acpi_device->dev, - "Invalid crash_obj_type\n"); - break; - } - return 0; -} - -static int controlvm_responder(enum controlvm_id cmd_id, - struct controlvm_message_header *pending_msg_hdr, - int response) -{ - if (pending_msg_hdr->id != (u32)cmd_id) - return -EINVAL; - - return controlvm_respond(pending_msg_hdr, response, NULL); -} - -static int device_changestate_responder(enum controlvm_id cmd_id, - struct visor_device *p, int response, - struct visor_segment_state state) -{ - struct controlvm_message outmsg; - - if (p->pending_msg_hdr->id != cmd_id) - return -EINVAL; - - controlvm_init_response(&outmsg, p->pending_msg_hdr, response); - outmsg.cmd.device_change_state.bus_no = p->chipset_bus_no; - outmsg.cmd.device_change_state.dev_no = p->chipset_dev_no; - outmsg.cmd.device_change_state.state = state; - return visorchannel_signalinsert(chipset_dev->controlvm_channel, - CONTROLVM_QUEUE_REQUEST, &outmsg); -} - -static int visorbus_create(struct controlvm_message *inmsg) -{ - struct controlvm_message_packet *cmd = &inmsg->cmd; - struct controlvm_message_header *pmsg_hdr; - u32 bus_no = cmd->create_bus.bus_no; - struct visor_device *bus_info; - struct visorchannel *visorchannel; - int err; - - bus_info = visorbus_get_device_by_id(bus_no, BUS_ROOT_DEVICE, NULL); - if (bus_info && bus_info->state.created == 1) { - dev_err(&chipset_dev->acpi_device->dev, - "failed %s: already exists\n", __func__); - err = -EEXIST; - goto err_respond; - } - bus_info = kzalloc(sizeof(*bus_info), GFP_KERNEL); - if (!bus_info) { - err = -ENOMEM; - goto err_respond; - } - INIT_LIST_HEAD(&bus_info->list_all); - bus_info->chipset_bus_no = bus_no; - bus_info->chipset_dev_no = BUS_ROOT_DEVICE; - if (guid_equal(&cmd->create_bus.bus_inst_guid, &visor_siovm_guid)) { - err = save_crash_message(inmsg, CRASH_BUS); - if (err) - goto err_free_bus_info; - } - if (inmsg->hdr.flags.response_expected == 1) { - pmsg_hdr = kzalloc(sizeof(*pmsg_hdr), GFP_KERNEL); - if (!pmsg_hdr) { - err = -ENOMEM; - goto err_free_bus_info; - } - memcpy(pmsg_hdr, &inmsg->hdr, - sizeof(struct controlvm_message_header)); - bus_info->pending_msg_hdr = pmsg_hdr; - } - visorchannel = visorchannel_create(cmd->create_bus.channel_addr, - GFP_KERNEL, - &cmd->create_bus.bus_data_type_guid, - false); - if (!visorchannel) { - err = -ENOMEM; - goto err_free_pending_msg; - } - bus_info->visorchannel = visorchannel; - /* Response will be handled by visorbus_create_instance on success */ - err = visorbus_create_instance(bus_info); - if (err) - goto err_destroy_channel; - return 0; - -err_destroy_channel: - visorchannel_destroy(visorchannel); - -err_free_pending_msg: - kfree(bus_info->pending_msg_hdr); - -err_free_bus_info: - kfree(bus_info); - -err_respond: - if (inmsg->hdr.flags.response_expected == 1) - controlvm_responder(inmsg->hdr.id, &inmsg->hdr, err); - return err; -} - -static int visorbus_destroy(struct controlvm_message *inmsg) -{ - struct controlvm_message_header *pmsg_hdr; - u32 bus_no = inmsg->cmd.destroy_bus.bus_no; - struct visor_device *bus_info; - int err; - - bus_info = visorbus_get_device_by_id(bus_no, BUS_ROOT_DEVICE, NULL); - if (!bus_info) { - err = -ENODEV; - goto err_respond; - } - if (bus_info->state.created == 0) { - err = -ENOENT; - goto err_respond; - } - if (bus_info->pending_msg_hdr) { - /* only non-NULL if dev is still waiting on a response */ - err = -EEXIST; - goto err_respond; - } - if (inmsg->hdr.flags.response_expected == 1) { - pmsg_hdr = kzalloc(sizeof(*pmsg_hdr), GFP_KERNEL); - if (!pmsg_hdr) { - err = -ENOMEM; - goto err_respond; - } - memcpy(pmsg_hdr, &inmsg->hdr, - sizeof(struct controlvm_message_header)); - bus_info->pending_msg_hdr = pmsg_hdr; - } - /* Response will be handled by visorbus_remove_instance */ - visorbus_remove_instance(bus_info); - return 0; - -err_respond: - if (inmsg->hdr.flags.response_expected == 1) - controlvm_responder(inmsg->hdr.id, &inmsg->hdr, err); - return err; -} - -static const guid_t *parser_id_get(struct parser_context *ctx) -{ - return &ctx->data.id; -} - -static void *parser_string_get(u8 *pscan, int nscan) -{ - int value_length; - void *value; - - if (nscan == 0) - return NULL; - - value_length = strnlen(pscan, nscan); - value = kzalloc(value_length + 1, GFP_KERNEL); - if (!value) - return NULL; - if (value_length > 0) - memcpy(value, pscan, value_length); - return value; -} - -static void *parser_name_get(struct parser_context *ctx) -{ - struct visor_controlvm_parameters_header *phdr; - - phdr = &ctx->data; - if ((unsigned long)phdr->name_offset + - (unsigned long)phdr->name_length > ctx->param_bytes) - return NULL; - ctx->curr = (char *)&phdr + phdr->name_offset; - ctx->bytes_remaining = phdr->name_length; - return parser_string_get(ctx->curr, phdr->name_length); -} - -static int visorbus_configure(struct controlvm_message *inmsg, - struct parser_context *parser_ctx) -{ - struct controlvm_message_packet *cmd = &inmsg->cmd; - u32 bus_no; - struct visor_device *bus_info; - int err = 0; - - bus_no = cmd->configure_bus.bus_no; - bus_info = visorbus_get_device_by_id(bus_no, BUS_ROOT_DEVICE, NULL); - if (!bus_info) { - err = -EINVAL; - goto err_respond; - } - if (bus_info->state.created == 0) { - err = -EINVAL; - goto err_respond; - } - if (bus_info->pending_msg_hdr) { - err = -EIO; - goto err_respond; - } - err = visorchannel_set_clientpartition(bus_info->visorchannel, - cmd->configure_bus.guest_handle); - if (err) - goto err_respond; - if (parser_ctx) { - const guid_t *partition_guid = parser_id_get(parser_ctx); - - guid_copy(&bus_info->partition_guid, partition_guid); - bus_info->name = parser_name_get(parser_ctx); - } - if (inmsg->hdr.flags.response_expected == 1) - controlvm_responder(inmsg->hdr.id, &inmsg->hdr, err); - return 0; - -err_respond: - dev_err(&chipset_dev->acpi_device->dev, - "%s exited with err: %d\n", __func__, err); - if (inmsg->hdr.flags.response_expected == 1) - controlvm_responder(inmsg->hdr.id, &inmsg->hdr, err); - return err; -} - -static int visorbus_device_create(struct controlvm_message *inmsg) -{ - struct controlvm_message_packet *cmd = &inmsg->cmd; - struct controlvm_message_header *pmsg_hdr; - u32 bus_no = cmd->create_device.bus_no; - u32 dev_no = cmd->create_device.dev_no; - struct visor_device *dev_info; - struct visor_device *bus_info; - struct visorchannel *visorchannel; - int err; - - bus_info = visorbus_get_device_by_id(bus_no, BUS_ROOT_DEVICE, NULL); - if (!bus_info) { - dev_err(&chipset_dev->acpi_device->dev, - "failed to get bus by id: %d\n", bus_no); - err = -ENODEV; - goto err_respond; - } - if (bus_info->state.created == 0) { - dev_err(&chipset_dev->acpi_device->dev, - "bus not created, id: %d\n", bus_no); - err = -EINVAL; - goto err_respond; - } - dev_info = visorbus_get_device_by_id(bus_no, dev_no, NULL); - if (dev_info && dev_info->state.created == 1) { - dev_err(&chipset_dev->acpi_device->dev, - "failed to get bus by id: %d/%d\n", bus_no, dev_no); - err = -EEXIST; - goto err_respond; - } - - dev_info = kzalloc(sizeof(*dev_info), GFP_KERNEL); - if (!dev_info) { - err = -ENOMEM; - goto err_respond; - } - dev_info->chipset_bus_no = bus_no; - dev_info->chipset_dev_no = dev_no; - guid_copy(&dev_info->inst, &cmd->create_device.dev_inst_guid); - dev_info->device.parent = &bus_info->device; - visorchannel = visorchannel_create(cmd->create_device.channel_addr, - GFP_KERNEL, - &cmd->create_device.data_type_guid, - true); - if (!visorchannel) { - dev_err(&chipset_dev->acpi_device->dev, - "failed to create visorchannel: %d/%d\n", - bus_no, dev_no); - err = -ENOMEM; - goto err_free_dev_info; - } - dev_info->visorchannel = visorchannel; - guid_copy(&dev_info->channel_type_guid, - &cmd->create_device.data_type_guid); - if (guid_equal(&cmd->create_device.data_type_guid, - &visor_vhba_channel_guid)) { - err = save_crash_message(inmsg, CRASH_DEV); - if (err) - goto err_destroy_visorchannel; - } - if (inmsg->hdr.flags.response_expected == 1) { - pmsg_hdr = kzalloc(sizeof(*pmsg_hdr), GFP_KERNEL); - if (!pmsg_hdr) { - err = -ENOMEM; - goto err_destroy_visorchannel; - } - memcpy(pmsg_hdr, &inmsg->hdr, - sizeof(struct controlvm_message_header)); - dev_info->pending_msg_hdr = pmsg_hdr; - } - /* create_visor_device will send response */ - err = create_visor_device(dev_info); - if (err) - goto err_destroy_visorchannel; - - return 0; - -err_destroy_visorchannel: - visorchannel_destroy(visorchannel); - -err_free_dev_info: - kfree(dev_info); - -err_respond: - if (inmsg->hdr.flags.response_expected == 1) - controlvm_responder(inmsg->hdr.id, &inmsg->hdr, err); - return err; -} - -static int visorbus_device_changestate(struct controlvm_message *inmsg) -{ - struct controlvm_message_packet *cmd = &inmsg->cmd; - struct controlvm_message_header *pmsg_hdr; - u32 bus_no = cmd->device_change_state.bus_no; - u32 dev_no = cmd->device_change_state.dev_no; - struct visor_segment_state state = cmd->device_change_state.state; - struct visor_device *dev_info; - int err = 0; - - dev_info = visorbus_get_device_by_id(bus_no, dev_no, NULL); - if (!dev_info) { - err = -ENODEV; - goto err_respond; - } - if (dev_info->state.created == 0) { - err = -EINVAL; - goto err_respond; - } - if (dev_info->pending_msg_hdr) { - /* only non-NULL if dev is still waiting on a response */ - err = -EIO; - goto err_respond; - } - - if (inmsg->hdr.flags.response_expected == 1) { - pmsg_hdr = kzalloc(sizeof(*pmsg_hdr), GFP_KERNEL); - if (!pmsg_hdr) { - err = -ENOMEM; - goto err_respond; - } - memcpy(pmsg_hdr, &inmsg->hdr, - sizeof(struct controlvm_message_header)); - dev_info->pending_msg_hdr = pmsg_hdr; - } - if (state.alive == segment_state_running.alive && - state.operating == segment_state_running.operating) - /* Response will be sent from visorchipset_device_resume */ - err = visorchipset_device_resume(dev_info); - /* ServerNotReady / ServerLost / SegmentStateStandby */ - else if (state.alive == segment_state_standby.alive && - state.operating == segment_state_standby.operating) - /* - * technically this is standby case where server is lost. - * Response will be sent from visorchipset_device_pause. - */ - err = visorchipset_device_pause(dev_info); - if (err) - goto err_respond; - return 0; - -err_respond: - dev_err(&chipset_dev->acpi_device->dev, "failed: %d\n", err); - if (inmsg->hdr.flags.response_expected == 1) - controlvm_responder(inmsg->hdr.id, &inmsg->hdr, err); - return err; -} - -static int visorbus_device_destroy(struct controlvm_message *inmsg) -{ - struct controlvm_message_packet *cmd = &inmsg->cmd; - struct controlvm_message_header *pmsg_hdr; - u32 bus_no = cmd->destroy_device.bus_no; - u32 dev_no = cmd->destroy_device.dev_no; - struct visor_device *dev_info; - int err; - - dev_info = visorbus_get_device_by_id(bus_no, dev_no, NULL); - if (!dev_info) { - err = -ENODEV; - goto err_respond; - } - if (dev_info->state.created == 0) { - err = -EINVAL; - goto err_respond; - } - if (dev_info->pending_msg_hdr) { - /* only non-NULL if dev is still waiting on a response */ - err = -EIO; - goto err_respond; - } - if (inmsg->hdr.flags.response_expected == 1) { - pmsg_hdr = kzalloc(sizeof(*pmsg_hdr), GFP_KERNEL); - if (!pmsg_hdr) { - err = -ENOMEM; - goto err_respond; - } - - memcpy(pmsg_hdr, &inmsg->hdr, - sizeof(struct controlvm_message_header)); - dev_info->pending_msg_hdr = pmsg_hdr; - } - kfree(dev_info->name); - remove_visor_device(dev_info); - return 0; - -err_respond: - if (inmsg->hdr.flags.response_expected == 1) - controlvm_responder(inmsg->hdr.id, &inmsg->hdr, err); - return err; -} - -/* - * The general parahotplug flow works as follows. The visorchipset receives - * a DEVICE_CHANGESTATE message from Command specifying a physical device - * to enable or disable. The CONTROLVM message handler calls - * parahotplug_process_message, which then adds the message to a global list - * and kicks off a udev event which causes a user level script to enable or - * disable the specified device. The udev script then writes to - * /sys/devices/platform/visorchipset/parahotplug, which causes the - * parahotplug store functions to get called, at which point the - * appropriate CONTROLVM message is retrieved from the list and responded to. - */ - -#define PARAHOTPLUG_TIMEOUT_MS 2000 - -/* - * parahotplug_next_id() - generate unique int to match an outstanding - * CONTROLVM message with a udev script /sys - * response - * - * Return: a unique integer value - */ -static int parahotplug_next_id(void) -{ - static atomic_t id = ATOMIC_INIT(0); - - return atomic_inc_return(&id); -} - -/* - * parahotplug_next_expiration() - returns the time (in jiffies) when a - * CONTROLVM message on the list should expire - * -- PARAHOTPLUG_TIMEOUT_MS in the future - * - * Return: expected expiration time (in jiffies) - */ -static unsigned long parahotplug_next_expiration(void) -{ - return jiffies + msecs_to_jiffies(PARAHOTPLUG_TIMEOUT_MS); -} - -/* - * parahotplug_request_create() - create a parahotplug_request, which is - * basically a wrapper for a CONTROLVM_MESSAGE - * that we can stick on a list - * @msg: the message to insert in the request - * - * Return: the request containing the provided message - */ -static struct parahotplug_request *parahotplug_request_create( - struct controlvm_message *msg) -{ - struct parahotplug_request *req; - - req = kmalloc(sizeof(*req), GFP_KERNEL); - if (!req) - return NULL; - req->id = parahotplug_next_id(); - req->expiration = parahotplug_next_expiration(); - req->msg = *msg; - return req; -} - -/* - * parahotplug_request_destroy() - free a parahotplug_request - * @req: the request to deallocate - */ -static void parahotplug_request_destroy(struct parahotplug_request *req) -{ - kfree(req); -} - -static LIST_HEAD(parahotplug_request_list); -/* lock for above */ -static DEFINE_SPINLOCK(parahotplug_request_list_lock); - -/* - * parahotplug_request_complete() - mark request as complete - * @id: the id of the request - * @active: indicates whether the request is assigned to active partition - * - * Called from the /sys handler, which means the user script has - * finished the enable/disable. Find the matching identifier, and - * respond to the CONTROLVM message with success. - * - * Return: 0 on success or -EINVAL on failure - */ -static int parahotplug_request_complete(int id, u16 active) -{ - struct list_head *pos; - struct list_head *tmp; - struct parahotplug_request *req; - - spin_lock(¶hotplug_request_list_lock); - /* Look for a request matching "id". */ - list_for_each_safe(pos, tmp, ¶hotplug_request_list) { - req = list_entry(pos, struct parahotplug_request, list); - if (req->id == id) { - /* - * Found a match. Remove it from the list and - * respond. - */ - list_del(pos); - spin_unlock(¶hotplug_request_list_lock); - req->msg.cmd.device_change_state.state.active = active; - if (req->msg.hdr.flags.response_expected) - controlvm_respond( - &req->msg.hdr, CONTROLVM_RESP_SUCCESS, - &req->msg.cmd.device_change_state.state); - parahotplug_request_destroy(req); - return 0; - } - } - spin_unlock(¶hotplug_request_list_lock); - return -EINVAL; -} - -/* - * devicedisabled_store() - disables the hotplug device - * @dev: sysfs interface variable not utilized in this function - * @attr: sysfs interface variable not utilized in this function - * @buf: buffer containing the device id - * @count: the size of the buffer - * - * The parahotplug/devicedisabled interface gets called by our support script - * when an SR-IOV device has been shut down. The ID is passed to the script - * and then passed back when the device has been removed. - * - * Return: the size of the buffer for success or negative for error - */ -static ssize_t devicedisabled_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - unsigned int id; - int err; - - if (kstrtouint(buf, 10, &id)) - return -EINVAL; - err = parahotplug_request_complete(id, 0); - if (err < 0) - return err; - return count; -} -static DEVICE_ATTR_WO(devicedisabled); - -/* - * deviceenabled_store() - enables the hotplug device - * @dev: sysfs interface variable not utilized in this function - * @attr: sysfs interface variable not utilized in this function - * @buf: buffer containing the device id - * @count: the size of the buffer - * - * The parahotplug/deviceenabled interface gets called by our support script - * when an SR-IOV device has been recovered. The ID is passed to the script - * and then passed back when the device has been brought back up. - * - * Return: the size of the buffer for success or negative for error - */ -static ssize_t deviceenabled_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - unsigned int id; - - if (kstrtouint(buf, 10, &id)) - return -EINVAL; - parahotplug_request_complete(id, 1); - return count; -} -static DEVICE_ATTR_WO(deviceenabled); - -static struct attribute *visorchipset_install_attrs[] = { - &dev_attr_toolaction.attr, - &dev_attr_boottotool.attr, - &dev_attr_error.attr, - &dev_attr_textid.attr, - &dev_attr_remaining_steps.attr, - NULL -}; - -static const struct attribute_group visorchipset_install_group = { - .name = "install", - .attrs = visorchipset_install_attrs -}; - -static struct attribute *visorchipset_parahotplug_attrs[] = { - &dev_attr_devicedisabled.attr, - &dev_attr_deviceenabled.attr, - NULL -}; - -static const struct attribute_group visorchipset_parahotplug_group = { - .name = "parahotplug", - .attrs = visorchipset_parahotplug_attrs -}; - -static const struct attribute_group *visorchipset_dev_groups[] = { - &visorchipset_install_group, - &visorchipset_parahotplug_group, - NULL -}; - -/* - * parahotplug_request_kickoff() - initiate parahotplug request - * @req: the request to initiate - * - * Cause uevent to run the user level script to do the disable/enable specified - * in the parahotplug_request. - */ -static int parahotplug_request_kickoff(struct parahotplug_request *req) -{ - struct controlvm_message_packet *cmd = &req->msg.cmd; - char env_cmd[40], env_id[40], env_state[40], env_bus[40], env_dev[40], - env_func[40]; - char *envp[] = { env_cmd, env_id, env_state, env_bus, env_dev, - env_func, NULL - }; - - sprintf(env_cmd, "VISOR_PARAHOTPLUG=1"); - sprintf(env_id, "VISOR_PARAHOTPLUG_ID=%d", req->id); - sprintf(env_state, "VISOR_PARAHOTPLUG_STATE=%d", - cmd->device_change_state.state.active); - sprintf(env_bus, "VISOR_PARAHOTPLUG_BUS=%d", - cmd->device_change_state.bus_no); - sprintf(env_dev, "VISOR_PARAHOTPLUG_DEVICE=%d", - cmd->device_change_state.dev_no >> 3); - sprintf(env_func, "VISOR_PARAHOTPLUG_FUNCTION=%d", - cmd->device_change_state.dev_no & 0x7); - return kobject_uevent_env(&chipset_dev->acpi_device->dev.kobj, - KOBJ_CHANGE, envp); -} - -/* - * parahotplug_process_message() - enables or disables a PCI device by kicking - * off a udev script - * @inmsg: the message indicating whether to enable or disable - */ -static int parahotplug_process_message(struct controlvm_message *inmsg) -{ - struct parahotplug_request *req; - int err; - - req = parahotplug_request_create(inmsg); - if (!req) - return -ENOMEM; - /* - * For enable messages, just respond with success right away, we don't - * need to wait to see if the enable was successful. - */ - if (inmsg->cmd.device_change_state.state.active) { - err = parahotplug_request_kickoff(req); - if (err) - goto err_respond; - controlvm_respond(&inmsg->hdr, CONTROLVM_RESP_SUCCESS, - &inmsg->cmd.device_change_state.state); - parahotplug_request_destroy(req); - return 0; - } - /* - * For disable messages, add the request to the request list before - * kicking off the udev script. It won't get responded to until the - * script has indicated it's done. - */ - spin_lock(¶hotplug_request_list_lock); - list_add_tail(&req->list, ¶hotplug_request_list); - spin_unlock(¶hotplug_request_list_lock); - err = parahotplug_request_kickoff(req); - if (err) - goto err_respond; - return 0; - -err_respond: - controlvm_respond(&inmsg->hdr, err, - &inmsg->cmd.device_change_state.state); - return err; -} - -/* - * chipset_ready_uevent() - sends chipset_ready action - * - * Send ACTION=online for DEVPATH=/sys/devices/platform/visorchipset. - * - * Return: 0 on success, negative on failure - */ -static int chipset_ready_uevent(struct controlvm_message_header *msg_hdr) -{ - int res; - - res = kobject_uevent(&chipset_dev->acpi_device->dev.kobj, KOBJ_ONLINE); - if (msg_hdr->flags.response_expected) - controlvm_respond(msg_hdr, res, NULL); - return res; -} - -/* - * chipset_selftest_uevent() - sends chipset_selftest action - * - * Send ACTION=online for DEVPATH=/sys/devices/platform/visorchipset. - * - * Return: 0 on success, negative on failure - */ -static int chipset_selftest_uevent(struct controlvm_message_header *msg_hdr) -{ - char env_selftest[20]; - char *envp[] = { env_selftest, NULL }; - int res; - - sprintf(env_selftest, "SPARSP_SELFTEST=%d", 1); - res = kobject_uevent_env(&chipset_dev->acpi_device->dev.kobj, - KOBJ_CHANGE, envp); - if (msg_hdr->flags.response_expected) - controlvm_respond(msg_hdr, res, NULL); - return res; -} - -/* - * chipset_notready_uevent() - sends chipset_notready action - * - * Send ACTION=offline for DEVPATH=/sys/devices/platform/visorchipset. - * - * Return: 0 on success, negative on failure - */ -static int chipset_notready_uevent(struct controlvm_message_header *msg_hdr) -{ - int res = kobject_uevent(&chipset_dev->acpi_device->dev.kobj, - KOBJ_OFFLINE); - - if (msg_hdr->flags.response_expected) - controlvm_respond(msg_hdr, res, NULL); - return res; -} - -static int unisys_vmcall(unsigned long tuple, unsigned long param) -{ - int result = 0; - unsigned int cpuid_eax, cpuid_ebx, cpuid_ecx, cpuid_edx; - unsigned long reg_ebx; - unsigned long reg_ecx; - - reg_ebx = param & 0xFFFFFFFF; - reg_ecx = param >> 32; - cpuid(0x00000001, &cpuid_eax, &cpuid_ebx, &cpuid_ecx, &cpuid_edx); - if (!(cpuid_ecx & 0x80000000)) - return -EPERM; - __asm__ __volatile__(".byte 0x00f, 0x001, 0x0c1" : "=a"(result) : - "a"(tuple), "b"(reg_ebx), "c"(reg_ecx)); - if (result) - goto error; - return 0; - -/* Need to convert from VMCALL error codes to Linux */ -error: - switch (result) { - case VMCALL_RESULT_INVALID_PARAM: - return -EINVAL; - case VMCALL_RESULT_DATA_UNAVAILABLE: - return -ENODEV; - default: - return -EFAULT; - } -} - -static int controlvm_channel_create(struct visorchipset_device *dev) -{ - struct visorchannel *chan; - u64 addr; - int err; - - err = unisys_vmcall(VMCALL_CONTROLVM_ADDR, - virt_to_phys(&dev->controlvm_params)); - if (err) - return err; - addr = dev->controlvm_params.address; - chan = visorchannel_create(addr, GFP_KERNEL, - &visor_controlvm_channel_guid, true); - if (!chan) - return -ENOMEM; - dev->controlvm_channel = chan; - return 0; -} - -static void setup_crash_devices_work_queue(struct work_struct *work) -{ - struct controlvm_message local_crash_bus_msg; - struct controlvm_message local_crash_dev_msg; - struct controlvm_message msg = { - .hdr.id = CONTROLVM_CHIPSET_INIT, - .cmd.init_chipset = { - .bus_count = 23, - .switch_count = 0, - }, - }; - u32 local_crash_msg_offset; - u16 local_crash_msg_count; - - /* send init chipset msg */ - chipset_init(&msg); - /* get saved message count */ - if (visorchannel_read(chipset_dev->controlvm_channel, - offsetof(struct visor_controlvm_channel, - saved_crash_message_count), - &local_crash_msg_count, sizeof(u16)) < 0) { - dev_err(&chipset_dev->acpi_device->dev, - "failed to read channel\n"); - return; - } - if (local_crash_msg_count != CONTROLVM_CRASHMSG_MAX) { - dev_err(&chipset_dev->acpi_device->dev, "invalid count\n"); - return; - } - /* get saved crash message offset */ - if (visorchannel_read(chipset_dev->controlvm_channel, - offsetof(struct visor_controlvm_channel, - saved_crash_message_offset), - &local_crash_msg_offset, sizeof(u32)) < 0) { - dev_err(&chipset_dev->acpi_device->dev, - "failed to read channel\n"); - return; - } - /* read create device message for storage bus offset */ - if (visorchannel_read(chipset_dev->controlvm_channel, - local_crash_msg_offset, - &local_crash_bus_msg, - sizeof(struct controlvm_message)) < 0) { - dev_err(&chipset_dev->acpi_device->dev, - "failed to read channel\n"); - return; - } - /* read create device message for storage device */ - if (visorchannel_read(chipset_dev->controlvm_channel, - local_crash_msg_offset + - sizeof(struct controlvm_message), - &local_crash_dev_msg, - sizeof(struct controlvm_message)) < 0) { - dev_err(&chipset_dev->acpi_device->dev, - "failed to read channel\n"); - return; - } - /* reuse IOVM create bus message */ - if (!local_crash_bus_msg.cmd.create_bus.channel_addr) { - dev_err(&chipset_dev->acpi_device->dev, - "no valid create_bus message\n"); - return; - } - visorbus_create(&local_crash_bus_msg); - /* reuse create device message for storage device */ - if (!local_crash_dev_msg.cmd.create_device.channel_addr) { - dev_err(&chipset_dev->acpi_device->dev, - "no valid create_device message\n"); - return; - } - visorbus_device_create(&local_crash_dev_msg); -} - -void visorbus_response(struct visor_device *bus_info, int response, - int controlvm_id) -{ - if (!bus_info->pending_msg_hdr) - return; - - controlvm_responder(controlvm_id, bus_info->pending_msg_hdr, response); - kfree(bus_info->pending_msg_hdr); - bus_info->pending_msg_hdr = NULL; -} - -void visorbus_device_changestate_response(struct visor_device *dev_info, - int response, - struct visor_segment_state state) -{ - if (!dev_info->pending_msg_hdr) - return; - - device_changestate_responder(CONTROLVM_DEVICE_CHANGESTATE, dev_info, - response, state); - kfree(dev_info->pending_msg_hdr); - dev_info->pending_msg_hdr = NULL; -} - -static void parser_done(struct parser_context *ctx) -{ - chipset_dev->controlvm_payload_bytes_buffered -= ctx->param_bytes; - kfree(ctx); -} - -static struct parser_context *parser_init_stream(u64 addr, u32 bytes, - bool *retry) -{ - unsigned long allocbytes; - struct parser_context *ctx; - void *mapping; - - *retry = false; - /* alloc an extra byte to ensure payload is \0 terminated */ - allocbytes = (unsigned long)bytes + 1 + (sizeof(struct parser_context) - - sizeof(struct visor_controlvm_parameters_header)); - if ((chipset_dev->controlvm_payload_bytes_buffered + bytes) > - MAX_CONTROLVM_PAYLOAD_BYTES) { - *retry = true; - return NULL; - } - ctx = kzalloc(allocbytes, GFP_KERNEL); - if (!ctx) { - *retry = true; - return NULL; - } - ctx->allocbytes = allocbytes; - ctx->param_bytes = bytes; - mapping = memremap(addr, bytes, MEMREMAP_WB); - if (!mapping) - goto err_finish_ctx; - memcpy(&ctx->data, mapping, bytes); - memunmap(mapping); - ctx->byte_stream = true; - chipset_dev->controlvm_payload_bytes_buffered += ctx->param_bytes; - return ctx; - -err_finish_ctx: - kfree(ctx); - return NULL; -} - -/* - * handle_command() - process a controlvm message - * @inmsg: the message to process - * @channel_addr: address of the controlvm channel - * - * Return: - * 0 - Successfully processed the message - * -EAGAIN - ControlVM message was not processed and should be retried - * reading the next controlvm message; a scenario where this can - * occur is when we need to throttle the allocation of memory in - * which to copy out controlvm payload data. - * < 0 - error: ControlVM message was processed but an error occurred. - */ -static int handle_command(struct controlvm_message inmsg, u64 channel_addr) -{ - struct controlvm_message_packet *cmd = &inmsg.cmd; - u64 parm_addr; - u32 parm_bytes; - struct parser_context *parser_ctx = NULL; - struct controlvm_message ackmsg; - int err = 0; - - /* create parsing context if necessary */ - parm_addr = channel_addr + inmsg.hdr.payload_vm_offset; - parm_bytes = inmsg.hdr.payload_bytes; - /* - * Parameter and channel addresses within test messages actually lie - * within our OS-controlled memory. We need to know that, because it - * makes a difference in how we compute the virtual address. - */ - if (parm_bytes) { - bool retry; - - parser_ctx = parser_init_stream(parm_addr, parm_bytes, &retry); - if (!parser_ctx && retry) - return -EAGAIN; - } - controlvm_init_response(&ackmsg, &inmsg.hdr, CONTROLVM_RESP_SUCCESS); - err = visorchannel_signalinsert(chipset_dev->controlvm_channel, - CONTROLVM_QUEUE_ACK, &ackmsg); - if (err) - return err; - switch (inmsg.hdr.id) { - case CONTROLVM_CHIPSET_INIT: - err = chipset_init(&inmsg); - break; - case CONTROLVM_BUS_CREATE: - err = visorbus_create(&inmsg); - break; - case CONTROLVM_BUS_DESTROY: - err = visorbus_destroy(&inmsg); - break; - case CONTROLVM_BUS_CONFIGURE: - err = visorbus_configure(&inmsg, parser_ctx); - break; - case CONTROLVM_DEVICE_CREATE: - err = visorbus_device_create(&inmsg); - break; - case CONTROLVM_DEVICE_CHANGESTATE: - if (cmd->device_change_state.flags.phys_device) { - err = parahotplug_process_message(&inmsg); - } else { - /* - * save the hdr and cmd structures for later use when - * sending back the response to Command - */ - err = visorbus_device_changestate(&inmsg); - break; - } - break; - case CONTROLVM_DEVICE_DESTROY: - err = visorbus_device_destroy(&inmsg); - break; - case CONTROLVM_DEVICE_CONFIGURE: - /* no op just send a respond that we passed */ - if (inmsg.hdr.flags.response_expected) - controlvm_respond(&inmsg.hdr, CONTROLVM_RESP_SUCCESS, - NULL); - break; - case CONTROLVM_CHIPSET_READY: - err = chipset_ready_uevent(&inmsg.hdr); - break; - case CONTROLVM_CHIPSET_SELFTEST: - err = chipset_selftest_uevent(&inmsg.hdr); - break; - case CONTROLVM_CHIPSET_STOP: - err = chipset_notready_uevent(&inmsg.hdr); - break; - default: - err = -ENOMSG; - if (inmsg.hdr.flags.response_expected) - controlvm_respond(&inmsg.hdr, - -CONTROLVM_RESP_ID_UNKNOWN, NULL); - break; - } - if (parser_ctx) { - parser_done(parser_ctx); - parser_ctx = NULL; - } - return err; -} - -/* - * read_controlvm_event() - retreives the next message from the - * CONTROLVM_QUEUE_EVENT queue in the controlvm - * channel - * @msg: pointer to the retrieved message - * - * Return: 0 if valid message was retrieved or -error - */ -static int read_controlvm_event(struct controlvm_message *msg) -{ - int err = visorchannel_signalremove(chipset_dev->controlvm_channel, - CONTROLVM_QUEUE_EVENT, msg); - - if (err) - return err; - /* got a message */ - if (msg->hdr.flags.test_message == 1) - return -EINVAL; - return 0; -} - -/* - * parahotplug_process_list() - remove any request from the list that's been on - * there too long and respond with an error - */ -static void parahotplug_process_list(void) -{ - struct list_head *pos; - struct list_head *tmp; - - spin_lock(¶hotplug_request_list_lock); - list_for_each_safe(pos, tmp, ¶hotplug_request_list) { - struct parahotplug_request *req = - list_entry(pos, struct parahotplug_request, list); - - if (!time_after_eq(jiffies, req->expiration)) - continue; - list_del(pos); - if (req->msg.hdr.flags.response_expected) - controlvm_respond( - &req->msg.hdr, - CONTROLVM_RESP_DEVICE_UDEV_TIMEOUT, - &req->msg.cmd.device_change_state.state); - parahotplug_request_destroy(req); - } - spin_unlock(¶hotplug_request_list_lock); -} - -static void controlvm_periodic_work(struct work_struct *work) -{ - struct controlvm_message inmsg; - int count = 0; - int err; - - /* Drain the RESPONSE queue make it empty */ - do { - err = visorchannel_signalremove(chipset_dev->controlvm_channel, - CONTROLVM_QUEUE_RESPONSE, - &inmsg); - } while ((!err) && (++count < CONTROLVM_MESSAGE_MAX)); - if (err != -EAGAIN) - goto schedule_out; - if (chipset_dev->controlvm_pending_msg_valid) { - /* - * we throttled processing of a prior msg, so try to process - * it again rather than reading a new one - */ - inmsg = chipset_dev->controlvm_pending_msg; - chipset_dev->controlvm_pending_msg_valid = false; - err = 0; - } else { - err = read_controlvm_event(&inmsg); - } - while (!err) { - chipset_dev->most_recent_message_jiffies = jiffies; - err = handle_command(inmsg, - visorchannel_get_physaddr - (chipset_dev->controlvm_channel)); - if (err == -EAGAIN) { - chipset_dev->controlvm_pending_msg = inmsg; - chipset_dev->controlvm_pending_msg_valid = true; - break; - } - - err = read_controlvm_event(&inmsg); - } - /* parahotplug_worker */ - parahotplug_process_list(); - -/* - * The controlvm messages are sent in a bulk. If we start receiving messages, we - * want the polling to be fast. If we do not receive any message for - * MIN_IDLE_SECONDS, we can slow down the polling. - */ -schedule_out: - if (time_after(jiffies, chipset_dev->most_recent_message_jiffies + - (HZ * MIN_IDLE_SECONDS))) { - /* - * it's been longer than MIN_IDLE_SECONDS since we processed - * our last controlvm message; slow down the polling - */ - if (chipset_dev->poll_jiffies != POLLJIFFIES_CONTROLVM_SLOW) - chipset_dev->poll_jiffies = POLLJIFFIES_CONTROLVM_SLOW; - } else { - if (chipset_dev->poll_jiffies != POLLJIFFIES_CONTROLVM_FAST) - chipset_dev->poll_jiffies = POLLJIFFIES_CONTROLVM_FAST; - } - schedule_delayed_work(&chipset_dev->periodic_controlvm_work, - chipset_dev->poll_jiffies); -} - -static int visorchipset_init(struct acpi_device *acpi_device) -{ - int err = -ENOMEM; - struct visorchannel *controlvm_channel; - - chipset_dev = kzalloc(sizeof(*chipset_dev), GFP_KERNEL); - if (!chipset_dev) - goto error; - err = controlvm_channel_create(chipset_dev); - if (err) - goto error_free_chipset_dev; - acpi_device->driver_data = chipset_dev; - chipset_dev->acpi_device = acpi_device; - chipset_dev->poll_jiffies = POLLJIFFIES_CONTROLVM_FAST; - err = sysfs_create_groups(&chipset_dev->acpi_device->dev.kobj, - visorchipset_dev_groups); - if (err < 0) - goto error_destroy_channel; - controlvm_channel = chipset_dev->controlvm_channel; - if (!visor_check_channel(visorchannel_get_header(controlvm_channel), - &chipset_dev->acpi_device->dev, - &visor_controlvm_channel_guid, - "controlvm", - sizeof(struct visor_controlvm_channel), - VISOR_CONTROLVM_CHANNEL_VERSIONID, - VISOR_CHANNEL_SIGNATURE)) { - err = -ENODEV; - goto error_delete_groups; - } - /* if booting in a crash kernel */ - if (is_kdump_kernel()) - INIT_DELAYED_WORK(&chipset_dev->periodic_controlvm_work, - setup_crash_devices_work_queue); - else - INIT_DELAYED_WORK(&chipset_dev->periodic_controlvm_work, - controlvm_periodic_work); - chipset_dev->most_recent_message_jiffies = jiffies; - chipset_dev->poll_jiffies = POLLJIFFIES_CONTROLVM_FAST; - schedule_delayed_work(&chipset_dev->periodic_controlvm_work, - chipset_dev->poll_jiffies); - err = visorbus_init(); - if (err < 0) - goto error_cancel_work; - return 0; - -error_cancel_work: - cancel_delayed_work_sync(&chipset_dev->periodic_controlvm_work); - -error_delete_groups: - sysfs_remove_groups(&chipset_dev->acpi_device->dev.kobj, - visorchipset_dev_groups); - -error_destroy_channel: - visorchannel_destroy(chipset_dev->controlvm_channel); - -error_free_chipset_dev: - kfree(chipset_dev); - -error: - dev_err(&acpi_device->dev, "failed with error %d\n", err); - return err; -} - -static int visorchipset_exit(struct acpi_device *acpi_device) -{ - visorbus_exit(); - cancel_delayed_work_sync(&chipset_dev->periodic_controlvm_work); - sysfs_remove_groups(&chipset_dev->acpi_device->dev.kobj, - visorchipset_dev_groups); - visorchannel_destroy(chipset_dev->controlvm_channel); - kfree(chipset_dev); - return 0; -} - -static const struct acpi_device_id unisys_device_ids[] = { - {"PNP0A07", 0}, - {"", 0}, -}; - -static struct acpi_driver unisys_acpi_driver = { - .name = "unisys_acpi", - .class = "unisys_acpi_class", - .owner = THIS_MODULE, - .ids = unisys_device_ids, - .ops = { - .add = visorchipset_init, - .remove = visorchipset_exit, - }, -}; - -MODULE_DEVICE_TABLE(acpi, unisys_device_ids); - -static __init int visorutil_spar_detect(void) -{ - unsigned int eax, ebx, ecx, edx; - - if (boot_cpu_has(X86_FEATURE_HYPERVISOR)) { - /* check the ID */ - cpuid(UNISYS_VISOR_LEAF_ID, &eax, &ebx, &ecx, &edx); - return (ebx == UNISYS_VISOR_ID_EBX) && - (ecx == UNISYS_VISOR_ID_ECX) && - (edx == UNISYS_VISOR_ID_EDX); - } - return 0; -} - -static int __init init_unisys(void) -{ - int result; - - if (!visorutil_spar_detect()) - return -ENODEV; - result = acpi_bus_register_driver(&unisys_acpi_driver); - if (result) - return -ENODEV; - pr_info("Unisys Visorchipset Driver Loaded.\n"); - return 0; -}; - -static void __exit exit_unisys(void) -{ - acpi_bus_unregister_driver(&unisys_acpi_driver); -} - -module_init(init_unisys); -module_exit(exit_unisys); - -MODULE_AUTHOR("Unisys"); -MODULE_LICENSE("GPL"); -MODULE_DESCRIPTION("s-Par visorbus driver for virtual device buses"); diff --git a/drivers/vme/Kconfig b/drivers/vme/Kconfig index 936392ca3c8c..c13dd9d2a604 100644 --- a/drivers/vme/Kconfig +++ b/drivers/vme/Kconfig @@ -15,6 +15,4 @@ source "drivers/vme/bridges/Kconfig" source "drivers/vme/boards/Kconfig" -source "drivers/staging/vme/devices/Kconfig" - endif # VME |