Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'staging-6.0-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging

Pull staging driver updates from Greg KH:
"Here is the big set of staging driver patches for 6.0-rc1.

Another round where we removed more lines of code than added, always a
nice progression. Some of that came from the movement of the vme code
back into staging, and removal of some other of the vme driver code as
there are no known users and it is very obsolete and unmaintained. It
can be added back easily if someone offers to maintain it.

Other than that this merge has lots of little things:

- huge cleanups for r8188eu driver

- minor cleanups for other wifi drivers

- tiny loop fixes for greybus code

- other small coding style fixes

All of these have been in linux-next for a while with no reported
issues"

* tag 'staging-6.0-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: (191 commits)
staging: r8188eu: fix potential uninitialised variable use in rtw_pwrctrl.c
staging: r8188eu: remove initializer from ret in rtw_pwr_wakeup
staging: vt6655: Convert macro vt6655_mac_clear_stck_ds to function
staging: vt6655: Rename MACvClearStckDS
staging: fbtft: core: set smem_len before fb_deferred_io_init call
staging: r8188eu: convert rtw_pwr_wakeup to correct error code semantics
staging: r8188eu: make dump_chip_info() static
staging: r8188eu: remove DoReserved prototype
staging: r8188eu: remove OnAtim prototype
staging: r8188eu: remove SetHwReg8188EU()
staging: r8188eu: make update_TSF() and correct_TSF() static
staging: r8188eu: remove unused parameter from update_TSF()
staging: r8188eu: remove unused parameter from correct_TSF()
staging: r8188eu: remove HW_VAR_SET_OPMODE from SetHwReg8188EU()
staging: pi433: remove duplicated comments
staging: qlge: refine variable name
staging: vt6655: Convert macro vt6655_mac_word_reg_bits_off to function
staging: vt6655: Convert macro vt6655_mac_reg_bits_off to function
staging: vt6655: Convert macro vt6655_mac_word_reg_bits_on to function
staging: vt6655: Convert macro vt6655_mac_reg_bits_on to function
...

+2047 -4714
+2 -2
Documentation/driver-api/vme.rst
··· 290 290 VME API 291 291 ------- 292 292 293 - .. kernel-doc:: include/linux/vme.h 293 + .. kernel-doc:: drivers/staging/vme_user/vme.h 294 294 :internal: 295 295 296 - .. kernel-doc:: drivers/vme/vme.c 296 + .. kernel-doc:: drivers/staging/vme_user/vme.c 297 297 :export:
+2 -3
MAINTAINERS
··· 19261 19261 STAGING - REALTEK RTL8188EU DRIVERS 19262 19262 M: Larry Finger <Larry.Finger@lwfinger.net> 19263 19263 M: Phillip Potter <phil@philpotter.co.uk> 19264 + R: Pavel Skripkin <paskripkin@gmail.com> 19264 19265 S: Supported 19265 19266 F: drivers/staging/r8188eu/ 19266 19267 ··· 21581 21580 M: Manohar Vanga <manohar.vanga@gmail.com> 21582 21581 M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> 21583 21582 L: linux-kernel@vger.kernel.org 21584 - S: Maintained 21583 + S: Odd fixes 21585 21584 T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git 21586 21585 F: Documentation/driver-api/vme.rst 21587 21586 F: drivers/staging/vme_user/ 21588 - F: drivers/vme/ 21589 - F: include/linux/vme* 21590 21587 21591 21588 VM SOCKETS (AF_VSOCK) 21592 21589 M: Stefano Garzarella <sgarzare@redhat.com>
-2
drivers/Kconfig
··· 183 183 184 184 source "drivers/ntb/Kconfig" 185 185 186 - source "drivers/vme/Kconfig" 187 - 188 186 source "drivers/pwm/Kconfig" 189 187 190 188 source "drivers/irqchip/Kconfig"
-1
drivers/Makefile
··· 165 165 obj-$(CONFIG_EXTCON) += extcon/ 166 166 obj-$(CONFIG_MEMORY) += memory/ 167 167 obj-$(CONFIG_IIO) += iio/ 168 - obj-$(CONFIG_VME_BUS) += vme/ 169 168 obj-$(CONFIG_IPACK_BUS) += ipack/ 170 169 obj-$(CONFIG_NTB) += ntb/ 171 170 obj-$(CONFIG_POWERCAP) += powercap/
+1 -2
drivers/staging/fbtft/fb_ssd1351.c
··· 196 196 "%s: power=%d, fb_blank=%d\n", 197 197 __func__, bd->props.power, bd->props.fb_blank); 198 198 199 - on = (bd->props.power == FB_BLANK_UNBLANK) && 200 - (bd->props.fb_blank == FB_BLANK_UNBLANK); 199 + on = !backlight_is_blank(bd); 201 200 /* Onboard backlight connected to GPIO0 on SSD1351, GPIO1 unused */ 202 201 write_reg(par, 0xB5, on ? 0x03 : 0x02); 203 202
+2 -3
drivers/staging/fbtft/fbtft-core.c
··· 137 137 "%s: polarity=%d, power=%d, fb_blank=%d\n", 138 138 __func__, polarity, bd->props.power, bd->props.fb_blank); 139 139 140 - if ((bd->props.power == FB_BLANK_UNBLANK) && 141 - (bd->props.fb_blank == FB_BLANK_UNBLANK)) 140 + if (!backlight_is_blank(bd)) 142 141 gpiod_set_value(par->gpio.led[0], polarity); 143 142 else 144 143 gpiod_set_value(par->gpio.led[0], !polarity); ··· 654 655 fbdefio->delay = HZ / fps; 655 656 fbdefio->sort_pagereflist = true; 656 657 fbdefio->deferred_io = fbtft_deferred_io; 657 - fb_deferred_io_init(info); 658 658 659 659 snprintf(info->fix.id, sizeof(info->fix.id), "%s", dev->driver->name); 660 660 info->fix.type = FB_TYPE_PACKED_PIXELS; ··· 664 666 info->fix.line_length = width * bpp / 8; 665 667 info->fix.accel = FB_ACCEL_NONE; 666 668 info->fix.smem_len = vmem_size; 669 + fb_deferred_io_init(info); 667 670 668 671 info->var.rotate = pdata->rotate; 669 672 info->var.xres = width;
+7 -7
drivers/staging/greybus/audio_helper.c
··· 115 115 int num) 116 116 { 117 117 int i; 118 - struct snd_soc_dapm_widget *w, *next_w; 118 + struct snd_soc_dapm_widget *w, *tmp_w; 119 119 #ifdef CONFIG_DEBUG_FS 120 120 struct dentry *parent = dapm->debugfs_dapm; 121 121 struct dentry *debugfs_w = NULL; ··· 124 124 mutex_lock(&dapm->card->dapm_mutex); 125 125 for (i = 0; i < num; i++) { 126 126 /* below logic can be optimized to identify widget pointer */ 127 - list_for_each_entry_safe(w, next_w, &dapm->card->widgets, 128 - list) { 129 - if (w->dapm != dapm) 130 - continue; 131 - if (!strcmp(w->name, widget->name)) 127 + w = NULL; 128 + list_for_each_entry(tmp_w, &dapm->card->widgets, list) { 129 + if (tmp_w->dapm == dapm && 130 + !strcmp(tmp_w->name, widget->name)) { 131 + w = tmp_w; 132 132 break; 133 - w = NULL; 133 + } 134 134 } 135 135 if (!w) { 136 136 dev_err(dapm->dev, "%s: widget not found\n",
+3 -3
drivers/staging/greybus/fw-management.c
··· 102 102 } 103 103 104 104 static int fw_mgmt_interface_fw_version_operation(struct fw_mgmt *fw_mgmt, 105 - struct fw_mgmt_ioc_get_intf_version *fw_info) 105 + struct fw_mgmt_ioc_get_intf_version *fw_info) 106 106 { 107 107 struct gb_connection *connection = fw_mgmt->connection; 108 108 struct gb_fw_mgmt_interface_fw_version_response response; ··· 240 240 } 241 241 242 242 static int fw_mgmt_backend_fw_version_operation(struct fw_mgmt *fw_mgmt, 243 - struct fw_mgmt_ioc_get_backend_version *fw_info) 243 + struct fw_mgmt_ioc_get_backend_version *fw_info) 244 244 { 245 245 struct gb_connection *connection = fw_mgmt->connection; 246 246 struct gb_fw_mgmt_backend_fw_version_request request; ··· 473 473 return -EFAULT; 474 474 475 475 ret = fw_mgmt_backend_fw_update_operation(fw_mgmt, 476 - backend_update.firmware_tag); 476 + backend_update.firmware_tag); 477 477 if (ret) 478 478 return ret; 479 479
+1 -1
drivers/staging/greybus/loopback.c
··· 870 870 if (gb->send_count == gb->iteration_max) { 871 871 mutex_unlock(&gb->mutex); 872 872 873 - /* Wait for synchronous and asynchronus completion */ 873 + /* Wait for synchronous and asynchronous completion */ 874 874 gb_loopback_async_wait_all(gb); 875 875 876 876 /* Mark complete unless user-space has poked us */
+2 -2
drivers/staging/octeon/ethernet-rx.c
··· 469 469 if (!(pow_receive_groups & BIT(i))) 470 470 continue; 471 471 472 - netif_napi_add(dev_for_napi, &oct_rx_group[i].napi, 473 - cvm_oct_napi_poll, rx_napi_weight); 472 + netif_napi_add_weight(dev_for_napi, &oct_rx_group[i].napi, 473 + cvm_oct_napi_poll, rx_napi_weight); 474 474 napi_enable(&oct_rx_group[i].napi); 475 475 476 476 oct_rx_group[i].irq = OCTEON_IRQ_WORKQ0 + i;
+2 -5
drivers/staging/olpc_dcon/olpc_dcon.c
··· 383 383 static void dcon_set_source_sync(struct dcon_priv *dcon, int arg) 384 384 { 385 385 dcon_set_source(dcon, arg); 386 - flush_scheduled_work(); 386 + flush_work(&dcon->switch_source); 387 387 } 388 388 389 389 static ssize_t dcon_mode_show(struct device *dev, ··· 517 517 static int dcon_bl_update(struct backlight_device *dev) 518 518 { 519 519 struct dcon_priv *dcon = bl_get_data(dev); 520 - u8 level = dev->props.brightness & 0x0F; 521 - 522 - if (dev->props.power != FB_BLANK_UNBLANK) 523 - level = 0; 520 + u8 level = backlight_get_brightness(dev) & 0x0F; 524 521 525 522 if (level != dcon->bl_val) 526 523 dcon_set_backlight(dcon, level);
+1 -1
drivers/staging/pi433/pi433_if.c
··· 1406 1406 1407 1407 /* 1408 1408 * Claim device numbers. Then register a class 1409 - * that will key udev/mdev to add/remove /dev nodes. Last, register 1409 + * that will key udev/mdev to add/remove /dev nodes. 1410 1410 * Last, register the driver which manages those device numbers. 1411 1411 */ 1412 1412 status = alloc_chrdev_region(&pi433_dev, 0, N_PI433_MINORS, "pi433");
+20 -20
drivers/staging/qlge/qlge_main.c
··· 1976 1976 vlan_id); 1977 1977 } else { 1978 1978 /* Non-TCP/UDP large frames that span multiple buffers 1979 - * can be processed corrrectly by the split frame logic. 1979 + * can be processed correctly by the split frame logic. 1980 1980 */ 1981 1981 qlge_process_mac_split_rx_intr(qdev, rx_ring, ib_mac_rsp, 1982 1982 vlan_id); ··· 2955 2955 void __iomem *doorbell_area = 2956 2956 qdev->doorbell_area + (DB_PAGE_SIZE * (128 + rx_ring->cq_id)); 2957 2957 int err = 0; 2958 - u64 tmp; 2958 + u64 dma; 2959 2959 __le64 *base_indirect_ptr; 2960 2960 int page_entries; 2961 2961 ··· 3004 3004 FLAGS_LI; /* Load irq delay values */ 3005 3005 if (rx_ring->cq_id < qdev->rss_ring_count) { 3006 3006 cqicb->flags |= FLAGS_LL; /* Load lbq values */ 3007 - tmp = (u64)rx_ring->lbq.base_dma; 3007 + dma = (u64)rx_ring->lbq.base_dma; 3008 3008 base_indirect_ptr = rx_ring->lbq.base_indirect; 3009 - page_entries = 0; 3010 - do { 3011 - *base_indirect_ptr = cpu_to_le64(tmp); 3012 - tmp += DB_PAGE_SIZE; 3013 - base_indirect_ptr++; 3014 - page_entries++; 3015 - } while (page_entries < MAX_DB_PAGES_PER_BQ(QLGE_BQ_LEN)); 3009 + 3010 + for (page_entries = 0; 3011 + page_entries < MAX_DB_PAGES_PER_BQ(QLGE_BQ_LEN); 3012 + page_entries++) { 3013 + base_indirect_ptr[page_entries] = cpu_to_le64(dma); 3014 + dma += DB_PAGE_SIZE; 3015 + } 3016 3016 cqicb->lbq_addr = cpu_to_le64(rx_ring->lbq.base_indirect_dma); 3017 3017 cqicb->lbq_buf_size = 3018 3018 cpu_to_le16(QLGE_FIT16(qdev->lbq_buf_size)); ··· 3021 3021 rx_ring->lbq.next_to_clean = 0; 3022 3022 3023 3023 cqicb->flags |= FLAGS_LS; /* Load sbq values */ 3024 - tmp = (u64)rx_ring->sbq.base_dma; 3024 + dma = (u64)rx_ring->sbq.base_dma; 3025 3025 base_indirect_ptr = rx_ring->sbq.base_indirect; 3026 - page_entries = 0; 3027 - do { 3028 - *base_indirect_ptr = cpu_to_le64(tmp); 3029 - tmp += DB_PAGE_SIZE; 3030 - base_indirect_ptr++; 3031 - page_entries++; 3032 - } while (page_entries < MAX_DB_PAGES_PER_BQ(QLGE_BQ_LEN)); 3026 + 3027 + for (page_entries = 0; 3028 + page_entries < MAX_DB_PAGES_PER_BQ(QLGE_BQ_LEN); 3029 + page_entries++) { 3030 + base_indirect_ptr[page_entries] = cpu_to_le64(dma); 3031 + dma += DB_PAGE_SIZE; 3032 + } 3033 3033 cqicb->sbq_addr = 3034 3034 cpu_to_le64(rx_ring->sbq.base_indirect_dma); 3035 3035 cqicb->sbq_buf_size = cpu_to_le16(SMALL_BUFFER_SIZE); ··· 3041 3041 /* Inbound completion handling rx_rings run in 3042 3042 * separate NAPI contexts. 3043 3043 */ 3044 - netif_napi_add(qdev->ndev, &rx_ring->napi, qlge_napi_poll_msix, 3045 - 64); 3044 + netif_napi_add_weight(qdev->ndev, &rx_ring->napi, 3045 + qlge_napi_poll_msix, 64); 3046 3046 cqicb->irq_delay = cpu_to_le16(qdev->rx_coalesce_usecs); 3047 3047 cqicb->pkt_delay = cpu_to_le16(qdev->rx_max_coalesced_frames); 3048 3048 } else {
-1
drivers/staging/r8188eu/Makefile
··· 5 5 hal/HalHWImg8188E_RF.o \ 6 6 hal/HalPhyRf_8188e.o \ 7 7 hal/HalPwrSeqCmd.o \ 8 - hal/Hal8188EPwrSeq.o \ 9 8 hal/Hal8188ERateAdaptive.o \ 10 9 hal/hal_intf.o \ 11 10 hal/hal_com.o \
+11 -12
drivers/staging/r8188eu/core/rtw_ap.c
··· 654 654 set_tx_beacon_cmd(padapter); 655 655 } 656 656 657 - /* 658 - op_mode 659 - Set to 0 (HT pure) under the following conditions 660 - - all STAs in the BSS are 20/40 MHz HT in 20/40 MHz BSS or 661 - - all STAs in the BSS are 20 MHz HT in 20 MHz BSS 662 - Set to 1 (HT non-member protection) if there may be non-HT STAs 663 - in both the primary and the secondary channel 664 - Set to 2 if only HT STAs are associated in BSS, 665 - however and at least one 20 MHz HT STA is associated 666 - Set to 3 (HT mixed mode) when one or more non-HT STAs are associated 667 - (currently non-GF HT station is considered as non-HT STA also) 668 - */ 657 + /* op_mode 658 + * Set to 0 (HT pure) under the following conditions 659 + * - all STAs in the BSS are 20/40 MHz HT in 20/40 MHz BSS or 660 + * - all STAs in the BSS are 20 MHz HT in 20 MHz BSS 661 + * Set to 1 (HT non-member protection) if there may be non-HT STAs 662 + * in both the primary and the secondary channel 663 + * Set to 2 if only HT STAs are associated in BSS, 664 + * however and at least one 20 MHz HT STA is associated 665 + * Set to 3 (HT mixed mode) when one or more non-HT STAs are associated 666 + * (currently non-GF HT station is considered as non-HT STA also) 667 + */ 669 668 static int rtw_ht_operation_update(struct adapter *padapter) 670 669 { 671 670 u16 cur_op_mode, new_op_mode;
+13 -2
drivers/staging/r8188eu/core/rtw_cmd.c
··· 898 898 static void rtl8188e_sreset_xmit_status_check(struct adapter *padapter) 899 899 { 900 900 u32 txdma_status; 901 + int res; 901 902 902 - txdma_status = rtw_read32(padapter, REG_TXDMA_STATUS); 903 + res = rtw_read32(padapter, REG_TXDMA_STATUS, &txdma_status); 904 + if (res) 905 + return; 906 + 903 907 if (txdma_status != 0x00) 904 908 rtw_write32(padapter, REG_TXDMA_STATUS, txdma_status); 905 909 /* total xmit irp = 4 */ ··· 1181 1177 1182 1178 static bool rtw_is_hi_queue_empty(struct adapter *adapter) 1183 1179 { 1184 - return (rtw_read32(adapter, REG_HGQ_INFORMATION) & 0x0000ff00) == 0; 1180 + int res; 1181 + u32 reg; 1182 + 1183 + res = rtw_read32(adapter, REG_HGQ_INFORMATION, &reg); 1184 + if (res) 1185 + return false; 1186 + 1187 + return (reg & 0x0000ff00) == 0; 1185 1188 } 1186 1189 1187 1190 static void rtw_chk_hi_queue_hdl(struct adapter *padapter)
+24 -37
drivers/staging/r8188eu/core/rtw_efuse.c
··· 28 28 u32 value32; 29 29 u8 readbyte; 30 30 u16 retry; 31 + int res; 31 32 32 33 /* Write Address */ 33 34 rtw_write8(Adapter, EFUSE_CTRL + 1, (_offset & 0xff)); 34 - readbyte = rtw_read8(Adapter, EFUSE_CTRL + 2); 35 + res = rtw_read8(Adapter, EFUSE_CTRL + 2, &readbyte); 36 + if (res) 37 + return; 38 + 35 39 rtw_write8(Adapter, EFUSE_CTRL + 2, ((_offset >> 8) & 0x03) | (readbyte & 0xfc)); 36 40 37 41 /* Write bit 32 0 */ 38 - readbyte = rtw_read8(Adapter, EFUSE_CTRL + 3); 42 + res = rtw_read8(Adapter, EFUSE_CTRL + 3, &readbyte); 43 + if (res) 44 + return; 45 + 39 46 rtw_write8(Adapter, EFUSE_CTRL + 3, (readbyte & 0x7f)); 40 47 41 48 /* Check bit 32 read-ready */ 42 - retry = 0; 43 - value32 = rtw_read32(Adapter, EFUSE_CTRL); 44 - while (!(((value32 >> 24) & 0xff) & 0x80) && (retry < 10000)) { 45 - value32 = rtw_read32(Adapter, EFUSE_CTRL); 46 - retry++; 49 + res = rtw_read32(Adapter, EFUSE_CTRL, &value32); 50 + if (res) 51 + return; 52 + 53 + for (retry = 0; retry < 10000; retry++) { 54 + res = rtw_read32(Adapter, EFUSE_CTRL, &value32); 55 + if (res) 56 + continue; 57 + 58 + if (((value32 >> 24) & 0xff) & 0x80) 59 + break; 47 60 } 48 61 49 62 /* 20100205 Joseph: Add delay suggested by SD1 Victor. */ ··· 64 51 /* Designer says that there shall be some delay after ready bit is set, or the */ 65 52 /* result will always stay on last data we read. */ 66 53 udelay(50); 67 - value32 = rtw_read32(Adapter, EFUSE_CTRL); 54 + res = rtw_read32(Adapter, EFUSE_CTRL, &value32); 55 + if (res) 56 + return; 68 57 69 58 *pbuf = (u8)(value32 & 0xff); 70 - } 71 59 72 - /*----------------------------------------------------------------------------- 73 - * Function: EFUSE_ShadowMapUpdate 74 - * 75 - * Overview: Transfer current EFUSE content to shadow init and modify map. 76 - * 77 - * Input: NONE 78 - * 79 - * Output: NONE 80 - * 81 - * Return: NONE 82 - * 83 - * Revised History: 84 - * When Who Remark 85 - * 11/13/2008 MHC Create Version 0. 86 - * 87 - *---------------------------------------------------------------------------*/ 88 - void EFUSE_ShadowMapUpdate(struct adapter *pAdapter) 89 - { 90 - struct eeprom_priv *pEEPROM = &pAdapter->eeprompriv; 91 - 92 - if (pEEPROM->bautoload_fail_flag) { 93 - memset(pEEPROM->efuse_eeprom_data, 0xFF, EFUSE_MAP_LEN_88E); 94 - return; 95 - } 96 - 97 - rtl8188e_EfusePowerSwitch(pAdapter, true); 98 - rtl8188e_ReadEFuse(pAdapter, 0, EFUSE_MAP_LEN_88E, pEEPROM->efuse_eeprom_data); 99 - rtl8188e_EfusePowerSwitch(pAdapter, false); 60 + /* FIXME: return an error to caller */ 100 61 }
+58 -20
drivers/staging/r8188eu/core/rtw_fw.c
··· 44 44 static void fw_download_enable(struct adapter *padapter, bool enable) 45 45 { 46 46 u8 tmp; 47 + int res; 47 48 48 49 if (enable) { 49 50 /* MCU firmware download enable. */ 50 - tmp = rtw_read8(padapter, REG_MCUFWDL); 51 + res = rtw_read8(padapter, REG_MCUFWDL, &tmp); 52 + if (res) 53 + return; 54 + 51 55 rtw_write8(padapter, REG_MCUFWDL, tmp | 0x01); 52 56 53 57 /* 8051 reset */ 54 - tmp = rtw_read8(padapter, REG_MCUFWDL + 2); 58 + res = rtw_read8(padapter, REG_MCUFWDL + 2, &tmp); 59 + if (res) 60 + return; 61 + 55 62 rtw_write8(padapter, REG_MCUFWDL + 2, tmp & 0xf7); 56 63 } else { 57 64 /* MCU firmware download disable. */ 58 - tmp = rtw_read8(padapter, REG_MCUFWDL); 65 + res = rtw_read8(padapter, REG_MCUFWDL, &tmp); 66 + if (res) 67 + return; 68 + 59 69 rtw_write8(padapter, REG_MCUFWDL, tmp & 0xfe); 60 70 61 71 /* Reserved for fw extension. */ ··· 135 125 { 136 126 u8 value8; 137 127 u8 u8Page = (u8)(page & 0x07); 128 + int res; 138 129 139 - value8 = (rtw_read8(padapter, REG_MCUFWDL + 2) & 0xF8) | u8Page; 130 + res = rtw_read8(padapter, REG_MCUFWDL + 2, &value8); 131 + if (res) 132 + return _FAIL; 133 + 134 + value8 = (value8 & 0xF8) | u8Page; 140 135 rtw_write8(padapter, REG_MCUFWDL + 2, value8); 141 136 142 137 return block_write(padapter, buffer, size); ··· 180 165 void rtw_reset_8051(struct adapter *padapter) 181 166 { 182 167 u8 val8; 168 + int res; 183 169 184 - val8 = rtw_read8(padapter, REG_SYS_FUNC_EN + 1); 170 + res = rtw_read8(padapter, REG_SYS_FUNC_EN + 1, &val8); 171 + if (res) 172 + return; 173 + 185 174 rtw_write8(padapter, REG_SYS_FUNC_EN + 1, val8 & (~BIT(2))); 186 175 rtw_write8(padapter, REG_SYS_FUNC_EN + 1, val8 | (BIT(2))); 187 176 } ··· 194 175 { 195 176 u32 counter = 0; 196 177 u32 value32; 178 + int res; 197 179 198 180 /* polling CheckSum report */ 199 181 do { 200 - value32 = rtw_read32(padapter, REG_MCUFWDL); 182 + res = rtw_read32(padapter, REG_MCUFWDL, &value32); 183 + if (res) 184 + continue; 185 + 201 186 if (value32 & FWDL_CHKSUM_RPT) 202 187 break; 203 188 } while (counter++ < POLLING_READY_TIMEOUT_COUNT); ··· 209 186 if (counter >= POLLING_READY_TIMEOUT_COUNT) 210 187 return _FAIL; 211 188 212 - value32 = rtw_read32(padapter, REG_MCUFWDL); 189 + res = rtw_read32(padapter, REG_MCUFWDL, &value32); 190 + if (res) 191 + return _FAIL; 192 + 213 193 value32 |= MCUFWDL_RDY; 214 194 value32 &= ~WINTINI_RDY; 215 195 rtw_write32(padapter, REG_MCUFWDL, value32); ··· 222 196 /* polling for FW ready */ 223 197 counter = 0; 224 198 do { 225 - value32 = rtw_read32(padapter, REG_MCUFWDL); 226 - if (value32 & WINTINI_RDY) 199 + res = rtw_read32(padapter, REG_MCUFWDL, &value32); 200 + if (!res && value32 & WINTINI_RDY) 227 201 return _SUCCESS; 202 + 228 203 udelay(5); 229 204 } while (counter++ < POLLING_READY_TIMEOUT_COUNT); 230 205 ··· 266 239 int rtl8188e_firmware_download(struct adapter *padapter) 267 240 { 268 241 int ret = _SUCCESS; 269 - u8 write_fw_retry = 0; 242 + u8 reg; 270 243 unsigned long fwdl_timeout; 271 244 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); 272 245 struct device *device = dvobj_to_dev(dvobj); ··· 286 259 fwhdr = (struct rt_firmware_hdr *)dvobj->firmware.data; 287 260 288 261 if (IS_FW_HEADER_EXIST(fwhdr)) { 289 - pr_info_once("R8188EU: Firmware Version %d, SubVersion %d, Signature 0x%x\n", 290 - le16_to_cpu(fwhdr->version), fwhdr->subversion, 291 - le16_to_cpu(fwhdr->signature)); 262 + dev_info_once(device, "Firmware Version %d, SubVersion %d, Signature 0x%x\n", 263 + le16_to_cpu(fwhdr->version), fwhdr->subversion, 264 + le16_to_cpu(fwhdr->signature)); 292 265 293 266 fw_data = fw_data + sizeof(struct rt_firmware_hdr); 294 267 fw_size = fw_size - sizeof(struct rt_firmware_hdr); ··· 296 269 297 270 /* Suggested by Filen. If 8051 is running in RAM code, driver should inform Fw to reset by itself, */ 298 271 /* or it will cause download Fw fail. 2010.02.01. by tynli. */ 299 - if (rtw_read8(padapter, REG_MCUFWDL) & RAM_DL_SEL) { /* 8051 RAM code */ 272 + ret = rtw_read8(padapter, REG_MCUFWDL, &reg); 273 + if (ret) { 274 + ret = _FAIL; 275 + goto exit; 276 + } 277 + 278 + if (reg & RAM_DL_SEL) { /* 8051 RAM code */ 300 279 rtw_write8(padapter, REG_MCUFWDL, 0x00); 301 280 rtw_reset_8051(padapter); 302 281 } 303 282 304 283 fw_download_enable(padapter, true); 305 284 fwdl_timeout = jiffies + msecs_to_jiffies(500); 306 - while (1) { 285 + do { 307 286 /* reset the FWDL chksum */ 308 - rtw_write8(padapter, REG_MCUFWDL, rtw_read8(padapter, REG_MCUFWDL) | FWDL_CHKSUM_RPT); 287 + ret = rtw_read8(padapter, REG_MCUFWDL, &reg); 288 + if (ret) { 289 + ret = _FAIL; 290 + continue; 291 + } 292 + 293 + rtw_write8(padapter, REG_MCUFWDL, reg | FWDL_CHKSUM_RPT); 309 294 310 295 ret = write_fw(padapter, fw_data, fw_size); 311 - 312 - if (ret == _SUCCESS || 313 - (time_after(jiffies, fwdl_timeout) && write_fw_retry++ >= 3)) 296 + if (ret == _SUCCESS) 314 297 break; 315 - } 298 + } while (!time_after(jiffies, fwdl_timeout)); 299 + 316 300 fw_download_enable(padapter, false); 317 301 if (ret != _SUCCESS) 318 302 goto exit;
+1
drivers/staging/r8188eu/core/rtw_ieee80211.c
··· 1048 1048 unsigned char *pbuf; 1049 1049 int group_cipher = 0, pairwise_cipher = 0, is8021x = 0; 1050 1050 int ret = _FAIL; 1051 + 1051 1052 pbuf = rtw_get_wpa_ie(&pnetwork->network.IEs[12], &wpa_ielen, pnetwork->network.IELength - 12); 1052 1053 1053 1054 if (pbuf && (wpa_ielen > 0)) {
-1
drivers/staging/r8188eu/core/rtw_ioctl_set.c
··· 71 71 72 72 pibss = padapter->registrypriv.dev_network.MacAddress; 73 73 74 - memset(&pdev_network->Ssid, 0, sizeof(struct ndis_802_11_ssid)); 75 74 memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(struct ndis_802_11_ssid)); 76 75 77 76 rtw_update_registrypriv_dev_network(padapter);
+4 -4
drivers/staging/r8188eu/core/rtw_iol.c
··· 67 67 return false; 68 68 } 69 69 70 - int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, u8 mask) 70 + int rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, u8 mask) 71 71 { 72 72 struct ioreg_cfg cmd = {8, IOREG_CMD_WB_REG, 0x0, 0x0, 0x0}; 73 73 ··· 81 81 return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, cmd.length); 82 82 } 83 83 84 - int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, u16 mask) 84 + int rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, u16 mask) 85 85 { 86 86 struct ioreg_cfg cmd = {8, IOREG_CMD_WW_REG, 0x0, 0x0, 0x0}; 87 87 ··· 95 95 return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, cmd.length); 96 96 } 97 97 98 - int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, u32 mask) 98 + int rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, u32 mask) 99 99 { 100 100 struct ioreg_cfg cmd = {8, IOREG_CMD_WD_REG, 0x0, 0x0, 0x0}; 101 101 ··· 109 109 return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, cmd.length); 110 110 } 111 111 112 - int _rtw_IOL_append_WRF_cmd(struct xmit_frame *xmit_frame, u8 rf_path, u16 addr, u32 value, u32 mask) 112 + int rtw_IOL_append_WRF_cmd(struct xmit_frame *xmit_frame, u8 rf_path, u16 addr, u32 value, u32 mask) 113 113 { 114 114 struct ioreg_cfg cmd = {8, IOREG_CMD_W_RF, 0x0, 0x0, 0x0}; 115 115
+25 -18
drivers/staging/r8188eu/core/rtw_led.c
··· 16 16 (l)->CurrLedState == LED_BLINK_WPS_STOP || \ 17 17 (l)->bLedWPSBlinkInProgress) 18 18 19 - static void ResetLedStatus(struct LED_871x *pLed) 19 + static void ResetLedStatus(struct led_priv *pLed) 20 20 { 21 21 pLed->CurrLedState = RTW_LED_OFF; /* Current LED state. */ 22 22 pLed->bLedOn = false; /* true if LED is ON, false if LED is OFF. */ ··· 32 32 pLed->bLedScanBlinkInProgress = false; 33 33 } 34 34 35 - static void SwLedOn(struct adapter *padapter, struct LED_871x *pLed) 35 + static void SwLedOn(struct adapter *padapter, struct led_priv *pLed) 36 36 { 37 37 u8 LedCfg; 38 + int res; 38 39 39 40 if (padapter->bSurpriseRemoved || padapter->bDriverStopped) 40 41 return; 41 42 42 - LedCfg = rtw_read8(padapter, REG_LEDCFG2); 43 + res = rtw_read8(padapter, REG_LEDCFG2, &LedCfg); 44 + if (res) 45 + return; 46 + 43 47 rtw_write8(padapter, REG_LEDCFG2, (LedCfg & 0xf0) | BIT(5) | BIT(6)); /* SW control led0 on. */ 44 48 pLed->bLedOn = true; 45 49 } 46 50 47 - static void SwLedOff(struct adapter *padapter, struct LED_871x *pLed) 51 + static void SwLedOff(struct adapter *padapter, struct led_priv *pLed) 48 52 { 49 53 u8 LedCfg; 54 + int res; 50 55 51 56 if (padapter->bSurpriseRemoved || padapter->bDriverStopped) 52 57 goto exit; 53 58 54 - LedCfg = rtw_read8(padapter, REG_LEDCFG2);/* 0x4E */ 59 + res = rtw_read8(padapter, REG_LEDCFG2, &LedCfg);/* 0x4E */ 60 + if (res) 61 + goto exit; 55 62 56 63 LedCfg &= 0x90; /* Set to software control. */ 57 64 rtw_write8(padapter, REG_LEDCFG2, (LedCfg | BIT(3))); 58 - LedCfg = rtw_read8(padapter, REG_MAC_PINMUX_CFG); 65 + res = rtw_read8(padapter, REG_MAC_PINMUX_CFG, &LedCfg); 66 + if (res) 67 + goto exit; 68 + 59 69 LedCfg &= 0xFE; 60 70 rtw_write8(padapter, REG_MAC_PINMUX_CFG, LedCfg); 61 71 exit: ··· 75 65 static void blink_work(struct work_struct *work) 76 66 { 77 67 struct delayed_work *dwork = to_delayed_work(work); 78 - struct LED_871x *pLed = container_of(dwork, struct LED_871x, blink_work); 68 + struct led_priv *pLed = container_of(dwork, struct led_priv, blink_work); 79 69 struct adapter *padapter = pLed->padapter; 80 70 struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 81 71 ··· 182 172 void rtl8188eu_InitSwLeds(struct adapter *padapter) 183 173 { 184 174 struct led_priv *pledpriv = &padapter->ledpriv; 185 - struct LED_871x *pLed = &pledpriv->SwLed0; 186 175 187 - pLed->padapter = padapter; 188 - ResetLedStatus(pLed); 189 - INIT_DELAYED_WORK(&pLed->blink_work, blink_work); 176 + pledpriv->padapter = padapter; 177 + ResetLedStatus(pledpriv); 178 + INIT_DELAYED_WORK(&pledpriv->blink_work, blink_work); 190 179 } 191 180 192 181 void rtl8188eu_DeInitSwLeds(struct adapter *padapter) 193 182 { 194 183 struct led_priv *ledpriv = &padapter->ledpriv; 195 - struct LED_871x *pLed = &ledpriv->SwLed0; 196 184 197 - cancel_delayed_work_sync(&pLed->blink_work); 198 - ResetLedStatus(pLed); 199 - SwLedOff(padapter, pLed); 185 + cancel_delayed_work_sync(&ledpriv->blink_work); 186 + ResetLedStatus(ledpriv); 187 + SwLedOff(padapter, ledpriv); 200 188 } 201 189 202 190 void rtw_led_control(struct adapter *padapter, enum LED_CTL_MODE LedAction) 203 191 { 204 - struct led_priv *ledpriv = &padapter->ledpriv; 192 + struct led_priv *pLed = &padapter->ledpriv; 205 193 struct registry_priv *registry_par; 206 - struct LED_871x *pLed = &ledpriv->SwLed0; 207 194 struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 208 195 209 196 if ((padapter->bSurpriseRemoved) || (padapter->bDriverStopped) || 210 197 (!padapter->hw_init_completed)) 211 198 return; 212 199 213 - if (!ledpriv->bRegUseLed) 200 + if (!pLed->bRegUseLed) 214 201 return; 215 202 216 203 registry_par = &padapter->registrypriv;
+2 -4
drivers/staging/r8188eu/core/rtw_mlme.c
··· 676 676 677 677 _clr_fwstate_(pmlmepriv, _FW_UNDER_SURVEY); 678 678 679 - memset(&pdev_network->Ssid, 0, sizeof(struct ndis_802_11_ssid)); 680 679 memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(struct ndis_802_11_ssid)); 681 680 682 681 rtw_update_registrypriv_dev_network(adapter); ··· 1117 1118 1118 1119 /* MACID|OPMODE:1 connect */ 1119 1120 media_status_rpt = (u16)((psta->mac_id << 8) | mstatus); 1120 - SetHwReg8188EU(adapter, HW_VAR_H2C_MEDIA_STATUS_RPT, (u8 *)&media_status_rpt); 1121 + rtl8188e_set_FwMediaStatus_cmd(adapter, media_status_rpt); 1121 1122 } 1122 1123 1123 1124 void rtw_stassoc_event_callback(struct adapter *adapter, u8 *pbuf) ··· 1195 1196 u16 media_status; 1196 1197 media_status = (mac_id << 8) | 0; /* MACID|OPMODE:0 means disconnect */ 1197 1198 /* for STA, AP, ADHOC mode, report disconnect stauts to FW */ 1198 - SetHwReg8188EU(adapter, HW_VAR_H2C_MEDIA_STATUS_RPT, (u8 *)&media_status); 1199 + rtl8188e_set_FwMediaStatus_cmd(adapter, media_status); 1199 1200 } 1200 1201 1201 1202 if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) ··· 1252 1253 1253 1254 memcpy(pdev_network, &tgt_network->network, get_wlan_bssid_ex_sz(&tgt_network->network)); 1254 1255 1255 - memset(&pdev_network->Ssid, 0, sizeof(struct ndis_802_11_ssid)); 1256 1256 memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(struct ndis_802_11_ssid)); 1257 1257 1258 1258 rtw_update_registrypriv_dev_network(adapter);
+358 -106
drivers/staging/r8188eu/core/rtw_mlme_ext.c
··· 428 428 return _SUCCESS; 429 429 } 430 430 431 + static void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe) 432 + { 433 + u8 *pIE; 434 + __le32 *pbuf; 435 + 436 + pIE = pframe + sizeof(struct ieee80211_hdr_3addr); 437 + pbuf = (__le32 *)pIE; 438 + 439 + pmlmeext->TSFValue = le32_to_cpu(*(pbuf + 1)); 440 + 441 + pmlmeext->TSFValue = pmlmeext->TSFValue << 32; 442 + 443 + pmlmeext->TSFValue |= le32_to_cpu(*pbuf); 444 + } 445 + 446 + static void correct_TSF(struct adapter *padapter) 447 + { 448 + u8 reg; 449 + int res; 450 + u64 tsf; 451 + struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; 452 + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; 453 + 454 + tsf = pmlmeext->TSFValue - do_div(pmlmeext->TSFValue, 455 + pmlmeinfo->bcn_interval * 1024) - 1024; /* us */ 456 + 457 + if (((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) || 458 + ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)) 459 + rtw_stop_tx_beacon(padapter); 460 + 461 + /* disable related TSF function */ 462 + res = rtw_read8(padapter, REG_BCN_CTRL, &reg); 463 + if (res) 464 + return; 465 + 466 + rtw_write8(padapter, REG_BCN_CTRL, reg & (~BIT(3))); 467 + 468 + rtw_write32(padapter, REG_TSFTR, tsf); 469 + rtw_write32(padapter, REG_TSFTR + 4, tsf >> 32); 470 + 471 + /* enable related TSF function */ 472 + res = rtw_read8(padapter, REG_BCN_CTRL, &reg); 473 + if (res) 474 + return; 475 + 476 + rtw_write8(padapter, REG_BCN_CTRL, reg | BIT(3)); 477 + 478 + if (((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) || 479 + ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)) 480 + rtw_resume_tx_beacon(padapter); 481 + } 482 + 431 483 /**************************************************************************** 432 484 433 485 Following are the callback functions for each subtype of the management frames ··· 634 582 pmlmeinfo->assoc_AP_vendor = check_assoc_AP(pframe + sizeof(struct ieee80211_hdr_3addr), len - sizeof(struct ieee80211_hdr_3addr)); 635 583 636 584 /* update TSF Value */ 637 - update_TSF(pmlmeext, pframe, len); 585 + update_TSF(pmlmeext, pframe); 638 586 639 587 /* start auth */ 640 588 start_clnt_auth(padapter); ··· 677 625 } 678 626 679 627 /* update TSF Value */ 680 - update_TSF(pmlmeext, pframe, len); 628 + update_TSF(pmlmeext, pframe); 681 629 682 630 /* report sta add event */ 683 631 report_add_sta_event(padapter, GetAddr2Ptr(pframe), cam_idx); ··· 5415 5363 return ret; 5416 5364 } 5417 5365 5418 - void issue_action_BA(struct adapter *padapter, unsigned char *raddr, unsigned char action, unsigned short status) 5366 + void issue_action_BA(struct adapter *padapter, unsigned char *raddr, u8 action, u16 status) 5419 5367 { 5420 - u8 category = WLAN_CATEGORY_BACK; 5421 5368 u16 start_seq; 5422 - u16 BA_para_set; 5423 - u16 reason_code; 5424 - u16 BA_timeout_value; 5425 - __le16 le_tmp; 5426 5369 u16 BA_starting_seqctrl = 0; 5427 5370 struct xmit_frame *pmgntframe; 5428 5371 struct pkt_attrib *pattrib; 5429 - u8 *pframe; 5430 - struct ieee80211_hdr *pwlanhdr; 5431 - __le16 *fctrl; 5432 5372 struct xmit_priv *pxmitpriv = &padapter->xmitpriv; 5433 5373 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; 5434 5374 struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; 5435 5375 struct sta_info *psta; 5436 5376 struct sta_priv *pstapriv = &padapter->stapriv; 5437 5377 struct registry_priv *pregpriv = &padapter->registrypriv; 5378 + struct ieee80211_mgmt *mgmt; 5379 + u16 capab, params; 5438 5380 5439 5381 pmgntframe = alloc_mgtxmitframe(pxmitpriv); 5440 5382 if (!pmgntframe) ··· 5440 5394 5441 5395 memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); 5442 5396 5443 - pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; 5444 - pwlanhdr = (struct ieee80211_hdr *)pframe; 5397 + mgmt = (struct ieee80211_mgmt *)(pmgntframe->buf_addr + TXDESC_OFFSET); 5445 5398 5446 - fctrl = &pwlanhdr->frame_control; 5447 - *(fctrl) = 0; 5399 + mgmt->frame_control = cpu_to_le16(IEEE80211_STYPE_ACTION | IEEE80211_FTYPE_MGMT); 5448 5400 5449 - /* memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); */ 5450 - memcpy(pwlanhdr->addr1, raddr, ETH_ALEN); 5451 - memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); 5452 - memcpy(pwlanhdr->addr3, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); 5401 + memcpy(mgmt->da, raddr, ETH_ALEN); 5402 + memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN); 5403 + memcpy(mgmt->bssid, get_my_bssid(&pmlmeinfo->network), ETH_ALEN); 5453 5404 5454 - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); 5405 + mgmt->seq_ctrl = cpu_to_le16(pmlmeext->mgnt_seq); 5455 5406 pmlmeext->mgnt_seq++; 5456 - SetFrameSubType(pframe, WIFI_ACTION); 5457 5407 5458 - pframe += sizeof(struct ieee80211_hdr_3addr); 5459 - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); 5408 + mgmt->u.action.category = WLAN_CATEGORY_BACK; 5460 5409 5461 - pframe = rtw_set_fixed_ie(pframe, 1, &(category), &pattrib->pktlen); 5462 - pframe = rtw_set_fixed_ie(pframe, 1, &(action), &pattrib->pktlen); 5410 + switch (action) { 5411 + case WLAN_ACTION_ADDBA_REQ: 5412 + mgmt->u.action.u.addba_req.action_code = WLAN_ACTION_ADDBA_REQ; 5413 + do { 5414 + pmlmeinfo->dialogToken++; 5415 + } while (pmlmeinfo->dialogToken == 0); 5416 + mgmt->u.action.u.addba_req.dialog_token = pmlmeinfo->dialogToken; 5463 5417 5464 - if (category == 3) { 5465 - switch (action) { 5466 - case 0: /* ADDBA req */ 5467 - do { 5468 - pmlmeinfo->dialogToken++; 5469 - } while (pmlmeinfo->dialogToken == 0); 5470 - pframe = rtw_set_fixed_ie(pframe, 1, &pmlmeinfo->dialogToken, &pattrib->pktlen); 5418 + /* immediate ack & 64 buffer size */ 5419 + capab = u16_encode_bits(64, IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK); 5420 + capab |= u16_encode_bits(1, IEEE80211_ADDBA_PARAM_POLICY_MASK); 5421 + capab |= u16_encode_bits(status, IEEE80211_ADDBA_PARAM_TID_MASK); 5422 + mgmt->u.action.u.addba_req.capab = cpu_to_le16(capab); 5471 5423 5472 - BA_para_set = (0x1002 | ((status & 0xf) << 2)); /* immediate ack & 64 buffer size */ 5473 - le_tmp = cpu_to_le16(BA_para_set); 5474 - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&le_tmp, &pattrib->pktlen); 5424 + mgmt->u.action.u.addba_req.timeout = cpu_to_le16(5000); /* 5 ms */ 5475 5425 5476 - BA_timeout_value = 5000;/* 5ms */ 5477 - le_tmp = cpu_to_le16(BA_timeout_value); 5478 - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&le_tmp, &pattrib->pktlen); 5426 + psta = rtw_get_stainfo(pstapriv, raddr); 5427 + if (psta) { 5428 + start_seq = (psta->sta_xmitpriv.txseq_tid[status & 0x07] & 0xfff) + 1; 5479 5429 5480 - psta = rtw_get_stainfo(pstapriv, raddr); 5481 - if (psta) { 5482 - start_seq = (psta->sta_xmitpriv.txseq_tid[status & 0x07] & 0xfff) + 1; 5430 + psta->BA_starting_seqctrl[status & 0x07] = start_seq; 5483 5431 5484 - psta->BA_starting_seqctrl[status & 0x07] = start_seq; 5485 - 5486 - BA_starting_seqctrl = start_seq << 4; 5487 - } 5488 - le_tmp = cpu_to_le16(BA_starting_seqctrl); 5489 - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&le_tmp, &pattrib->pktlen); 5490 - break; 5491 - case 1: /* ADDBA rsp */ 5492 - pframe = rtw_set_fixed_ie(pframe, 1, &pmlmeinfo->ADDBA_req.dialog_token, &pattrib->pktlen); 5493 - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&status, &pattrib->pktlen); 5494 - BA_para_set = le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f; 5495 - BA_para_set |= 0x1000; /* 64 buffer size */ 5496 - 5497 - if (pregpriv->ampdu_amsdu == 0)/* disabled */ 5498 - BA_para_set = BA_para_set & ~BIT(0); 5499 - else if (pregpriv->ampdu_amsdu == 1)/* enabled */ 5500 - BA_para_set = BA_para_set | BIT(0); 5501 - le_tmp = cpu_to_le16(BA_para_set); 5502 - 5503 - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&le_tmp, &pattrib->pktlen); 5504 - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&pmlmeinfo->ADDBA_req.BA_timeout_value, &pattrib->pktlen); 5505 - break; 5506 - case 2:/* DELBA */ 5507 - BA_para_set = (status & 0x1F) << 3; 5508 - le_tmp = cpu_to_le16(BA_para_set); 5509 - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&le_tmp, &pattrib->pktlen); 5510 - 5511 - reason_code = 37;/* Requested from peer STA as it does not want to use the mechanism */ 5512 - le_tmp = cpu_to_le16(reason_code); 5513 - pframe = rtw_set_fixed_ie(pframe, 2, (unsigned char *)&le_tmp, &pattrib->pktlen); 5514 - break; 5515 - default: 5516 - break; 5432 + BA_starting_seqctrl = start_seq << 4; 5517 5433 } 5434 + mgmt->u.action.u.addba_req.start_seq_num = cpu_to_le16(BA_starting_seqctrl); 5435 + 5436 + pattrib->pktlen = offsetofend(struct ieee80211_mgmt, 5437 + u.action.u.addba_req.start_seq_num); 5438 + break; 5439 + case WLAN_ACTION_ADDBA_RESP: 5440 + mgmt->u.action.u.addba_resp.action_code = WLAN_ACTION_ADDBA_RESP; 5441 + mgmt->u.action.u.addba_resp.dialog_token = pmlmeinfo->ADDBA_req.dialog_token; 5442 + mgmt->u.action.u.addba_resp.status = cpu_to_le16(status); 5443 + capab = le16_to_cpu(pmlmeinfo->ADDBA_req.BA_para_set) & 0x3f; 5444 + capab |= u16_encode_bits(64, IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK); 5445 + capab |= u16_encode_bits(pregpriv->ampdu_amsdu, IEEE80211_ADDBA_PARAM_AMSDU_MASK); 5446 + mgmt->u.action.u.addba_req.capab = cpu_to_le16(capab); 5447 + mgmt->u.action.u.addba_resp.timeout = pmlmeinfo->ADDBA_req.BA_timeout_value; 5448 + pattrib->pktlen = offsetofend(struct ieee80211_mgmt, u.action.u.addba_resp.timeout); 5449 + break; 5450 + case WLAN_ACTION_DELBA: 5451 + mgmt->u.action.u.delba.action_code = WLAN_ACTION_DELBA; 5452 + mgmt->u.action.u.delba.params = cpu_to_le16((status & 0x1F) << 3); 5453 + params = u16_encode_bits((status & 0x1), IEEE80211_DELBA_PARAM_INITIATOR_MASK); 5454 + params |= u16_encode_bits((status >> 1) & 0xF, IEEE80211_DELBA_PARAM_TID_MASK); 5455 + mgmt->u.action.u.delba.params = cpu_to_le16(params); 5456 + mgmt->u.action.u.delba.reason_code = cpu_to_le16(WLAN_STATUS_REQUEST_DECLINED); 5457 + pattrib->pktlen = offsetofend(struct ieee80211_mgmt, u.action.u.delba.reason_code); 5458 + break; 5459 + default: 5460 + break; 5518 5461 } 5519 5462 5520 5463 pattrib->last_txcmdsz = pattrib->pktlen; ··· 5658 5623 if (initiator == 0) { /* recipient */ 5659 5624 for (tid = 0; tid < MAXTID; tid++) { 5660 5625 if (psta->recvreorder_ctrl[tid].enable) { 5661 - issue_action_BA(padapter, addr, RTW_WLAN_ACTION_DELBA, (((tid << 1) | initiator) & 0x1F)); 5626 + issue_action_BA(padapter, addr, WLAN_ACTION_DELBA, (((tid << 1) | initiator) & 0x1F)); 5662 5627 psta->recvreorder_ctrl[tid].enable = false; 5663 5628 psta->recvreorder_ctrl[tid].indicate_seq = 0xffff; 5664 5629 } ··· 5666 5631 } else if (initiator == 1) { /* originator */ 5667 5632 for (tid = 0; tid < MAXTID; tid++) { 5668 5633 if (psta->htpriv.agg_enable_bitmap & BIT(tid)) { 5669 - issue_action_BA(padapter, addr, RTW_WLAN_ACTION_DELBA, (((tid << 1) | initiator) & 0x1F)); 5634 + issue_action_BA(padapter, addr, WLAN_ACTION_DELBA, (((tid << 1) | initiator) & 0x1F)); 5670 5635 psta->htpriv.agg_enable_bitmap &= ~BIT(tid); 5671 5636 psta->htpriv.candidate_tid_bitmap &= ~BIT(tid); 5672 5637 } ··· 5702 5667 5703 5668 bool get_beacon_valid_bit(struct adapter *adapter) 5704 5669 { 5670 + int res; 5671 + u8 reg; 5672 + 5673 + res = rtw_read8(adapter, REG_TDECTRL + 2, &reg); 5674 + if (res) 5675 + return false; 5676 + 5705 5677 /* BIT(16) of REG_TDECTRL = BIT(0) of REG_TDECTRL+2 */ 5706 - return BIT(0) & rtw_read8(adapter, REG_TDECTRL + 2); 5678 + return BIT(0) & reg; 5707 5679 } 5708 5680 5709 5681 void clear_beacon_valid_bit(struct adapter *adapter) 5710 5682 { 5683 + int res; 5684 + u8 reg; 5685 + 5686 + res = rtw_read8(adapter, REG_TDECTRL + 2, &reg); 5687 + if (res) 5688 + return; 5689 + 5711 5690 /* BIT(16) of REG_TDECTRL = BIT(0) of REG_TDECTRL+2, write 1 to clear, Clear by sw */ 5712 - rtw_write8(adapter, REG_TDECTRL + 2, rtw_read8(adapter, REG_TDECTRL + 2) | BIT(0)); 5691 + rtw_write8(adapter, REG_TDECTRL + 2, reg | BIT(0)); 5692 + } 5693 + 5694 + void rtw_resume_tx_beacon(struct adapter *adapt) 5695 + { 5696 + struct hal_data_8188e *haldata = &adapt->haldata; 5697 + 5698 + /* 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value */ 5699 + /* which should be read from register to a global variable. */ 5700 + 5701 + rtw_write8(adapt, REG_FWHW_TXQ_CTRL + 2, (haldata->RegFwHwTxQCtrl) | BIT(6)); 5702 + haldata->RegFwHwTxQCtrl |= BIT(6); 5703 + rtw_write8(adapt, REG_TBTT_PROHIBIT + 1, 0xff); 5704 + haldata->RegReg542 |= BIT(0); 5705 + rtw_write8(adapt, REG_TBTT_PROHIBIT + 2, haldata->RegReg542); 5706 + } 5707 + 5708 + void rtw_stop_tx_beacon(struct adapter *adapt) 5709 + { 5710 + struct hal_data_8188e *haldata = &adapt->haldata; 5711 + 5712 + /* 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value */ 5713 + /* which should be read from register to a global variable. */ 5714 + 5715 + rtw_write8(adapt, REG_FWHW_TXQ_CTRL + 2, (haldata->RegFwHwTxQCtrl) & (~BIT(6))); 5716 + haldata->RegFwHwTxQCtrl &= (~BIT(6)); 5717 + rtw_write8(adapt, REG_TBTT_PROHIBIT + 1, 0x64); 5718 + haldata->RegReg542 &= ~(BIT(0)); 5719 + rtw_write8(adapt, REG_TBTT_PROHIBIT + 2, haldata->RegReg542); 5720 + 5721 + /* todo: CheckFwRsvdPageContent(Adapter); 2010.06.23. Added by tynli. */ 5722 + } 5723 + 5724 + static void rtw_set_opmode(struct adapter *adapter, u8 mode) 5725 + { 5726 + u8 val8; 5727 + int res; 5728 + 5729 + /* disable Port0 TSF update */ 5730 + res = rtw_read8(adapter, REG_BCN_CTRL, &val8); 5731 + if (res) 5732 + return; 5733 + 5734 + rtw_write8(adapter, REG_BCN_CTRL, val8 | BIT(4)); 5735 + 5736 + /* set net_type */ 5737 + res = rtw_read8(adapter, MSR, &val8); 5738 + if (res) 5739 + return; 5740 + 5741 + val8 &= 0x0c; 5742 + val8 |= mode; 5743 + rtw_write8(adapter, MSR, val8); 5744 + 5745 + if ((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_)) { 5746 + rtw_stop_tx_beacon(adapter); 5747 + 5748 + rtw_write8(adapter, REG_BCN_CTRL, 0x19);/* disable atim wnd */ 5749 + } else if (mode == _HW_STATE_ADHOC_) { 5750 + rtw_resume_tx_beacon(adapter); 5751 + rtw_write8(adapter, REG_BCN_CTRL, 0x1a); 5752 + } else if (mode == _HW_STATE_AP_) { 5753 + rtw_resume_tx_beacon(adapter); 5754 + 5755 + rtw_write8(adapter, REG_BCN_CTRL, 0x12); 5756 + 5757 + /* Set RCR */ 5758 + rtw_write32(adapter, REG_RCR, 0x7000208e);/* CBSSID_DATA must set to 0,reject ICV_ERR packet */ 5759 + /* enable to rx data frame */ 5760 + rtw_write16(adapter, REG_RXFLTMAP2, 0xFFFF); 5761 + /* enable to rx ps-poll */ 5762 + rtw_write16(adapter, REG_RXFLTMAP1, 0x0400); 5763 + 5764 + /* Beacon Control related register for first time */ 5765 + rtw_write8(adapter, REG_BCNDMATIM, 0x02); /* 2ms */ 5766 + 5767 + rtw_write8(adapter, REG_ATIMWND, 0x0a); /* 10ms */ 5768 + rtw_write16(adapter, REG_BCNTCFG, 0x00); 5769 + rtw_write16(adapter, REG_TBTT_PROHIBIT, 0xff04); 5770 + rtw_write16(adapter, REG_TSFTR_SYN_OFFSET, 0x7fff);/* +32767 (~32ms) */ 5771 + 5772 + /* reset TSF */ 5773 + rtw_write8(adapter, REG_DUAL_TSF_RST, BIT(0)); 5774 + 5775 + /* BIT(3) - If set 0, hw will clr bcnq when tx becon ok/fail or port 0 */ 5776 + res = rtw_read8(adapter, REG_MBID_NUM, &val8); 5777 + if (res) 5778 + return; 5779 + 5780 + rtw_write8(adapter, REG_MBID_NUM, val8 | BIT(3) | BIT(4)); 5781 + 5782 + /* enable BCN0 Function for if1 */ 5783 + /* don't enable update TSF0 for if1 (due to TSF update when beacon/probe rsp are received) */ 5784 + rtw_write8(adapter, REG_BCN_CTRL, (DIS_TSF_UDT0_NORMAL_CHIP | EN_BCN_FUNCTION | BIT(1))); 5785 + 5786 + /* dis BCN1 ATIM WND if if2 is station */ 5787 + res = rtw_read8(adapter, REG_BCN_CTRL_1, &val8); 5788 + if (res) 5789 + return; 5790 + 5791 + rtw_write8(adapter, REG_BCN_CTRL_1, val8 | BIT(0)); 5792 + } 5713 5793 } 5714 5794 5715 5795 /**************************************************************************** ··· 5848 5698 } 5849 5699 } 5850 5700 5701 + void rtw_mlme_under_site_survey(struct adapter *adapter) 5702 + { 5703 + /* config RCR to receive different BSSID & not to receive data frame */ 5704 + 5705 + int res; 5706 + u8 reg; 5707 + u32 v; 5708 + 5709 + res = rtw_read32(adapter, REG_RCR, &v); 5710 + if (res) 5711 + return; 5712 + 5713 + v &= ~(RCR_CBSSID_BCN); 5714 + rtw_write32(adapter, REG_RCR, v); 5715 + /* reject all data frame */ 5716 + rtw_write16(adapter, REG_RXFLTMAP2, 0x00); 5717 + 5718 + /* disable update TSF */ 5719 + res = rtw_read8(adapter, REG_BCN_CTRL, &reg); 5720 + if (res) 5721 + return; 5722 + 5723 + rtw_write8(adapter, REG_BCN_CTRL, reg | BIT(4)); 5724 + } 5725 + 5726 + void rtw_mlme_site_survey_done(struct adapter *adapter) 5727 + { 5728 + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; 5729 + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; 5730 + u32 reg32; 5731 + int res; 5732 + u8 reg; 5733 + 5734 + if ((is_client_associated_to_ap(adapter)) || 5735 + ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE)) { 5736 + /* enable to rx data frame */ 5737 + rtw_write16(adapter, REG_RXFLTMAP2, 0xFFFF); 5738 + 5739 + /* enable update TSF */ 5740 + res = rtw_read8(adapter, REG_BCN_CTRL, &reg); 5741 + if (res) 5742 + return; 5743 + 5744 + rtw_write8(adapter, REG_BCN_CTRL, reg & (~BIT(4))); 5745 + } else if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) { 5746 + rtw_write16(adapter, REG_RXFLTMAP2, 0xFFFF); 5747 + /* enable update TSF */ 5748 + res = rtw_read8(adapter, REG_BCN_CTRL, &reg); 5749 + if (res) 5750 + return; 5751 + 5752 + rtw_write8(adapter, REG_BCN_CTRL, reg & (~BIT(4))); 5753 + } 5754 + 5755 + res = rtw_read32(adapter, REG_RCR, &reg32); 5756 + if (res) 5757 + return; 5758 + 5759 + rtw_write32(adapter, REG_RCR, reg32 | RCR_CBSSID_BCN); 5760 + } 5761 + 5851 5762 void site_survey(struct adapter *padapter) 5852 5763 { 5853 - unsigned char survey_channel = 0, val8; 5764 + unsigned char survey_channel = 0; 5854 5765 enum rt_scan_type ScanType = SCAN_PASSIVE; 5855 5766 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; 5856 5767 struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; ··· 6035 5824 if (is_client_associated_to_ap(padapter)) 6036 5825 issue_nulldata(padapter, NULL, 0, 3, 500); 6037 5826 6038 - val8 = 0; /* survey done */ 6039 - SetHwReg8188EU(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); 5827 + rtw_mlme_site_survey_done(padapter); 6040 5828 6041 5829 report_surveydone_event(padapter); 6042 5830 ··· 6212 6002 static void mlme_join(struct adapter *adapter, int type) 6213 6003 { 6214 6004 struct mlme_priv *mlmepriv = &adapter->mlmepriv; 6215 - u8 retry_limit = 0x30; 6005 + u8 retry_limit = 0x30, reg; 6006 + u32 reg32; 6007 + int res; 6216 6008 6217 6009 switch (type) { 6218 6010 case 0: ··· 6222 6010 /* enable to rx data frame, accept all data frame */ 6223 6011 rtw_write16(adapter, REG_RXFLTMAP2, 0xFFFF); 6224 6012 6013 + res = rtw_read32(adapter, REG_RCR, &reg32); 6014 + if (res) 6015 + return; 6016 + 6225 6017 rtw_write32(adapter, REG_RCR, 6226 - rtw_read32(adapter, REG_RCR) | RCR_CBSSID_DATA | RCR_CBSSID_BCN); 6018 + reg32 | RCR_CBSSID_DATA | RCR_CBSSID_BCN); 6227 6019 6228 6020 if (check_fwstate(mlmepriv, WIFI_STATION_STATE)) { 6229 6021 retry_limit = 48; ··· 6243 6027 case 2: 6244 6028 /* sta add event call back */ 6245 6029 /* enable update TSF */ 6246 - rtw_write8(adapter, REG_BCN_CTRL, rtw_read8(adapter, REG_BCN_CTRL) & (~BIT(4))); 6030 + res = rtw_read8(adapter, REG_BCN_CTRL, &reg); 6031 + if (res) 6032 + return; 6033 + 6034 + rtw_write8(adapter, REG_BCN_CTRL, reg & (~BIT(4))); 6247 6035 6248 6036 if (check_fwstate(mlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE)) 6249 6037 retry_limit = 0x7; ··· 6404 6184 set_link_timer(pmlmeext, REASSOC_TO); 6405 6185 } 6406 6186 6407 - unsigned int receive_disconnect(struct adapter *padapter, unsigned char *MacAddr, unsigned short reason) 6187 + void receive_disconnect(struct adapter *padapter, unsigned char *MacAddr, unsigned short reason) 6408 6188 { 6409 6189 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; 6410 6190 struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; 6411 6191 6412 6192 /* check A3 */ 6413 6193 if (!(!memcmp(MacAddr, get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) 6414 - return _SUCCESS; 6194 + return; 6415 6195 6416 6196 if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) { 6417 6197 if (pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) { ··· 6422 6202 report_join_res(padapter, -2); 6423 6203 } 6424 6204 } 6425 - return _SUCCESS; 6426 6205 } 6427 6206 6428 6207 static void process_80211d(struct adapter *padapter, struct wlan_bssid_ex *bssid) ··· 6859 6640 psta->state = _FW_LINKED; 6860 6641 } 6861 6642 6643 + static void rtw_reset_dm_func_flag(struct adapter *adapter) 6644 + { 6645 + struct hal_data_8188e *haldata = &adapter->haldata; 6646 + struct dm_priv *dmpriv = &haldata->dmpriv; 6647 + struct odm_dm_struct *odmpriv = &haldata->odmpriv; 6648 + 6649 + odmpriv->SupportAbility = dmpriv->InitODMFlag; 6650 + } 6651 + 6652 + static void rtw_clear_dm_func_flag(struct adapter *adapter) 6653 + { 6654 + struct hal_data_8188e *haldata = &adapter->haldata; 6655 + struct odm_dm_struct *odmpriv = &haldata->odmpriv; 6656 + 6657 + odmpriv->SupportAbility = 0; 6658 + } 6659 + 6862 6660 void mlmeext_joinbss_event_callback(struct adapter *padapter, int join_res) 6863 6661 { 6864 6662 struct sta_info *psta, *psta_bmc; ··· 6906 6670 } 6907 6671 6908 6672 /* turn on dynamic functions */ 6909 - SetHwReg8188EU(padapter, HW_VAR_DM_FUNC_RESET, NULL); 6673 + rtw_reset_dm_func_flag(padapter); 6910 6674 6911 6675 /* update IOT-releated issue */ 6912 6676 update_IOT_info(padapter); 6913 6677 6914 - SetHwReg8188EU(padapter, HW_VAR_BASIC_RATE, cur_network->SupportedRates); 6678 + rtw_set_basic_rate(padapter, cur_network->SupportedRates); 6915 6679 6916 6680 /* BCN interval */ 6917 6681 rtw_write16(padapter, REG_BCN_INTERVAL, pmlmeinfo->bcn_interval); ··· 6938 6702 rtw_set_max_rpt_macid(padapter, psta->mac_id); 6939 6703 6940 6704 media_status = (psta->mac_id << 8) | 1; /* MACID|OPMODE: 1 means connect */ 6941 - SetHwReg8188EU(padapter, HW_VAR_H2C_MEDIA_STATUS_RPT, (u8 *)&media_status); 6705 + rtl8188e_set_FwMediaStatus_cmd(padapter, media_status); 6942 6706 } 6943 6707 6944 6708 mlme_join(padapter, 2); 6945 6709 6946 6710 if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE) { 6947 6711 /* correcting TSF */ 6948 - correct_TSF(padapter, pmlmeext); 6712 + correct_TSF(padapter); 6949 6713 } 6950 6714 rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_CONNECT, 0); 6951 6715 } ··· 6960 6724 /* nothing to do */ 6961 6725 } else { /* adhoc client */ 6962 6726 /* correcting TSF */ 6963 - correct_TSF(padapter, pmlmeext); 6727 + correct_TSF(padapter); 6964 6728 6965 6729 /* start beacon */ 6966 6730 if (send_beacon(padapter) == _FAIL) { ··· 6984 6748 6985 6749 static void mlme_disconnect(struct adapter *adapter) 6986 6750 { 6751 + int res; 6752 + u8 reg; 6753 + 6987 6754 /* Set RCR to not to receive data frame when NO LINK state */ 6988 6755 /* reject all data frames */ 6989 6756 rtw_write16(adapter, REG_RXFLTMAP2, 0x00); ··· 6995 6756 rtw_write8(adapter, REG_DUAL_TSF_RST, (BIT(0) | BIT(1))); 6996 6757 6997 6758 /* disable update TSF */ 6998 - rtw_write8(adapter, REG_BCN_CTRL, rtw_read8(adapter, REG_BCN_CTRL) | BIT(4)); 6759 + 6760 + res = rtw_read8(adapter, REG_BCN_CTRL, &reg); 6761 + if (res) 6762 + return; 6763 + 6764 + rtw_write8(adapter, REG_BCN_CTRL, reg | BIT(4)); 6999 6765 } 7000 6766 7001 6767 void mlmeext_sta_del_event_callback(struct adapter *padapter) ··· 7054 6810 return ret; 7055 6811 } 7056 6812 7057 - static void rtl8188e_sreset_linked_status_check(struct adapter *padapter) 6813 + static int rtl8188e_sreset_linked_status_check(struct adapter *padapter) 7058 6814 { 7059 - u32 rx_dma_status = rtw_read32(padapter, REG_RXDMA_STATUS); 6815 + u32 rx_dma_status; 6816 + int res; 6817 + u8 reg; 6818 + 6819 + res = rtw_read32(padapter, REG_RXDMA_STATUS, &rx_dma_status); 6820 + if (res) 6821 + return res; 7060 6822 7061 6823 if (rx_dma_status != 0x00) 7062 6824 rtw_write32(padapter, REG_RXDMA_STATUS, rx_dma_status); 7063 6825 7064 - rtw_read8(padapter, REG_FMETHR); 6826 + return rtw_read8(padapter, REG_FMETHR, &reg); 7065 6827 } 7066 6828 7067 6829 void linked_status_chk(struct adapter *padapter) ··· 7295 7045 type = _HW_STATE_NOLINK_; 7296 7046 } 7297 7047 7298 - SetHwReg8188EU(padapter, HW_VAR_SET_OPMODE, (u8 *)(&type)); 7048 + rtw_set_opmode(padapter, type); 7299 7049 7300 7050 return H2C_SUCCESS; 7301 7051 } ··· 7331 7081 7332 7082 /* disable dynamic functions, such as high power, DIG */ 7333 7083 Save_DM_Func_Flag(padapter); 7334 - SetHwReg8188EU(padapter, HW_VAR_DM_FUNC_CLR, NULL); 7084 + rtw_clear_dm_func_flag(padapter); 7335 7085 7336 7086 /* cancel link timer */ 7337 7087 _cancel_timer_ex(&pmlmeext->link_timer); ··· 7339 7089 /* clear CAM */ 7340 7090 flush_all_cam_entry(padapter); 7341 7091 7342 - memcpy(pnetwork, pbuf, FIELD_OFFSET(struct wlan_bssid_ex, IELength)); 7092 + memcpy(pnetwork, pbuf, offsetof(struct wlan_bssid_ex, IELength)); 7343 7093 pnetwork->IELength = ((struct wlan_bssid_ex *)pbuf)->IELength; 7344 7094 7345 7095 if (pnetwork->IELength > MAX_IE_SZ)/* Check pbuf->IELength */ ··· 7396 7146 pmlmeinfo->candidate_tid_bitmap = 0; 7397 7147 pmlmeinfo->bwmode_updated = false; 7398 7148 7399 - memcpy(pnetwork, pbuf, FIELD_OFFSET(struct wlan_bssid_ex, IELength)); 7149 + memcpy(pnetwork, pbuf, offsetof(struct wlan_bssid_ex, IELength)); 7400 7150 pnetwork->IELength = ((struct wlan_bssid_ex *)pbuf)->IELength; 7401 7151 7402 7152 if (pnetwork->IELength > MAX_IE_SZ)/* Check pbuf->IELength */ ··· 7469 7219 struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; 7470 7220 struct wlan_bssid_ex *pnetwork = (struct wlan_bssid_ex *)(&pmlmeinfo->network); 7471 7221 u8 val8; 7222 + int res; 7472 7223 7473 7224 if (is_client_associated_to_ap(padapter)) 7474 7225 issue_deauth_ex(padapter, pnetwork->MacAddress, WLAN_REASON_DEAUTH_LEAVING, param->deauth_timeout_ms / 100, 100); ··· 7482 7231 7483 7232 if (((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)) { 7484 7233 /* Stop BCN */ 7485 - val8 = rtw_read8(padapter, REG_BCN_CTRL); 7234 + res = rtw_read8(padapter, REG_BCN_CTRL, &val8); 7235 + if (res) 7236 + return H2C_DROPPED; 7237 + 7486 7238 rtw_write8(padapter, REG_BCN_CTRL, val8 & (~(EN_BCN_FUNCTION | EN_TXBCN_RPT))); 7487 7239 } 7488 7240 ··· 7556 7302 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; 7557 7303 struct sitesurvey_parm *pparm = (struct sitesurvey_parm *)pbuf; 7558 7304 u8 bdelayscan = false; 7559 - u8 val8; 7560 7305 u32 i; 7561 7306 struct wifidirect_info *pwdinfo = &padapter->wdinfo; 7562 7307 ··· 7600 7347 if ((pmlmeext->sitesurvey_res.state == SCAN_START) || (pmlmeext->sitesurvey_res.state == SCAN_TXNULL)) { 7601 7348 /* disable dynamic functions, such as high power, DIG */ 7602 7349 Save_DM_Func_Flag(padapter); 7603 - SetHwReg8188EU(padapter, HW_VAR_DM_FUNC_CLR, NULL); 7350 + rtw_clear_dm_func_flag(padapter); 7604 7351 7605 7352 /* config the initial gain under scanning, need to write the BB registers */ 7606 7353 if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) ··· 7612 7359 /* set MSR to no link state */ 7613 7360 Set_MSR(padapter, _HW_STATE_NOLINK_); 7614 7361 7615 - val8 = 1; /* under site survey */ 7616 - SetHwReg8188EU(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); 7362 + rtw_mlme_under_site_survey(padapter); 7617 7363 7618 7364 pmlmeext->sitesurvey_res.state = SCAN_PROCESS; 7619 7365 } ··· 7727 7475 7728 7476 if (((pmlmeinfo->state & WIFI_FW_ASSOC_SUCCESS) && (pmlmeinfo->HT_enable)) || 7729 7477 ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)) { 7730 - issue_action_BA(padapter, pparm->addr, RTW_WLAN_ACTION_ADDBA_REQ, (u16)pparm->tid); 7478 + issue_action_BA(padapter, pparm->addr, WLAN_ACTION_ADDBA_REQ, (u16)pparm->tid); 7731 7479 _set_timer(&psta->addba_retry_timer, ADDBA_TO); 7732 7480 } else { 7733 7481 psta->htpriv.candidate_tid_bitmap &= ~BIT(pparm->tid);
+5 -8
drivers/staging/r8188eu/core/rtw_p2p.c
··· 1450 1450 static void pre_tx_invitereq_handler(struct adapter *padapter) 1451 1451 { 1452 1452 struct wifidirect_info *pwdinfo = &padapter->wdinfo; 1453 - u8 val8 = 1; 1454 1453 1455 1454 set_channel_bwmode(padapter, pwdinfo->invitereq_info.peer_ch, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); 1456 - SetHwReg8188EU(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); 1455 + rtw_mlme_under_site_survey(padapter); 1457 1456 issue_probereq_p2p(padapter, NULL); 1458 1457 _set_timer(&pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT); 1459 1458 ··· 1461 1462 static void pre_tx_provdisc_handler(struct adapter *padapter) 1462 1463 { 1463 1464 struct wifidirect_info *pwdinfo = &padapter->wdinfo; 1464 - u8 val8 = 1; 1465 1465 1466 1466 set_channel_bwmode(padapter, pwdinfo->tx_prov_disc_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); 1467 - SetHwReg8188EU(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); 1467 + rtw_mlme_under_site_survey(padapter); 1468 1468 issue_probereq_p2p(padapter, NULL); 1469 1469 _set_timer(&pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT); 1470 1470 ··· 1472 1474 static void pre_tx_negoreq_handler(struct adapter *padapter) 1473 1475 { 1474 1476 struct wifidirect_info *pwdinfo = &padapter->wdinfo; 1475 - u8 val8 = 1; 1476 1477 1477 1478 set_channel_bwmode(padapter, pwdinfo->nego_req_info.peer_channel_num[0], HAL_PRIME_CHNL_OFFSET_DONT_CARE, HT_CHANNEL_WIDTH_20); 1478 - SetHwReg8188EU(padapter, HW_VAR_MLME_SITESURVEY, (u8 *)(&val8)); 1479 + rtw_mlme_under_site_survey(padapter); 1479 1480 issue_probereq_p2p(padapter, NULL); 1480 1481 _set_timer(&pwdinfo->pre_tx_scan_timer, P2P_TX_PRESCAN_TIMEOUT); 1481 1482 ··· 1888 1891 1889 1892 if (role == P2P_ROLE_DEVICE || role == P2P_ROLE_CLIENT || role == P2P_ROLE_GO) { 1890 1893 /* leave IPS/Autosuspend */ 1891 - if (rtw_pwr_wakeup(padapter) == _FAIL) { 1894 + if (rtw_pwr_wakeup(padapter)) { 1892 1895 ret = _FAIL; 1893 1896 goto exit; 1894 1897 } ··· 1902 1905 init_wifidirect_info(padapter, role); 1903 1906 1904 1907 } else if (role == P2P_ROLE_DISABLE) { 1905 - if (rtw_pwr_wakeup(padapter) == _FAIL) { 1908 + if (rtw_pwr_wakeup(padapter)) { 1906 1909 ret = _FAIL; 1907 1910 goto exit; 1908 1911 }
+16 -9
drivers/staging/r8188eu/core/rtw_pwrctrl.c
··· 229 229 230 230 static bool lps_rf_on(struct adapter *adapter) 231 231 { 232 + int res; 233 + u32 reg; 234 + 232 235 /* When we halt NIC, we should check if FW LPS is leave. */ 233 236 if (adapter->pwrctrlpriv.rf_pwrstate == rf_off) { 234 237 /* If it is in HW/SW Radio OFF or IPS state, we do not check Fw LPS Leave, */ ··· 239 236 return true; 240 237 } 241 238 242 - if (rtw_read32(adapter, REG_RCR) & 0x00070000) 239 + res = rtw_read32(adapter, REG_RCR, &reg); 240 + if (res) 241 + return false; 242 + 243 + if (reg & 0x00070000) 243 244 return false; 244 245 245 246 return true; ··· 273 266 err = -1; 274 267 break; 275 268 } 276 - rtw_usleep_os(100); 269 + msleep(1); 277 270 } 278 271 279 272 return err; ··· 381 374 struct mlme_priv *pmlmepriv = &padapter->mlmepriv; 382 375 unsigned long timeout = jiffies + msecs_to_jiffies(3000); 383 376 unsigned long deny_time; 384 - int ret = _SUCCESS; 377 + int ret; 385 378 386 379 while (pwrpriv->ps_processing && time_before(jiffies, timeout)) 387 380 msleep(10); 388 381 389 382 /* I think this should be check in IPS, LPS, autosuspend functions... */ 390 - if (check_fwstate(pmlmepriv, _FW_LINKED)) { 391 - ret = _SUCCESS; 383 + /* Below goto is a success path taken for already linked devices */ 384 + ret = 0; 385 + if (check_fwstate(pmlmepriv, _FW_LINKED)) 392 386 goto exit; 393 - } 394 387 395 388 if (pwrpriv->rf_pwrstate == rf_off && ips_leave(padapter) == _FAIL) { 396 - ret = _FAIL; 389 + ret = -ENOMEM; 397 390 goto exit; 398 391 } 399 392 400 393 if (padapter->bDriverStopped || !padapter->bup || !padapter->hw_init_completed) { 401 - ret = _FAIL; 394 + ret = -EBUSY; 402 395 goto exit; 403 396 } 404 397 ··· 439 432 return 0; 440 433 } else if (mode == IPS_NONE) { 441 434 rtw_ips_mode_req(pwrctrlpriv, mode); 442 - if ((padapter->bSurpriseRemoved == 0) && (rtw_pwr_wakeup(padapter) == _FAIL)) 435 + if ((padapter->bSurpriseRemoved == 0) && rtw_pwr_wakeup(padapter)) 443 436 return -EFAULT; 444 437 } else { 445 438 return -EINVAL;
+33 -47
drivers/staging/r8188eu/core/rtw_recv.c
··· 17 17 18 18 /* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */ 19 19 static u8 rtw_bridge_tunnel_header[] = { 20 - 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 20 + 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 21 21 }; 22 22 23 23 static u8 rtw_rfc1042_header[] = { 24 - 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 24 + 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 25 25 }; 26 26 27 - void rtw_signal_stat_timer_hdl(struct timer_list *); 27 + static void rtw_signal_stat_timer_hdl(struct timer_list *t); 28 28 29 29 void _rtw_init_sta_recv_priv(struct sta_recv_priv *psta_recvpriv) 30 30 { ··· 62 62 goto exit; 63 63 } 64 64 65 - precvpriv->precv_frame_buf = (u8 *)N_BYTE_ALIGMENT((size_t)(precvpriv->pallocated_frame_buf), RXFRAME_ALIGN_SZ); 65 + precvpriv->precv_frame_buf = (u8 *)ALIGN((size_t)(precvpriv->pallocated_frame_buf), RXFRAME_ALIGN_SZ); 66 66 67 67 precvframe = (struct recv_frame *)precvpriv->precv_frame_buf; 68 68 ··· 166 166 167 167 list_add_tail(&precvframe->list, get_list_head(pfree_recv_queue)); 168 168 169 - if (padapter) { 170 - if (pfree_recv_queue == &precvpriv->free_recv_queue) 171 - precvpriv->free_recvframe_cnt++; 172 - } 169 + if (padapter && (pfree_recv_queue == &precvpriv->free_recv_queue)) 170 + precvpriv->free_recvframe_cnt++; 173 171 174 172 spin_unlock_bh(&pfree_recv_queue->lock); 175 173 ··· 202 204 } 203 205 204 206 /* 205 - caller : defrag ; recvframe_chk_defrag in recv_thread (passive) 206 - pframequeue: defrag_queue : will be accessed in recv_thread (passive) 207 - 208 - using spinlock to protect 209 - 210 - */ 207 + * caller : defrag ; recvframe_chk_defrag in recv_thread (passive) 208 + * pframequeue: defrag_queue : will be accessed in recv_thread (passive) 209 + * 210 + * using spinlock to protect 211 + * 212 + */ 211 213 212 214 void rtw_free_recvframe_queue(struct __queue *pframequeue, struct __queue *pfree_recv_queue) 213 215 { ··· 235 237 { 236 238 u32 cnt = 0; 237 239 struct recv_frame *pending_frame; 240 + 238 241 while ((pending_frame = rtw_alloc_recvframe(&adapter->recvpriv.uc_swdec_pending_queue))) { 239 242 rtw_free_recvframe(pending_frame, &adapter->recvpriv.free_recv_queue); 240 243 cnt++; ··· 326 327 327 328 if (prxattrib->encrypt > 0) { 328 329 u8 *iv = precv_frame->rx_data + prxattrib->hdrlen; 330 + 329 331 prxattrib->key_index = (((iv[3]) >> 6) & 0x3); 330 332 331 333 if (prxattrib->key_index > WEP_KEYS) { ··· 452 452 return _SUCCESS; 453 453 } 454 454 455 - void process_pwrbit_data(struct adapter *padapter, struct recv_frame *precv_frame); 456 - void process_pwrbit_data(struct adapter *padapter, struct recv_frame *precv_frame) 455 + static void process_pwrbit_data(struct adapter *padapter, struct recv_frame *precv_frame) 457 456 { 458 457 unsigned char pwrbit; 459 458 u8 *ptr = precv_frame->rx_data; ··· 556 557 } 557 558 } 558 559 559 - int sta2sta_data_frame( 560 - struct adapter *adapter, 561 - struct recv_frame *precv_frame, 562 - struct sta_info **psta 563 - ); 564 - 565 - int sta2sta_data_frame(struct adapter *adapter, struct recv_frame *precv_frame, struct sta_info **psta) 560 + static int sta2sta_data_frame(struct adapter *adapter, 561 + struct recv_frame *precv_frame, struct sta_info **psta) 566 562 { 567 - u8 *ptr = precv_frame->rx_data; 568 563 int ret = _SUCCESS; 569 564 struct rx_pkt_attrib *pattrib = &precv_frame->attrib; 570 565 struct sta_priv *pstapriv = &adapter->stapriv; ··· 613 620 sta_addr = pattrib->src; 614 621 } 615 622 } else if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) { 616 - memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN); 617 - memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN); 618 - memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN); 619 - memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); 620 - memcpy(pattrib->ta, pattrib->src, ETH_ALEN); 621 - 622 623 sta_addr = mybssid; 623 624 } else { 624 625 ret = _FAIL; ··· 637 650 struct sta_info **psta) 638 651 { 639 652 u8 *ptr = precv_frame->rx_data; 653 + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)precv_frame->rx_data; 640 654 struct rx_pkt_attrib *pattrib = &precv_frame->attrib; 641 655 int ret = _SUCCESS; 642 656 struct sta_priv *pstapriv = &adapter->stapriv; ··· 682 694 goto exit; 683 695 } 684 696 685 - /* if ((GetFrameSubType(ptr) & WIFI_QOS_DATA_TYPE) == WIFI_QOS_DATA_TYPE) { */ 686 - /* */ 687 - 688 - if (GetFrameSubType(ptr) & BIT(6)) { 689 - /* No data, will not indicate to upper layer, temporily count it here */ 697 + if (ieee80211_is_nullfunc(hdr->frame_control)) { 698 + /* We count the nullfunc frame, but we'll not pass it on to higher layers. */ 690 699 count_rx_stats(adapter, precv_frame, *psta); 691 700 ret = RTW_RX_HANDLED; 692 701 goto exit; 693 702 } 694 703 } else if (check_fwstate(pmlmepriv, WIFI_MP_STATE) && 695 704 check_fwstate(pmlmepriv, _FW_LINKED)) { 696 - memcpy(pattrib->dst, GetAddr1Ptr(ptr), ETH_ALEN); 697 705 memcpy(pattrib->src, GetAddr2Ptr(ptr), ETH_ALEN); 698 - memcpy(pattrib->bssid, GetAddr3Ptr(ptr), ETH_ALEN); 699 - memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); 700 - memcpy(pattrib->ta, pattrib->src, ETH_ALEN); 701 706 702 - /* */ 703 707 memcpy(pattrib->bssid, mybssid, ETH_ALEN); 704 708 705 709 *psta = rtw_get_stainfo(pstapriv, pattrib->bssid); /* get sta_info */ ··· 758 778 } 759 779 } else { 760 780 u8 *myhwaddr = myid(&adapter->eeprompriv); 781 + 761 782 if (memcmp(pattrib->ra, myhwaddr, ETH_ALEN)) { 762 783 ret = RTW_RX_HANDLED; 763 784 goto exit; ··· 1004 1023 1005 1024 if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS) { 1006 1025 int ch_set_idx = rtw_ch_set_search_ch(pmlmeext->channel_set, rtw_get_oper_ch(adapter)); 1026 + 1007 1027 if (ch_set_idx >= 0) 1008 1028 pmlmeext->channel_set[ch_set_idx].rx_count++; 1009 1029 } ··· 1032 1050 retval = validate_recv_data_frame(adapter, precv_frame); 1033 1051 if (retval == _FAIL) { 1034 1052 struct recv_priv *precvpriv = &adapter->recvpriv; 1053 + 1035 1054 precvpriv->rx_drop++; 1036 1055 } 1037 1056 } ··· 1296 1313 struct rx_pkt_attrib *pattrib; 1297 1314 unsigned char *data_ptr; 1298 1315 struct sk_buff *sub_skb, *subframes[MAX_SUBFRAME_COUNT]; 1316 + 1299 1317 struct recv_priv *precvpriv = &padapter->recvpriv; 1300 1318 struct __queue *pfree_recv_queue = &precvpriv->free_recv_queue; 1301 1319 int ret = _SUCCESS; 1320 + 1302 1321 nr_subframes = 0; 1303 1322 1304 1323 pattrib = &prframe->attrib; ··· 1351 1366 a_len -= nSubframe_Length; 1352 1367 if (a_len != 0) { 1353 1368 padding_len = 4 - ((nSubframe_Length + ETH_HLEN) & (4 - 1)); 1354 - if (padding_len == 4) { 1369 + if (padding_len == 4) 1355 1370 padding_len = 0; 1356 - } 1357 1371 1358 - if (a_len < padding_len) { 1372 + if (a_len < padding_len) 1359 1373 goto exit; 1360 - } 1374 + 1361 1375 pdata += padding_len; 1362 1376 a_len -= padding_len; 1363 1377 } ··· 1731 1747 !psecuritypriv->busetkipkey) { 1732 1748 rtw_enqueue_recvframe(rframe, &padapter->recvpriv.uc_swdec_pending_queue); 1733 1749 if (recvpriv->free_recvframe_cnt < NR_RECVFRAME / 4) { 1734 - /* to prevent from recvframe starvation, 1750 + /* 1751 + * to prevent from recvframe starvation, 1735 1752 * get recvframe from uc_swdec_pending_queue to 1736 - * free_recvframe_cnt */ 1753 + * free_recvframe_cnt 1754 + */ 1737 1755 rframe = rtw_alloc_recvframe(&padapter->recvpriv.uc_swdec_pending_queue); 1738 1756 if (rframe) 1739 1757 goto do_posthandle; ··· 1773 1787 return ret; 1774 1788 } 1775 1789 1776 - void rtw_signal_stat_timer_hdl(struct timer_list *t) 1790 + static void rtw_signal_stat_timer_hdl(struct timer_list *t) 1777 1791 { 1778 1792 struct adapter *adapter = from_timer(adapter, t, recvpriv.signal_stat_timer); 1779 1793 struct recv_priv *recvpriv = &adapter->recvpriv;
+115 -30
drivers/staging/r8188eu/core/rtw_wlan_util.c
··· 264 264 265 265 void Save_DM_Func_Flag(struct adapter *padapter) 266 266 { 267 - u8 saveflag = true; 267 + struct hal_data_8188e *haldata = &padapter->haldata; 268 + struct odm_dm_struct *odmpriv = &haldata->odmpriv; 268 269 269 - SetHwReg8188EU(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&saveflag)); 270 + odmpriv->BK_SupportAbility = odmpriv->SupportAbility; 270 271 } 271 272 272 273 void Restore_DM_Func_Flag(struct adapter *padapter) 273 274 { 274 - u8 saveflag = false; 275 + struct hal_data_8188e *haldata = &padapter->haldata; 276 + struct odm_dm_struct *odmpriv = &haldata->odmpriv; 275 277 276 - SetHwReg8188EU(padapter, HW_VAR_DM_FUNC_OP, (u8 *)(&saveflag)); 278 + odmpriv->SupportAbility = odmpriv->BK_SupportAbility; 277 279 } 278 280 279 281 void Set_MSR(struct adapter *padapter, u8 type) 280 282 { 281 283 u8 val8; 284 + int res; 282 285 283 - val8 = rtw_read8(padapter, MSR) & 0x0c; 286 + res = rtw_read8(padapter, MSR, &val8); 287 + if (res) 288 + return; 289 + 290 + val8 &= 0x0c; 284 291 val8 |= type; 285 292 rtw_write8(padapter, MSR, val8); 286 293 } ··· 512 505 513 506 static void set_acm_ctrl(struct adapter *adapter, u8 acm_mask) 514 507 { 515 - u8 acmctrl = rtw_read8(adapter, REG_ACMHWCTRL); 508 + u8 acmctrl; 509 + int res = rtw_read8(adapter, REG_ACMHWCTRL, &acmctrl); 510 + 511 + if (res) 512 + return; 516 513 517 514 if (acm_mask > 1) 518 515 acmctrl = acmctrl | 0x1; ··· 776 765 static void set_min_ampdu_spacing(struct adapter *adapter, u8 spacing) 777 766 { 778 767 u8 sec_spacing; 768 + int res; 779 769 780 770 if (spacing <= 7) { 781 771 switch (adapter->securitypriv.dot11PrivacyAlgrthm) { ··· 798 786 if (spacing < sec_spacing) 799 787 spacing = sec_spacing; 800 788 789 + res = rtw_read8(adapter, REG_AMPDU_MIN_SPACE, &sec_spacing); 790 + if (res) 791 + return; 792 + 801 793 rtw_write8(adapter, REG_AMPDU_MIN_SPACE, 802 - (rtw_read8(adapter, REG_AMPDU_MIN_SPACE) & 0xf8) | spacing); 794 + (sec_spacing & 0xf8) | spacing); 795 + } 796 + } 797 + 798 + static void set_ampdu_factor(struct adapter *adapter, u8 factor) 799 + { 800 + u8 RegToSet_Normal[4] = {0x41, 0xa8, 0x72, 0xb9}; 801 + u8 FactorToSet; 802 + u8 *pRegToSet; 803 + u8 index = 0; 804 + 805 + pRegToSet = RegToSet_Normal; /* 0xb972a841; */ 806 + FactorToSet = factor; 807 + if (FactorToSet <= 3) { 808 + FactorToSet = (1 << (FactorToSet + 2)); 809 + if (FactorToSet > 0xf) 810 + FactorToSet = 0xf; 811 + 812 + for (index = 0; index < 4; index++) { 813 + if ((pRegToSet[index] & 0xf0) > (FactorToSet << 4)) 814 + pRegToSet[index] = (pRegToSet[index] & 0x0f) | (FactorToSet << 4); 815 + 816 + if ((pRegToSet[index] & 0x0f) > FactorToSet) 817 + pRegToSet[index] = (pRegToSet[index] & 0xf0) | (FactorToSet); 818 + 819 + rtw_write8(adapter, (REG_AGGLEN_LMT + index), pRegToSet[index]); 820 + } 803 821 } 804 822 } 805 823 ··· 859 817 860 818 set_min_ampdu_spacing(padapter, min_MPDU_spacing); 861 819 862 - SetHwReg8188EU(padapter, HW_VAR_AMPDU_FACTOR, (u8 *)(&max_AMPDU_len)); 820 + set_ampdu_factor(padapter, max_AMPDU_len); 863 821 } 864 822 865 823 void ERP_IE_handler(struct adapter *padapter, struct ndis_802_11_var_ie *pIE) ··· 1267 1225 enable_rate_adaptive(padapter, psta->mac_id); 1268 1226 } 1269 1227 1228 + void rtw_set_basic_rate(struct adapter *adapter, u8 *rates) 1229 + { 1230 + u16 BrateCfg = 0; 1231 + u8 RateIndex = 0; 1232 + int res; 1233 + u8 reg; 1234 + 1235 + /* 2007.01.16, by Emily */ 1236 + /* Select RRSR (in Legacy-OFDM and CCK) */ 1237 + /* For 8190, we select only 24M, 12M, 6M, 11M, 5.5M, 2M, and 1M from the Basic rate. */ 1238 + /* We do not use other rates. */ 1239 + HalSetBrateCfg(adapter, rates, &BrateCfg); 1240 + 1241 + /* 2011.03.30 add by Luke Lee */ 1242 + /* CCK 2M ACK should be disabled for some BCM and Atheros AP IOT */ 1243 + /* because CCK 2M has poor TXEVM */ 1244 + /* CCK 5.5M & 11M ACK should be enabled for better performance */ 1245 + 1246 + BrateCfg = (BrateCfg | 0xd) & 0x15d; 1247 + 1248 + BrateCfg |= 0x01; /* default enable 1M ACK rate */ 1249 + /* Set RRSR rate table. */ 1250 + rtw_write8(adapter, REG_RRSR, BrateCfg & 0xff); 1251 + rtw_write8(adapter, REG_RRSR + 1, (BrateCfg >> 8) & 0xff); 1252 + res = rtw_read8(adapter, REG_RRSR + 2, &reg); 1253 + if (res) 1254 + return; 1255 + 1256 + rtw_write8(adapter, REG_RRSR + 2, reg & 0xf0); 1257 + 1258 + /* Set RTS initial rate */ 1259 + while (BrateCfg > 0x1) { 1260 + BrateCfg = (BrateCfg >> 1); 1261 + RateIndex++; 1262 + } 1263 + /* Ziv - Check */ 1264 + rtw_write8(adapter, REG_INIRTS_RATE_SEL, RateIndex); 1265 + } 1266 + 1270 1267 /* Update RRSR and Rate for USERATE */ 1271 1268 void update_tx_basic_rate(struct adapter *padapter, u8 wirelessmode) 1272 1269 { ··· 1331 1250 else 1332 1251 update_mgnt_tx_rate(padapter, IEEE80211_OFDM_RATE_6MB); 1333 1252 1334 - SetHwReg8188EU(padapter, HW_VAR_BASIC_RATE, supported_rates); 1253 + rtw_set_basic_rate(padapter, supported_rates); 1335 1254 } 1336 1255 1337 1256 unsigned char check_assoc_AP(u8 *pframe, uint len) ··· 1429 1348 rtw_write8(adapter, REG_RRSR + 2, val8); 1430 1349 }; 1431 1350 1351 + static void set_slot_time(struct adapter *adapter, u8 slot_time) 1352 + { 1353 + u8 u1bAIFS, aSifsTime; 1354 + struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; 1355 + struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; 1356 + 1357 + rtw_write8(adapter, REG_SLOT, slot_time); 1358 + 1359 + if (pmlmeinfo->WMM_enable == 0) { 1360 + if (pmlmeext->cur_wireless_mode == WIRELESS_11B) 1361 + aSifsTime = 10; 1362 + else 1363 + aSifsTime = 16; 1364 + 1365 + u1bAIFS = aSifsTime + (2 * pmlmeinfo->slotTime); 1366 + 1367 + /* <Roger_EXP> Temporary removed, 2008.06.20. */ 1368 + rtw_write8(adapter, REG_EDCA_VO_PARAM, u1bAIFS); 1369 + rtw_write8(adapter, REG_EDCA_VI_PARAM, u1bAIFS); 1370 + rtw_write8(adapter, REG_EDCA_BE_PARAM, u1bAIFS); 1371 + rtw_write8(adapter, REG_EDCA_BK_PARAM, u1bAIFS); 1372 + } 1373 + } 1374 + 1432 1375 void update_capinfo(struct adapter *Adapter, u16 updateCap) 1433 1376 { 1434 1377 struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; ··· 1491 1386 } 1492 1387 } 1493 1388 1494 - SetHwReg8188EU(Adapter, HW_VAR_SLOT_TIME, &pmlmeinfo->slotTime); 1389 + set_slot_time(Adapter, pmlmeinfo->slotTime); 1495 1390 } 1496 1391 1497 1392 void update_wireless_mode(struct adapter *padapter) ··· 1569 1464 memcpy((pmlmeinfo->FW_sta_info[cam_idx].SupportedRates + supportRateNum), pIE->data, ie_len); 1570 1465 1571 1466 return _SUCCESS; 1572 - } 1573 - 1574 - void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len) 1575 - { 1576 - u8 *pIE; 1577 - __le32 *pbuf; 1578 - 1579 - pIE = pframe + sizeof(struct ieee80211_hdr_3addr); 1580 - pbuf = (__le32 *)pIE; 1581 - 1582 - pmlmeext->TSFValue = le32_to_cpu(*(pbuf + 1)); 1583 - 1584 - pmlmeext->TSFValue = pmlmeext->TSFValue << 32; 1585 - 1586 - pmlmeext->TSFValue |= le32_to_cpu(*pbuf); 1587 - } 1588 - 1589 - void correct_TSF(struct adapter *padapter, struct mlme_ext_priv *pmlmeext) 1590 - { 1591 - SetHwReg8188EU(padapter, HW_VAR_CORRECT_TSF, NULL); 1592 1467 } 1593 1468 1594 1469 void beacon_timing_control(struct adapter *padapter)
+14 -20
drivers/staging/r8188eu/core/rtw_xmit.c
··· 16 16 17 17 static void _init_txservq(struct tx_servq *ptxservq) 18 18 { 19 - 20 19 INIT_LIST_HEAD(&ptxservq->tx_pending); 21 20 rtw_init_queue(&ptxservq->sta_pending); 22 21 ptxservq->qcnt = 0; 23 - 24 22 } 25 23 26 24 void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv) 27 25 { 28 - 29 26 memset((unsigned char *)psta_xmitpriv, 0, sizeof(struct sta_xmit_priv)); 30 27 spin_lock_init(&psta_xmitpriv->lock); 31 28 _init_txservq(&psta_xmitpriv->be_q); ··· 31 34 _init_txservq(&psta_xmitpriv->vo_q); 32 35 INIT_LIST_HEAD(&psta_xmitpriv->legacy_dz); 33 36 INIT_LIST_HEAD(&psta_xmitpriv->apsd); 34 - 35 37 } 36 38 37 39 s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, struct adapter *padapter) ··· 74 78 res = _FAIL; 75 79 goto exit; 76 80 } 77 - pxmitpriv->pxmit_frame_buf = (u8 *)N_BYTE_ALIGMENT((size_t)(pxmitpriv->pallocated_frame_buf), 4); 81 + pxmitpriv->pxmit_frame_buf = (u8 *)ALIGN((size_t)(pxmitpriv->pallocated_frame_buf), 4); 78 82 /* pxmitpriv->pxmit_frame_buf = pxmitpriv->pallocated_frame_buf + 4 - */ 79 83 /* ((size_t) (pxmitpriv->pallocated_frame_buf) &3); */ 80 84 ··· 111 115 goto exit; 112 116 } 113 117 114 - pxmitpriv->pxmitbuf = (u8 *)N_BYTE_ALIGMENT((size_t)(pxmitpriv->pallocated_xmitbuf), 4); 118 + pxmitpriv->pxmitbuf = (u8 *)ALIGN((size_t)(pxmitpriv->pallocated_xmitbuf), 4); 115 119 /* pxmitpriv->pxmitbuf = pxmitpriv->pallocated_xmitbuf + 4 - */ 116 120 /* ((size_t) (pxmitpriv->pallocated_xmitbuf) &3); */ 117 121 ··· 151 155 goto exit; 152 156 } 153 157 154 - pxmitpriv->pxmit_extbuf = (u8 *)N_BYTE_ALIGMENT((size_t)(pxmitpriv->pallocated_xmit_extbuf), 4); 158 + pxmitpriv->pxmit_extbuf = (u8 *)ALIGN((size_t)(pxmitpriv->pallocated_xmit_extbuf), 4); 155 159 156 160 pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf; 157 161 ··· 295 299 /* check HT op mode */ 296 300 if (pattrib->ht_en) { 297 301 u8 htopmode = pmlmeinfo->HT_protection; 302 + 298 303 if ((pmlmeext->cur_bwmode && (htopmode == 2 || htopmode == 3)) || 299 304 (!pmlmeext->cur_bwmode && htopmode == 3)) { 300 305 pattrib->vcs_mode = RTS_CTS; ··· 442 445 443 446 pattrib->pktlen = pktfile.pkt_len; 444 447 445 - if (ETH_P_IP == pattrib->ether_type) { 448 + if (pattrib->ether_type == ETH_P_IP) { 446 449 /* The following is for DHCP and ARP packet, we use cck1M to tx these packets and let LPS awake some time */ 447 450 /* to prevent DHCP protocol fail */ 448 451 u8 tmp[24]; 452 + 449 453 _rtw_pktfile_read(&pktfile, &tmp[0], 24); 450 454 pattrib->dhcp_pkt = 0; 451 455 if (pktfile.pkt_len > 282) {/* MINIMUM_DHCP_PACKET_SIZE) { */ ··· 625 627 if (pframe[1] & 2) /* From Ds == 1 */ 626 628 rtw_secmicappend(&micdata, &pframe[24], 6); 627 629 else 628 - rtw_secmicappend(&micdata, &pframe[10], 6); 630 + rtw_secmicappend(&micdata, &pframe[10], 6); 629 631 } else { /* ToDS == 0 */ 630 632 rtw_secmicappend(&micdata, &pframe[4], 6); /* DA */ 631 633 if (pframe[1] & 2) /* From Ds == 1 */ ··· 951 953 mpdu_len -= llc_sz; 952 954 } 953 955 954 - if ((pattrib->icv_len > 0) && (pattrib->bswenc)) { 956 + if ((pattrib->icv_len > 0) && (pattrib->bswenc)) 955 957 mpdu_len -= pattrib->icv_len; 956 - } 957 958 958 959 if (bmcst) { 959 - /* don't do fragment to broadcat/multicast packets */ 960 + /* don't do fragment to broadcast/multicast packets */ 960 961 mem_sz = _rtw_pktfile_read(&pktfile, pframe, pattrib->pktlen); 961 962 } else { 962 963 mem_sz = _rtw_pktfile_read(&pktfile, pframe, mpdu_len); ··· 1065 1068 } 1066 1069 break; 1067 1070 } 1068 - 1069 1071 } 1070 1072 1071 1073 void rtw_count_tx_stats(struct adapter *padapter, struct xmit_frame *pxmitframe, int sz) ··· 1311 1315 rtw_free_xmitframe(pxmitpriv, pxmitframe); 1312 1316 } 1313 1317 spin_unlock_bh(&pframequeue->lock); 1314 - 1315 1318 } 1316 1319 1317 1320 s32 rtw_xmitframe_enqueue(struct adapter *padapter, struct xmit_frame *pxmitframe) ··· 1500 1505 1501 1506 for (i = 0; i < entry; i++, phwxmit++) 1502 1507 phwxmit->accnt = 0; 1503 - 1504 1508 } 1505 1509 1506 1510 static int rtw_br_client_tx(struct adapter *padapter, struct sk_buff **pskb) ··· 1726 1732 bool bmcst = is_multicast_ether_addr(pattrib->ra); 1727 1733 1728 1734 if (!check_fwstate(pmlmepriv, WIFI_AP_STATE)) 1729 - return ret; 1735 + return ret; 1730 1736 1731 1737 if (pattrib->psta) 1732 1738 psta = pattrib->psta; ··· 1754 1760 1755 1761 pstapriv->tim_bitmap |= BIT(0);/* */ 1756 1762 pstapriv->sta_dz_bitmap |= BIT(0); 1757 - 1758 - update_beacon(padapter, _TIM_IE_, NULL, false);/* tx bc/mc packets after upate bcn */ 1763 + /* tx bc/mc packets after update bcn */ 1764 + update_beacon(padapter, _TIM_IE_, NULL, false); 1759 1765 1760 1766 ret = true; 1761 1767 } ··· 1805 1811 pstapriv->tim_bitmap |= BIT(psta->aid); 1806 1812 1807 1813 if (psta->sleepq_len == 1) { 1808 - /* upate BCN for TIM IE */ 1814 + /* update BCN for TIM IE */ 1809 1815 update_beacon(padapter, _TIM_IE_, NULL, false); 1810 1816 } 1811 1817 } ··· 2074 2080 if ((psta->sleepq_ac_len == 0) && (!psta->has_legacy_ac) && (wmmps_ac)) { 2075 2081 pstapriv->tim_bitmap &= ~BIT(psta->aid); 2076 2082 2077 - /* upate BCN for TIM IE */ 2083 + /* update BCN for TIM IE */ 2078 2084 update_beacon(padapter, _TIM_IE_, NULL, false); 2079 2085 } 2080 2086 }
-45
drivers/staging/r8188eu/hal/Hal8188EPwrSeq.c
··· 1 - // SPDX-License-Identifier: GPL-2.0 2 - /* Copyright(c) 2007 - 2011 Realtek Corporation. */ 3 - 4 - #include "../include/Hal8188EPwrSeq.h" 5 - #include "../include/rtl8188e_hal.h" 6 - 7 - struct wl_pwr_cfg rtl8188E_power_on_flow[] = { 8 - { 0x0006, PWR_CMD_POLLING, BIT(1), BIT(1) }, 9 - { 0x0002, PWR_CMD_WRITE, BIT(0) | BIT(1), 0 }, /* reset BB */ 10 - { 0x0026, PWR_CMD_WRITE, BIT(7), BIT(7) }, /* schmitt trigger */ 11 - { 0x0005, PWR_CMD_WRITE, BIT(7), 0 }, /* disable HWPDN (control by DRV)*/ 12 - { 0x0005, PWR_CMD_WRITE, BIT(4) | BIT(3), 0 }, /* disable WL suspend*/ 13 - { 0x0005, PWR_CMD_WRITE, BIT(0), BIT(0) }, 14 - { 0x0005, PWR_CMD_POLLING, BIT(0), 0 }, 15 - { 0x0023, PWR_CMD_WRITE, BIT(4), 0 }, 16 - { 0xFFFF, PWR_CMD_END, 0, 0 }, 17 - }; 18 - 19 - struct wl_pwr_cfg rtl8188E_card_disable_flow[] = { 20 - { 0x001F, PWR_CMD_WRITE, 0xFF, 0 }, /* turn off RF */ 21 - { 0x0023, PWR_CMD_WRITE, BIT(4), BIT(4) }, /* LDO Sleep mode */ 22 - { 0x0005, PWR_CMD_WRITE, BIT(1), BIT(1) }, /* turn off MAC by HW state machine */ 23 - { 0x0005, PWR_CMD_POLLING, BIT(1), 0 }, 24 - { 0x0026, PWR_CMD_WRITE, BIT(7), BIT(7) }, /* schmitt trigger */ 25 - { 0x0005, PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3) }, /* enable WL suspend */ 26 - { 0x0007, PWR_CMD_WRITE, 0xFF, 0 }, /* enable bandgap mbias in suspend */ 27 - { 0x0041, PWR_CMD_WRITE, BIT(4), 0 }, /* Clear SIC_EN register */ 28 - { 0xfe10, PWR_CMD_WRITE, BIT(4), BIT(4) }, /* Set USB suspend enable local register */ 29 - { 0xFFFF, PWR_CMD_END, 0, 0 }, 30 - }; 31 - 32 - /* This is used by driver for LPSRadioOff Procedure, not for FW LPS Step */ 33 - struct wl_pwr_cfg rtl8188E_enter_lps_flow[] = { 34 - { 0x0522, PWR_CMD_WRITE, 0xFF, 0x7F },/* Tx Pause */ 35 - { 0x05F8, PWR_CMD_POLLING, 0xFF, 0 }, /* Should be zero if no packet is transmitted */ 36 - { 0x05F9, PWR_CMD_POLLING, 0xFF, 0 }, /* Should be zero if no packet is transmitted */ 37 - { 0x05FA, PWR_CMD_POLLING, 0xFF, 0 }, /* Should be zero if no packet is transmitted */ 38 - { 0x05FB, PWR_CMD_POLLING, 0xFF, 0 }, /* Should be zero if no packet is transmitted */ 39 - { 0x0002, PWR_CMD_WRITE, BIT(0), 0 }, /* CCK and OFDM are disabled, clocks are gated */ 40 - { 0x0002, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US }, 41 - { 0x0100, PWR_CMD_WRITE, 0xFF, 0x3F }, /* Reset MAC TRX */ 42 - { 0x0101, PWR_CMD_WRITE, BIT(1), 0 }, /* check if removed later */ 43 - { 0x0553, PWR_CMD_WRITE, BIT(5), BIT(5) }, /* Respond TxOK to scheduler */ 44 - { 0xFFFF, PWR_CMD_END, 0, 0 }, 45 - };
+23 -10
drivers/staging/r8188eu/hal/Hal8188ERateAdaptive.c
··· 279 279 { /* Wilson 2011/10/26 */ 280 280 u32 MaskFromReg; 281 281 s8 i; 282 + int res; 282 283 283 284 switch (pRaInfo->RateID) { 284 285 case RATR_INX_WIRELESS_NGB: ··· 304 303 pRaInfo->RAUseRate = (pRaInfo->RateMask) & 0x0000000d; 305 304 break; 306 305 case 12: 307 - MaskFromReg = rtw_read32(dm_odm->Adapter, REG_ARFR0); 306 + res = rtw_read32(dm_odm->Adapter, REG_ARFR0, &MaskFromReg); 307 + if (res) 308 + return res; 309 + 308 310 pRaInfo->RAUseRate = (pRaInfo->RateMask) & MaskFromReg; 309 311 break; 310 312 case 13: 311 - MaskFromReg = rtw_read32(dm_odm->Adapter, REG_ARFR1); 313 + res = rtw_read32(dm_odm->Adapter, REG_ARFR1, &MaskFromReg); 314 + if (res) 315 + return res; 316 + 312 317 pRaInfo->RAUseRate = (pRaInfo->RateMask) & MaskFromReg; 313 318 break; 314 319 case 14: 315 - MaskFromReg = rtw_read32(dm_odm->Adapter, REG_ARFR2); 320 + res = rtw_read32(dm_odm->Adapter, REG_ARFR2, &MaskFromReg); 321 + if (res) 322 + return res; 323 + 316 324 pRaInfo->RAUseRate = (pRaInfo->RateMask) & MaskFromReg; 317 325 break; 318 326 case 15: 319 - MaskFromReg = rtw_read32(dm_odm->Adapter, REG_ARFR3); 327 + res = rtw_read32(dm_odm->Adapter, REG_ARFR3, &MaskFromReg); 328 + if (res) 329 + return res; 330 + 320 331 pRaInfo->RAUseRate = (pRaInfo->RateMask) & MaskFromReg; 321 332 break; 322 333 default: ··· 614 601 615 602 pRAInfo = &dm_odm->RAInfo[MacId]; 616 603 if (valid) { 617 - pRAInfo->RTY[0] = (u16)GET_TX_REPORT_TYPE1_RERTY_0(pBuffer); 618 - pRAInfo->RTY[1] = (u16)GET_TX_REPORT_TYPE1_RERTY_1(pBuffer); 619 - pRAInfo->RTY[2] = (u16)GET_TX_REPORT_TYPE1_RERTY_2((u8 *)pBuffer); 620 - pRAInfo->RTY[3] = (u16)GET_TX_REPORT_TYPE1_RERTY_3(pBuffer); 621 - pRAInfo->RTY[4] = (u16)GET_TX_REPORT_TYPE1_RERTY_4(pBuffer); 622 - pRAInfo->DROP = (u16)GET_TX_REPORT_TYPE1_DROP_0(pBuffer); 604 + pRAInfo->RTY[0] = le16_to_cpup((__le16 *)pBuffer); 605 + pRAInfo->RTY[1] = pBuffer[2]; 606 + pRAInfo->RTY[2] = pBuffer[3]; 607 + pRAInfo->RTY[3] = pBuffer[4]; 608 + pRAInfo->RTY[4] = pBuffer[5]; 609 + pRAInfo->DROP = pBuffer[6]; 623 610 pRAInfo->TOTAL = pRAInfo->RTY[0] + pRAInfo->RTY[1] + 624 611 pRAInfo->RTY[2] + pRAInfo->RTY[3] + 625 612 pRAInfo->RTY[4] + pRAInfo->DROP;
+17 -4
drivers/staging/r8188eu/hal/HalPhyRf_8188e.c
··· 463 463 } 464 464 } 465 465 466 + /* FIXME: return an error to caller */ 466 467 static void _PHY_SaveMACRegisters( 467 468 struct adapter *adapt, 468 469 u32 *MACReg, ··· 471 470 ) 472 471 { 473 472 u32 i; 473 + int res; 474 474 475 - for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++) 476 - MACBackup[i] = rtw_read8(adapt, MACReg[i]); 475 + for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++) { 476 + u8 reg; 477 477 478 - MACBackup[i] = rtw_read32(adapt, MACReg[i]); 478 + res = rtw_read8(adapt, MACReg[i], &reg); 479 + if (res) 480 + return; 481 + 482 + MACBackup[i] = reg; 483 + } 484 + 485 + res = rtw_read32(adapt, MACReg[i], MACBackup + i); 486 + (void)res; 479 487 } 480 488 481 489 static void reload_adda_reg(struct adapter *adapt, u32 *ADDAReg, u32 *ADDABackup, u32 RegiesterNum) ··· 749 739 { 750 740 u8 tmpreg; 751 741 u32 RF_Amode = 0, LC_Cal; 742 + int res; 752 743 753 744 /* Check continuous TX and Packet TX */ 754 - tmpreg = rtw_read8(adapt, 0xd03); 745 + res = rtw_read8(adapt, 0xd03, &tmpreg); 746 + if (res) 747 + return; 755 748 756 749 if ((tmpreg & 0x70) != 0) /* Deal with contisuous TX case */ 757 750 rtw_write8(adapt, 0xd03, tmpreg & 0x8F); /* disable all continuous TX */
+101 -17
drivers/staging/r8188eu/hal/HalPwrSeqCmd.c
··· 3 3 4 4 #include "../include/HalPwrSeqCmd.h" 5 5 6 - u8 HalPwrSeqCmdParsing(struct adapter *padapter, struct wl_pwr_cfg pwrseqcmd[]) 6 + #define PWR_CMD_WRITE 0x01 7 + /* offset: the read register offset */ 8 + /* msk: the mask of the write bits */ 9 + /* value: write value */ 10 + /* note: driver shall implement this cmd by read & msk after write */ 11 + 12 + #define PWR_CMD_POLLING 0x02 13 + /* offset: the read register offset */ 14 + /* msk: the mask of the polled value */ 15 + /* value: the value to be polled, masked by the msd field. */ 16 + /* note: driver shall implement this cmd by */ 17 + /* do{ */ 18 + /* if ( (Read(offset) & msk) == (value & msk) ) */ 19 + /* break; */ 20 + /* } while (not timeout); */ 21 + 22 + #define PWR_CMD_DELAY 0x03 23 + /* offset: the value to delay (in us) */ 24 + /* msk: N/A */ 25 + /* value: N/A */ 26 + 27 + struct wl_pwr_cfg { 28 + u16 offset; 29 + u8 cmd:4; 30 + u8 msk; 31 + u8 value; 32 + }; 33 + 34 + #define GET_PWR_CFG_OFFSET(__PWR_CMD) __PWR_CMD.offset 35 + #define GET_PWR_CFG_CMD(__PWR_CMD) __PWR_CMD.cmd 36 + #define GET_PWR_CFG_MASK(__PWR_CMD) __PWR_CMD.msk 37 + #define GET_PWR_CFG_VALUE(__PWR_CMD) __PWR_CMD.value 38 + 39 + static struct wl_pwr_cfg rtl8188E_power_on_flow[] = { 40 + { 0x0006, PWR_CMD_POLLING, BIT(1), BIT(1) }, 41 + { 0x0002, PWR_CMD_WRITE, BIT(0) | BIT(1), 0 }, /* reset BB */ 42 + { 0x0026, PWR_CMD_WRITE, BIT(7), BIT(7) }, /* schmitt trigger */ 43 + { 0x0005, PWR_CMD_WRITE, BIT(7), 0 }, /* disable HWPDN (control by DRV)*/ 44 + { 0x0005, PWR_CMD_WRITE, BIT(4) | BIT(3), 0 }, /* disable WL suspend*/ 45 + { 0x0005, PWR_CMD_WRITE, BIT(0), BIT(0) }, 46 + { 0x0005, PWR_CMD_POLLING, BIT(0), 0 }, 47 + { 0x0023, PWR_CMD_WRITE, BIT(4), 0 }, 48 + }; 49 + 50 + static struct wl_pwr_cfg rtl8188E_card_disable_flow[] = { 51 + { 0x001F, PWR_CMD_WRITE, 0xFF, 0 }, /* turn off RF */ 52 + { 0x0023, PWR_CMD_WRITE, BIT(4), BIT(4) }, /* LDO Sleep mode */ 53 + { 0x0005, PWR_CMD_WRITE, BIT(1), BIT(1) }, /* turn off MAC by HW state machine */ 54 + { 0x0005, PWR_CMD_POLLING, BIT(1), 0 }, 55 + { 0x0026, PWR_CMD_WRITE, BIT(7), BIT(7) }, /* schmitt trigger */ 56 + { 0x0005, PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3) }, /* enable WL suspend */ 57 + { 0x0007, PWR_CMD_WRITE, 0xFF, 0 }, /* enable bandgap mbias in suspend */ 58 + { 0x0041, PWR_CMD_WRITE, BIT(4), 0 }, /* Clear SIC_EN register */ 59 + { 0xfe10, PWR_CMD_WRITE, BIT(4), BIT(4) }, /* Set USB suspend enable local register */ 60 + }; 61 + 62 + /* This is used by driver for LPSRadioOff Procedure, not for FW LPS Step */ 63 + static struct wl_pwr_cfg rtl8188E_enter_lps_flow[] = { 64 + { 0x0522, PWR_CMD_WRITE, 0xFF, 0x7F },/* Tx Pause */ 65 + { 0x05F8, PWR_CMD_POLLING, 0xFF, 0 }, /* Should be zero if no packet is transmitted */ 66 + { 0x05F9, PWR_CMD_POLLING, 0xFF, 0 }, /* Should be zero if no packet is transmitted */ 67 + { 0x05FA, PWR_CMD_POLLING, 0xFF, 0 }, /* Should be zero if no packet is transmitted */ 68 + { 0x05FB, PWR_CMD_POLLING, 0xFF, 0 }, /* Should be zero if no packet is transmitted */ 69 + { 0x0002, PWR_CMD_WRITE, BIT(0), 0 }, /* CCK and OFDM are disabled, clocks are gated */ 70 + { 0x0002, PWR_CMD_DELAY, 0, 0 }, 71 + { 0x0100, PWR_CMD_WRITE, 0xFF, 0x3F }, /* Reset MAC TRX */ 72 + { 0x0101, PWR_CMD_WRITE, BIT(1), 0 }, /* check if removed later */ 73 + { 0x0553, PWR_CMD_WRITE, BIT(5), BIT(5) }, /* Respond TxOK to scheduler */ 74 + }; 75 + 76 + u8 HalPwrSeqCmdParsing(struct adapter *padapter, enum r8188eu_pwr_seq seq) 7 77 { 8 78 struct wl_pwr_cfg pwrcfgcmd = {0}; 79 + struct wl_pwr_cfg *pwrseqcmd; 9 80 u8 poll_bit = false; 10 - u32 aryidx = 0; 81 + u8 idx, num_steps; 11 82 u8 value = 0; 12 83 u32 offset = 0; 13 84 u32 poll_count = 0; /* polling autoload done. */ 14 85 u32 max_poll_count = 5000; 86 + int res; 15 87 16 - do { 17 - pwrcfgcmd = pwrseqcmd[aryidx]; 88 + switch (seq) { 89 + case PWR_ON_FLOW: 90 + pwrseqcmd = rtl8188E_power_on_flow; 91 + num_steps = ARRAY_SIZE(rtl8188E_power_on_flow); 92 + break; 93 + case DISABLE_FLOW: 94 + pwrseqcmd = rtl8188E_card_disable_flow; 95 + num_steps = ARRAY_SIZE(rtl8188E_card_disable_flow); 96 + break; 97 + case LPS_ENTER_FLOW: 98 + pwrseqcmd = rtl8188E_enter_lps_flow; 99 + num_steps = ARRAY_SIZE(rtl8188E_enter_lps_flow); 100 + break; 101 + default: 102 + return false; 103 + } 104 + 105 + for (idx = 0; idx < num_steps; idx++) { 106 + pwrcfgcmd = pwrseqcmd[idx]; 18 107 19 108 switch (GET_PWR_CFG_CMD(pwrcfgcmd)) { 20 109 case PWR_CMD_WRITE: 21 110 offset = GET_PWR_CFG_OFFSET(pwrcfgcmd); 22 111 23 112 /* Read the value from system register */ 24 - value = rtw_read8(padapter, offset); 113 + res = rtw_read8(padapter, offset, &value); 114 + if (res) 115 + return false; 25 116 26 117 value &= ~(GET_PWR_CFG_MASK(pwrcfgcmd)); 27 118 value |= (GET_PWR_CFG_VALUE(pwrcfgcmd) & GET_PWR_CFG_MASK(pwrcfgcmd)); ··· 124 33 poll_bit = false; 125 34 offset = GET_PWR_CFG_OFFSET(pwrcfgcmd); 126 35 do { 127 - value = rtw_read8(padapter, offset); 36 + res = rtw_read8(padapter, offset, &value); 37 + if (res) 38 + return false; 128 39 129 40 value &= GET_PWR_CFG_MASK(pwrcfgcmd); 130 41 if (value == (GET_PWR_CFG_VALUE(pwrcfgcmd) & GET_PWR_CFG_MASK(pwrcfgcmd))) ··· 139 46 } while (!poll_bit); 140 47 break; 141 48 case PWR_CMD_DELAY: 142 - if (GET_PWR_CFG_VALUE(pwrcfgcmd) == PWRSEQ_DELAY_US) 143 - udelay(GET_PWR_CFG_OFFSET(pwrcfgcmd)); 144 - else 145 - udelay(GET_PWR_CFG_OFFSET(pwrcfgcmd) * 1000); 146 - break; 147 - case PWR_CMD_END: 148 - /* When this command is parsed, end the process */ 149 - return true; 49 + udelay(GET_PWR_CFG_OFFSET(pwrcfgcmd)); 150 50 break; 151 51 default: 152 52 break; 153 53 } 154 - 155 - aryidx++;/* Add Array Index */ 156 - } while (1); 54 + } 157 55 return true; 158 56 }
+21 -45
drivers/staging/r8188eu/hal/hal_com.c
··· 10 10 11 11 #define _HAL_INIT_C_ 12 12 13 - void dump_chip_info(struct HAL_VERSION chip_vers) 14 - { 15 - uint cnt = 0; 16 - char buf[128]; 17 - 18 - cnt += sprintf((buf + cnt), "Chip Version Info: CHIP_8188E_"); 19 - cnt += sprintf((buf + cnt), "%s_", IS_NORMAL_CHIP(chip_vers) ? 20 - "Normal_Chip" : "Test_Chip"); 21 - cnt += sprintf((buf + cnt), "%s_", IS_CHIP_VENDOR_TSMC(chip_vers) ? 22 - "TSMC" : "UMC"); 23 - 24 - switch (chip_vers.CUTVersion) { 25 - case A_CUT_VERSION: 26 - cnt += sprintf((buf + cnt), "A_CUT_"); 27 - break; 28 - case B_CUT_VERSION: 29 - cnt += sprintf((buf + cnt), "B_CUT_"); 30 - break; 31 - case C_CUT_VERSION: 32 - cnt += sprintf((buf + cnt), "C_CUT_"); 33 - break; 34 - case D_CUT_VERSION: 35 - cnt += sprintf((buf + cnt), "D_CUT_"); 36 - break; 37 - case E_CUT_VERSION: 38 - cnt += sprintf((buf + cnt), "E_CUT_"); 39 - break; 40 - default: 41 - cnt += sprintf((buf + cnt), "UNKNOWN_CUT(%d)_", chip_vers.CUTVersion); 42 - break; 43 - } 44 - 45 - cnt += sprintf((buf + cnt), "1T1R_"); 46 - 47 - cnt += sprintf((buf + cnt), "RomVer(%d)\n", 0); 48 - 49 - pr_info("%s", buf); 50 - } 51 - 52 13 #define CHAN_PLAN_HW 0x80 53 14 54 15 u8 /* return the final channel plan decision */ ··· 264 303 if (!buf) 265 304 goto exit; 266 305 267 - trigger = rtw_read8(adapter, REG_C2HEVT_CLEAR); 306 + ret = rtw_read8(adapter, REG_C2HEVT_CLEAR, &trigger); 307 + if (ret) 308 + return _FAIL; 268 309 269 310 if (trigger == C2H_EVT_HOST_CLOSE) 270 311 goto exit; /* Not ready */ ··· 277 314 278 315 memset(c2h_evt, 0, 16); 279 316 280 - *buf = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL); 281 - *(buf + 1) = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 1); 317 + ret = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL, buf); 318 + if (ret) { 319 + ret = _FAIL; 320 + goto clear_evt; 321 + } 282 322 323 + ret = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 1, buf + 1); 324 + if (ret) { 325 + ret = _FAIL; 326 + goto clear_evt; 327 + } 283 328 /* Read the content */ 284 - for (i = 0; i < c2h_evt->plen; i++) 285 - c2h_evt->payload[i] = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 286 - sizeof(*c2h_evt) + i); 329 + for (i = 0; i < c2h_evt->plen; i++) { 330 + ret = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 331 + sizeof(*c2h_evt) + i, c2h_evt->payload + i); 332 + if (ret) { 333 + ret = _FAIL; 334 + goto clear_evt; 335 + } 336 + } 287 337 288 338 ret = _SUCCESS; 289 339
+31 -6
drivers/staging/r8188eu/hal/rtl8188e_cmd.c
··· 18 18 19 19 static u8 _is_fw_read_cmd_down(struct adapter *adapt, u8 msgbox_num) 20 20 { 21 - u8 read_down = false; 21 + u8 read_down = false, reg; 22 22 int retry_cnts = 100; 23 + int res; 23 24 24 25 u8 valid; 25 26 26 27 do { 27 - valid = rtw_read8(adapt, REG_HMETFR) & BIT(msgbox_num); 28 + res = rtw_read8(adapt, REG_HMETFR, &reg); 29 + if (res) 30 + continue; 31 + 32 + valid = reg & BIT(msgbox_num); 28 33 if (0 == valid) 29 34 read_down = true; 30 35 } while ((!read_down) && (retry_cnts--)); ··· 538 533 bool bcn_valid = false; 539 534 u8 DLBcnCount = 0; 540 535 u32 poll = 0; 536 + u8 reg; 537 + int res; 541 538 542 539 if (mstatus == 1) { 543 540 /* We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C. */ ··· 554 547 /* Disable Hw protection for a time which revserd for Hw sending beacon. */ 555 548 /* Fix download reserved page packet fail that access collision with the protection time. */ 556 549 /* 2010.05.11. Added by tynli. */ 557 - rtw_write8(adapt, REG_BCN_CTRL, rtw_read8(adapt, REG_BCN_CTRL) & (~BIT(3))); 558 - rtw_write8(adapt, REG_BCN_CTRL, rtw_read8(adapt, REG_BCN_CTRL) | BIT(4)); 550 + res = rtw_read8(adapt, REG_BCN_CTRL, &reg); 551 + if (res) 552 + return; 553 + 554 + rtw_write8(adapt, REG_BCN_CTRL, reg & (~BIT(3))); 555 + 556 + res = rtw_read8(adapt, REG_BCN_CTRL, &reg); 557 + if (res) 558 + return; 559 + 560 + rtw_write8(adapt, REG_BCN_CTRL, reg | BIT(4)); 559 561 560 562 if (haldata->RegFwHwTxQCtrl & BIT(6)) 561 563 bSendBeacon = true; ··· 597 581 /* */ 598 582 599 583 /* Enable Bcn */ 600 - rtw_write8(adapt, REG_BCN_CTRL, rtw_read8(adapt, REG_BCN_CTRL) | BIT(3)); 601 - rtw_write8(adapt, REG_BCN_CTRL, rtw_read8(adapt, REG_BCN_CTRL) & (~BIT(4))); 584 + res = rtw_read8(adapt, REG_BCN_CTRL, &reg); 585 + if (res) 586 + return; 587 + 588 + rtw_write8(adapt, REG_BCN_CTRL, reg | BIT(3)); 589 + 590 + res = rtw_read8(adapt, REG_BCN_CTRL, &reg); 591 + if (res) 592 + return; 593 + 594 + rtw_write8(adapt, REG_BCN_CTRL, reg & (~BIT(4))); 602 595 603 596 /* To make sure that if there exists an adapter which would like to send beacon. */ 604 597 /* If exists, the origianl value of 0x422[6] will be 1, we should check this to */
+5 -1
drivers/staging/r8188eu/hal/rtl8188e_dm.c
··· 12 12 static void dm_InitGPIOSetting(struct adapter *Adapter) 13 13 { 14 14 u8 tmp1byte; 15 + int res; 15 16 16 - tmp1byte = rtw_read8(Adapter, REG_GPIO_MUXCFG); 17 + res = rtw_read8(Adapter, REG_GPIO_MUXCFG, &tmp1byte); 18 + if (res) 19 + return; 20 + 17 21 tmp1byte &= (GPIOSEL_GPIO | ~GPIOSEL_ENBT); 18 22 19 23 rtw_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte);
+143 -61
drivers/staging/r8188eu/hal/rtl8188e_hal_init.c
··· 13 13 static void iol_mode_enable(struct adapter *padapter, u8 enable) 14 14 { 15 15 u8 reg_0xf0 = 0; 16 + int res; 16 17 17 18 if (enable) { 18 19 /* Enable initial offload */ 19 - reg_0xf0 = rtw_read8(padapter, REG_SYS_CFG); 20 + res = rtw_read8(padapter, REG_SYS_CFG, &reg_0xf0); 21 + if (res) 22 + return; 23 + 20 24 rtw_write8(padapter, REG_SYS_CFG, reg_0xf0 | SW_OFFLOAD_EN); 21 25 22 26 if (!padapter->bFWReady) ··· 28 24 29 25 } else { 30 26 /* disable initial offload */ 31 - reg_0xf0 = rtw_read8(padapter, REG_SYS_CFG); 27 + res = rtw_read8(padapter, REG_SYS_CFG, &reg_0xf0); 28 + if (res) 29 + return; 30 + 32 31 rtw_write8(padapter, REG_SYS_CFG, reg_0xf0 & ~SW_OFFLOAD_EN); 33 32 } 34 33 } ··· 41 34 s32 status = _FAIL; 42 35 u8 reg_0x88 = 0; 43 36 unsigned long timeout; 37 + int res; 44 38 45 39 control = control & 0x0f; 46 - reg_0x88 = rtw_read8(padapter, REG_HMEBOX_E0); 40 + res = rtw_read8(padapter, REG_HMEBOX_E0, &reg_0x88); 41 + if (res) 42 + return _FAIL; 43 + 47 44 rtw_write8(padapter, REG_HMEBOX_E0, reg_0x88 | control); 48 45 49 46 timeout = jiffies + msecs_to_jiffies(1000); 50 - while ((reg_0x88 = rtw_read8(padapter, REG_HMEBOX_E0)) & control && 51 - time_before(jiffies, timeout)) 52 - ; 53 47 54 - reg_0x88 = rtw_read8(padapter, REG_HMEBOX_E0); 48 + do { 49 + res = rtw_read8(padapter, REG_HMEBOX_E0, &reg_0x88); 50 + if (res) 51 + continue; 52 + 53 + if (!(reg_0x88 & control)) 54 + break; 55 + 56 + } while (time_before(jiffies, timeout)); 57 + 58 + res = rtw_read8(padapter, REG_HMEBOX_E0, &reg_0x88); 59 + if (res) 60 + return _FAIL; 61 + 55 62 status = (reg_0x88 & control) ? _FAIL : _SUCCESS; 56 63 if (reg_0x88 & control << 4) 57 64 status = _FAIL; ··· 83 62 } 84 63 85 64 static void 86 - efuse_phymap_to_logical(u8 *phymap, u16 _offset, u16 _size_byte, u8 *pbuf) 65 + efuse_phymap_to_logical(u8 *phymap, u16 _size_byte, u8 *pbuf) 87 66 { 88 67 u8 *efuseTbl = NULL; 89 68 u8 rtemp8; ··· 91 70 u8 offset, wren; 92 71 u16 i, j; 93 72 u16 **eFuseWord = NULL; 94 - u16 efuse_utilized = 0; 95 73 u8 u1temp = 0; 96 74 97 75 efuseTbl = kzalloc(EFUSE_MAP_LEN_88E, GFP_KERNEL); ··· 112 92 /* */ 113 93 rtemp8 = *(phymap + eFuse_Addr); 114 94 if (rtemp8 != 0xFF) { 115 - efuse_utilized++; 116 95 eFuse_Addr++; 117 96 } else { 118 97 goto exit; ··· 149 130 if (!(wren & 0x01)) { 150 131 rtemp8 = *(phymap + eFuse_Addr); 151 132 eFuse_Addr++; 152 - efuse_utilized++; 153 133 eFuseWord[offset][i] = (rtemp8 & 0xff); 154 134 if (eFuse_Addr >= EFUSE_REAL_CONTENT_LEN_88E) 155 135 break; 156 136 rtemp8 = *(phymap + eFuse_Addr); 157 137 eFuse_Addr++; 158 - efuse_utilized++; 159 138 eFuseWord[offset][i] |= (((u16)rtemp8 << 8) & 0xff00); 160 139 161 140 if (eFuse_Addr >= EFUSE_REAL_CONTENT_LEN_88E) ··· 166 149 rtemp8 = *(phymap + eFuse_Addr); 167 150 168 151 if (rtemp8 != 0xFF && (eFuse_Addr < EFUSE_REAL_CONTENT_LEN_88E)) { 169 - efuse_utilized++; 170 152 eFuse_Addr++; 171 153 } 172 154 } ··· 183 167 /* */ 184 168 /* 4. Copy from Efuse map to output pointer memory!!! */ 185 169 /* */ 186 - for (i = 0; i < _size_byte; i++) 187 - pbuf[i] = efuseTbl[_offset + i]; 188 - 189 - /* */ 190 - /* 5. Calculate Efuse utilization. */ 191 - /* */ 170 + memcpy(pbuf, efuseTbl, _size_byte); 192 171 193 172 exit: 194 173 kfree(efuseTbl); 195 174 kfree(eFuseWord); 196 175 } 197 176 198 - static void efuse_read_phymap_from_txpktbuf( 177 + /* FIXME: add error handling in callers */ 178 + static int efuse_read_phymap_from_txpktbuf( 199 179 struct adapter *adapter, 200 - int bcnhead, /* beacon head, where FW store len(2-byte) and efuse physical map. */ 201 180 u8 *content, /* buffer to store efuse physical map */ 202 181 u16 *size /* for efuse content: the max byte to read. will update to byte read */ 203 182 ) 204 183 { 205 184 unsigned long timeout; 206 - u16 dbg_addr = 0; 207 185 __le32 lo32 = 0, hi32 = 0; 208 186 u16 len = 0, count = 0; 209 - int i = 0; 187 + int i = 0, res; 210 188 u16 limit = *size; 211 - 189 + u8 reg; 212 190 u8 *pos = content; 213 - 214 - if (bcnhead < 0) /* if not valid */ 215 - bcnhead = rtw_read8(adapter, REG_TDECTRL + 1); 191 + u32 reg32; 216 192 217 193 rtw_write8(adapter, REG_PKT_BUFF_ACCESS_CTRL, TXPKT_BUF_SELECT); 218 194 219 - dbg_addr = bcnhead * 128 / 8; /* 8-bytes addressing */ 220 - 221 195 while (1) { 222 - rtw_write16(adapter, REG_PKTBUF_DBG_ADDR, dbg_addr + i); 196 + rtw_write16(adapter, REG_PKTBUF_DBG_ADDR, i); 223 197 224 198 rtw_write8(adapter, REG_TXPKTBUF_DBG, 0); 225 199 timeout = jiffies + msecs_to_jiffies(1000); 226 - while (!rtw_read8(adapter, REG_TXPKTBUF_DBG) && time_before(jiffies, timeout)) 227 - rtw_usleep_os(100); 200 + do { 201 + res = rtw_read8(adapter, REG_TXPKTBUF_DBG, &reg); 202 + if (res) 203 + continue; 204 + 205 + if (reg) 206 + break; 207 + 208 + msleep(1); 209 + } while (time_before(jiffies, timeout)); 228 210 229 211 /* data from EEPROM needs to be in LE */ 230 - lo32 = cpu_to_le32(rtw_read32(adapter, REG_PKTBUF_DBG_DATA_L)); 231 - hi32 = cpu_to_le32(rtw_read32(adapter, REG_PKTBUF_DBG_DATA_H)); 212 + res = rtw_read32(adapter, REG_PKTBUF_DBG_DATA_L, &reg32); 213 + if (res) 214 + return res; 215 + 216 + lo32 = cpu_to_le32(reg32); 217 + 218 + res = rtw_read32(adapter, REG_PKTBUF_DBG_DATA_H, &reg32); 219 + if (res) 220 + return res; 221 + 222 + hi32 = cpu_to_le32(reg32); 232 223 233 224 if (i == 0) { 225 + u16 reg; 226 + 234 227 /* Although lenc is only used in a debug statement, 235 228 * do not remove it as the rtw_read16() call consumes 236 229 * 2 bytes from the EEPROM source. 237 230 */ 238 - rtw_read16(adapter, REG_PKTBUF_DBG_DATA_L); 231 + res = rtw_read16(adapter, REG_PKTBUF_DBG_DATA_L, &reg); 232 + if (res) 233 + return res; 239 234 240 235 len = le32_to_cpu(lo32) & 0x0000ffff; 241 236 ··· 273 246 } 274 247 rtw_write8(adapter, REG_PKT_BUFF_ACCESS_CTRL, DISABLE_TRXPKT_BUF_ACCESS); 275 248 *size = count; 249 + 250 + return 0; 276 251 } 277 252 278 - static s32 iol_read_efuse(struct adapter *padapter, u8 txpktbuf_bndy, u16 offset, u16 size_byte, u8 *logical_map) 253 + static s32 iol_read_efuse(struct adapter *padapter, u16 size_byte, u8 *logical_map) 279 254 { 280 255 s32 status = _FAIL; 281 256 u8 physical_map[512]; 282 257 u16 size = 512; 283 258 284 - rtw_write8(padapter, REG_TDECTRL + 1, txpktbuf_bndy); 259 + rtw_write8(padapter, REG_TDECTRL + 1, 0); 285 260 memset(physical_map, 0xFF, 512); 286 261 rtw_write8(padapter, REG_PKT_BUFF_ACCESS_CTRL, TXPKT_BUF_SELECT); 287 262 status = iol_execute(padapter, CMD_READ_EFUSE_MAP); 288 263 if (status == _SUCCESS) 289 - efuse_read_phymap_from_txpktbuf(padapter, txpktbuf_bndy, physical_map, &size); 290 - efuse_phymap_to_logical(physical_map, offset, size_byte, logical_map); 264 + efuse_read_phymap_from_txpktbuf(padapter, physical_map, &size); 265 + efuse_phymap_to_logical(physical_map, size_byte, logical_map); 291 266 return status; 292 267 } 293 268 ··· 350 321 void rtl8188e_EfusePowerSwitch(struct adapter *pAdapter, u8 PwrState) 351 322 { 352 323 u16 tmpV16; 324 + int res; 353 325 354 326 if (PwrState) { 355 327 rtw_write8(pAdapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON); 356 328 357 329 /* 1.2V Power: From VDDON with Power Cut(0x0000h[15]), defualt valid */ 358 - tmpV16 = rtw_read16(pAdapter, REG_SYS_ISO_CTRL); 330 + res = rtw_read16(pAdapter, REG_SYS_ISO_CTRL, &tmpV16); 331 + if (res) 332 + return; 333 + 359 334 if (!(tmpV16 & PWC_EV12V)) { 360 335 tmpV16 |= PWC_EV12V; 361 336 rtw_write16(pAdapter, REG_SYS_ISO_CTRL, tmpV16); 362 337 } 363 338 /* Reset: 0x0000h[28], default valid */ 364 - tmpV16 = rtw_read16(pAdapter, REG_SYS_FUNC_EN); 339 + res = rtw_read16(pAdapter, REG_SYS_FUNC_EN, &tmpV16); 340 + if (res) 341 + return; 342 + 365 343 if (!(tmpV16 & FEN_ELDR)) { 366 344 tmpV16 |= FEN_ELDR; 367 345 rtw_write16(pAdapter, REG_SYS_FUNC_EN, tmpV16); 368 346 } 369 347 370 348 /* Clock: Gated(0x0008h[5]) 8M(0x0008h[1]) clock from ANA, default valid */ 371 - tmpV16 = rtw_read16(pAdapter, REG_SYS_CLKR); 349 + res = rtw_read16(pAdapter, REG_SYS_CLKR, &tmpV16); 350 + if (res) 351 + return; 352 + 372 353 if ((!(tmpV16 & LOADER_CLK_EN)) || (!(tmpV16 & ANA8M))) { 373 354 tmpV16 |= (LOADER_CLK_EN | ANA8M); 374 355 rtw_write16(pAdapter, REG_SYS_CLKR, tmpV16); ··· 509 470 kfree(eFuseWord); 510 471 } 511 472 512 - static void ReadEFuseByIC(struct adapter *Adapter, u16 _offset, u16 _size_byte, u8 *pbuf) 473 + void rtl8188e_ReadEFuse(struct adapter *Adapter, u16 _size_byte, u8 *pbuf) 513 474 { 514 475 int ret = _FAIL; 515 476 if (rtw_IOL_applied(Adapter)) { 516 477 rtl8188eu_InitPowerOn(Adapter); 517 478 518 479 iol_mode_enable(Adapter, 1); 519 - ret = iol_read_efuse(Adapter, 0, _offset, _size_byte, pbuf); 480 + ret = iol_read_efuse(Adapter, _size_byte, pbuf); 520 481 iol_mode_enable(Adapter, 0); 521 482 522 483 if (_SUCCESS == ret) 523 484 return; 524 485 } 525 486 526 - Hal_EfuseReadEFuse88E(Adapter, _offset, _size_byte, pbuf); 487 + Hal_EfuseReadEFuse88E(Adapter, 0, _size_byte, pbuf); 527 488 } 528 489 529 - void rtl8188e_ReadEFuse(struct adapter *Adapter, u16 _offset, u16 _size_byte, u8 *pbuf) 490 + static void dump_chip_info(struct HAL_VERSION chip_vers) 530 491 { 531 - ReadEFuseByIC(Adapter, _offset, _size_byte, pbuf); 492 + uint cnt = 0; 493 + char buf[128]; 494 + 495 + cnt += sprintf((buf + cnt), "Chip Version Info: CHIP_8188E_"); 496 + cnt += sprintf((buf + cnt), "%s_", IS_NORMAL_CHIP(chip_vers) ? 497 + "Normal_Chip" : "Test_Chip"); 498 + cnt += sprintf((buf + cnt), "%s_", IS_CHIP_VENDOR_TSMC(chip_vers) ? 499 + "TSMC" : "UMC"); 500 + 501 + switch (chip_vers.CUTVersion) { 502 + case A_CUT_VERSION: 503 + cnt += sprintf((buf + cnt), "A_CUT_"); 504 + break; 505 + case B_CUT_VERSION: 506 + cnt += sprintf((buf + cnt), "B_CUT_"); 507 + break; 508 + case C_CUT_VERSION: 509 + cnt += sprintf((buf + cnt), "C_CUT_"); 510 + break; 511 + case D_CUT_VERSION: 512 + cnt += sprintf((buf + cnt), "D_CUT_"); 513 + break; 514 + case E_CUT_VERSION: 515 + cnt += sprintf((buf + cnt), "E_CUT_"); 516 + break; 517 + default: 518 + cnt += sprintf((buf + cnt), "UNKNOWN_CUT(%d)_", chip_vers.CUTVersion); 519 + break; 520 + } 521 + 522 + cnt += sprintf((buf + cnt), "1T1R_"); 523 + 524 + cnt += sprintf((buf + cnt), "RomVer(%d)\n", 0); 525 + 526 + pr_info("%s", buf); 532 527 } 533 528 534 529 void rtl8188e_read_chip_version(struct adapter *padapter) ··· 570 497 u32 value32; 571 498 struct HAL_VERSION ChipVersion; 572 499 struct hal_data_8188e *pHalData = &padapter->haldata; 500 + int res; 573 501 574 - value32 = rtw_read32(padapter, REG_SYS_CFG); 502 + res = rtw_read32(padapter, REG_SYS_CFG, &value32); 503 + if (res) 504 + return; 505 + 575 506 ChipVersion.ChipType = ((value32 & RTL_ID) ? TEST_CHIP : NORMAL_CHIP); 576 507 577 508 ChipVersion.VendorType = ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : CHIP_VENDOR_TSMC); ··· 602 525 603 526 void hal_notch_filter_8188e(struct adapter *adapter, bool enable) 604 527 { 528 + int res; 529 + u8 reg; 530 + 531 + res = rtw_read8(adapter, rOFDM0_RxDSP + 1, &reg); 532 + if (res) 533 + return; 534 + 605 535 if (enable) 606 - rtw_write8(adapter, rOFDM0_RxDSP + 1, rtw_read8(adapter, rOFDM0_RxDSP + 1) | BIT(1)); 536 + rtw_write8(adapter, rOFDM0_RxDSP + 1, reg | BIT(1)); 607 537 else 608 - rtw_write8(adapter, rOFDM0_RxDSP + 1, rtw_read8(adapter, rOFDM0_RxDSP + 1) & ~BIT(1)); 538 + rtw_write8(adapter, rOFDM0_RxDSP + 1, reg & ~BIT(1)); 609 539 } 610 540 611 541 /* */ ··· 622 538 /* */ 623 539 static s32 _LLTWrite(struct adapter *padapter, u32 address, u32 data) 624 540 { 625 - s32 status = _SUCCESS; 626 - s32 count = 0; 541 + s32 count; 627 542 u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) | _LLT_OP(_LLT_WRITE_ACCESS); 628 543 u16 LLTReg = REG_LLT_INIT; 544 + int res; 629 545 630 546 rtw_write32(padapter, LLTReg, value); 631 547 632 548 /* polling */ 633 - do { 634 - value = rtw_read32(padapter, LLTReg); 549 + for (count = 0; count <= POLLING_LLT_THRESHOLD; count++) { 550 + res = rtw_read32(padapter, LLTReg, &value); 551 + if (res) 552 + continue; 553 + 635 554 if (_LLT_NO_ACTIVE == _LLT_OP_VALUE(value)) 636 555 break; 556 + } 637 557 638 - if (count > POLLING_LLT_THRESHOLD) { 639 - status = _FAIL; 640 - break; 641 - } 642 - } while (count++); 643 - 644 - return status; 558 + return count > POLLING_LLT_THRESHOLD ? _FAIL : _SUCCESS; 645 559 } 646 560 647 561 s32 InitLLTTable(struct adapter *padapter, u8 txpktbuf_bndy)
+24 -6
drivers/staging/r8188eu/hal/rtl8188e_phycfg.c
··· 56 56 ) 57 57 { 58 58 u32 ReturnValue = 0, OriginalValue, BitShift; 59 + int res; 59 60 60 - OriginalValue = rtw_read32(Adapter, RegAddr); 61 + res = rtw_read32(Adapter, RegAddr, &OriginalValue); 62 + if (res) 63 + return 0; 64 + 61 65 BitShift = phy_CalculateBitShift(BitMask); 62 66 ReturnValue = (OriginalValue & BitMask) >> BitShift; 63 67 return ReturnValue; ··· 88 84 void rtl8188e_PHY_SetBBReg(struct adapter *Adapter, u32 RegAddr, u32 BitMask, u32 Data) 89 85 { 90 86 u32 OriginalValue, BitShift; 87 + int res; 91 88 92 89 if (BitMask != bMaskDWord) { /* if not "double word" write */ 93 - OriginalValue = rtw_read32(Adapter, RegAddr); 90 + res = rtw_read32(Adapter, RegAddr, &OriginalValue); 91 + if (res) 92 + return; 93 + 94 94 BitShift = phy_CalculateBitShift(BitMask); 95 95 Data = ((OriginalValue & (~BitMask)) | (Data << BitShift)); 96 96 } ··· 492 484 { 493 485 int rtStatus = _SUCCESS; 494 486 struct hal_data_8188e *pHalData = &Adapter->haldata; 495 - u32 RegVal; 487 + u16 RegVal; 496 488 u8 CrystalCap; 489 + int res; 497 490 498 491 phy_InitBBRFRegisterDefinition(Adapter); 499 492 500 493 /* Enable BB and RF */ 501 - RegVal = rtw_read16(Adapter, REG_SYS_FUNC_EN); 494 + res = rtw_read16(Adapter, REG_SYS_FUNC_EN, &RegVal); 495 + if (res) 496 + return _FAIL; 497 + 502 498 rtw_write16(Adapter, REG_SYS_FUNC_EN, (u16)(RegVal | BIT(13) | BIT(0) | BIT(1))); 503 499 504 500 /* 20090923 Joseph: Advised by Steven and Jenyu. Power sequence before init RF. */ ··· 606 594 struct hal_data_8188e *pHalData = &Adapter->haldata; 607 595 u8 regBwOpMode; 608 596 u8 regRRSR_RSC; 597 + int res; 609 598 610 599 if (Adapter->bDriverStopped) 611 600 return; ··· 615 602 /* 3<1>Set MAC register */ 616 603 /* 3 */ 617 604 618 - regBwOpMode = rtw_read8(Adapter, REG_BWOPMODE); 619 - regRRSR_RSC = rtw_read8(Adapter, REG_RRSR + 2); 605 + res = rtw_read8(Adapter, REG_BWOPMODE, &regBwOpMode); 606 + if (res) 607 + return; 608 + 609 + res = rtw_read8(Adapter, REG_RRSR + 2, &regRRSR_RSC); 610 + if (res) 611 + return; 620 612 621 613 switch (pHalData->CurrentChannelBW) { 622 614 case HT_CHANNEL_WIDTH_20:
+1 -1
drivers/staging/r8188eu/hal/rtl8188eu_recv.c
··· 32 32 goto exit; 33 33 } 34 34 35 - precvpriv->precv_buf = (u8 *)N_BYTE_ALIGMENT((size_t)(precvpriv->pallocated_recv_buf), 4); 35 + precvpriv->precv_buf = (u8 *)ALIGN((size_t)(precvpriv->pallocated_recv_buf), 4); 36 36 37 37 precvbuf = (struct recv_buf *)precvpriv->precv_buf; 38 38
+169 -307
drivers/staging/r8188eu/hal/usb_halinit.c
··· 11 11 #include "../include/rtw_iol.h" 12 12 #include "../include/usb_ops.h" 13 13 #include "../include/usb_osintf.h" 14 - #include "../include/Hal8188EPwrSeq.h" 14 + #include "../include/HalPwrSeqCmd.h" 15 15 16 16 static void _ConfigNormalChipOutEP_8188E(struct adapter *adapt, u8 NumOutPipe) 17 17 { ··· 52 52 u32 rtl8188eu_InitPowerOn(struct adapter *adapt) 53 53 { 54 54 u16 value16; 55 + int res; 56 + 55 57 /* HW Power on sequence */ 56 58 struct hal_data_8188e *haldata = &adapt->haldata; 57 59 if (haldata->bMacPwrCtrlOn) 58 60 return _SUCCESS; 59 61 60 - if (!HalPwrSeqCmdParsing(adapt, Rtl8188E_NIC_PWR_ON_FLOW)) 62 + if (!HalPwrSeqCmdParsing(adapt, PWR_ON_FLOW)) 61 63 return _FAIL; 62 64 63 65 /* Enable MAC DMA/WMAC/SCHEDULE/SEC block */ ··· 67 65 rtw_write16(adapt, REG_CR, 0x00); /* suggseted by zhouzhou, by page, 20111230 */ 68 66 69 67 /* Enable MAC DMA/WMAC/SCHEDULE/SEC block */ 70 - value16 = rtw_read16(adapt, REG_CR); 68 + res = rtw_read16(adapt, REG_CR, &value16); 69 + if (res) 70 + return _FAIL; 71 + 71 72 value16 |= (HCI_TXDMA_EN | HCI_RXDMA_EN | TXDMA_EN | RXDMA_EN 72 73 | PROTOCOL_EN | SCHEDULE_EN | ENSEC | CALTMR_EN); 73 74 /* for SDIO - Set CR bit10 to enable 32k calibration. Suggested by SD1 Gimmy. Added by tynli. 2011.08.31. */ ··· 86 81 { 87 82 u32 imr, imr_ex; 88 83 u8 usb_opt; 84 + int res; 89 85 90 86 /* HISR write one to clear */ 91 87 rtw_write32(Adapter, REG_HISR_88E, 0xFFFFFFFF); ··· 100 94 /* REG_USB_SPECIAL_OPTION - BIT(4) */ 101 95 /* 0; Use interrupt endpoint to upload interrupt pkt */ 102 96 /* 1; Use bulk endpoint to upload interrupt pkt, */ 103 - usb_opt = rtw_read8(Adapter, REG_USB_SPECIAL_OPTION); 97 + res = rtw_read8(Adapter, REG_USB_SPECIAL_OPTION, &usb_opt); 98 + if (res) 99 + return; 104 100 105 101 if (adapter_to_dvobj(Adapter)->pusbdev->speed == USB_SPEED_HIGH) 106 102 usb_opt = usb_opt | (INT_BULK_SEL); ··· 171 163 u16 bkQ, u16 viQ, u16 voQ, u16 mgtQ, 172 164 u16 hiQ) 173 165 { 174 - u16 value16 = (rtw_read16(Adapter, REG_TRXDMA_CTRL) & 0x7); 166 + u16 value16; 167 + int res; 168 + 169 + res = rtw_read16(Adapter, REG_TRXDMA_CTRL, &value16); 170 + if (res) 171 + return; 172 + 173 + value16 &= 0x7; 175 174 176 175 value16 |= _TXDMA_BEQ_MAP(beQ) | _TXDMA_BKQ_MAP(bkQ) | 177 176 _TXDMA_VIQ_MAP(viQ) | _TXDMA_VOQ_MAP(voQ) | ··· 297 282 static void _InitNetworkType(struct adapter *Adapter) 298 283 { 299 284 u32 value32; 285 + int res; 300 286 301 - value32 = rtw_read32(Adapter, REG_CR); 287 + res = rtw_read32(Adapter, REG_CR, &value32); 288 + if (res) 289 + return; 290 + 302 291 /* TODO: use the other function to set network type */ 303 292 value32 = (value32 & ~MASK_NETTYPE) | _NETTYPE(NT_LINK_AP); 304 293 ··· 342 323 { 343 324 u16 value16; 344 325 u32 value32; 326 + int res; 345 327 346 328 /* Response Rate Set */ 347 - value32 = rtw_read32(Adapter, REG_RRSR); 329 + res = rtw_read32(Adapter, REG_RRSR, &value32); 330 + if (res) 331 + return; 332 + 348 333 value32 &= ~RATE_BITMAP_ALL; 349 334 value32 |= RATE_RRSR_CCK_ONLY_1M; 350 335 rtw_write32(Adapter, REG_RRSR, value32); ··· 386 363 static void _InitRetryFunction(struct adapter *Adapter) 387 364 { 388 365 u8 value8; 366 + int res; 389 367 390 - value8 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL); 368 + res = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL, &value8); 369 + if (res) 370 + return; 371 + 391 372 value8 |= EN_AMPDU_RTY_NEW; 392 373 rtw_write8(Adapter, REG_FWHW_TXQ_CTRL, value8); 393 374 ··· 417 390 static void usb_AggSettingTxUpdate(struct adapter *Adapter) 418 391 { 419 392 u32 value32; 393 + int res; 420 394 421 395 if (Adapter->registrypriv.wifi_spec) 422 396 return; 423 397 424 - value32 = rtw_read32(Adapter, REG_TDECTRL); 398 + res = rtw_read32(Adapter, REG_TDECTRL, &value32); 399 + if (res) 400 + return; 401 + 425 402 value32 = value32 & ~(BLK_DESC_NUM_MASK << BLK_DESC_NUM_SHIFT); 426 403 value32 |= ((USB_TXAGG_DESC_NUM & BLK_DESC_NUM_MASK) << BLK_DESC_NUM_SHIFT); 427 404 ··· 454 423 { 455 424 u8 valueDMA; 456 425 u8 valueUSB; 426 + int res; 457 427 458 - valueDMA = rtw_read8(Adapter, REG_TRXDMA_CTRL); 459 - valueUSB = rtw_read8(Adapter, REG_USB_SPECIAL_OPTION); 428 + res = rtw_read8(Adapter, REG_TRXDMA_CTRL, &valueDMA); 429 + if (res) 430 + return; 431 + 432 + res = rtw_read8(Adapter, REG_USB_SPECIAL_OPTION, &valueUSB); 433 + if (res) 434 + return; 460 435 461 436 valueDMA |= RXDMA_AGG_EN; 462 437 valueUSB &= ~USB_AGG_EN; ··· 483 446 usb_AggSettingRxUpdate(Adapter); 484 447 } 485 448 486 - static void _InitBeaconParameters(struct adapter *Adapter) 449 + /* FIXME: add error handling in callers */ 450 + static int _InitBeaconParameters(struct adapter *Adapter) 487 451 { 488 452 struct hal_data_8188e *haldata = &Adapter->haldata; 453 + int res; 489 454 490 455 rtw_write16(Adapter, REG_BCN_CTRL, 0x1010); 491 456 ··· 500 461 /* beacause test chip does not contension before sending beacon. by tynli. 2009.11.03 */ 501 462 rtw_write16(Adapter, REG_BCNTCFG, 0x660F); 502 463 503 - haldata->RegFwHwTxQCtrl = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL + 2); 504 - haldata->RegReg542 = rtw_read8(Adapter, REG_TBTT_PROHIBIT + 2); 505 - haldata->RegCR_1 = rtw_read8(Adapter, REG_CR + 1); 464 + res = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL + 2, &haldata->RegFwHwTxQCtrl); 465 + if (res) 466 + return res; 467 + 468 + res = rtw_read8(Adapter, REG_TBTT_PROHIBIT + 2, &haldata->RegReg542); 469 + if (res) 470 + return res; 471 + 472 + res = rtw_read8(Adapter, REG_CR + 1, &haldata->RegCR_1); 473 + if (res) 474 + return res; 475 + 476 + return 0; 506 477 } 507 478 508 479 static void _BeaconFunctionEnable(struct adapter *Adapter, ··· 533 484 static void _InitAntenna_Selection(struct adapter *Adapter) 534 485 { 535 486 struct hal_data_8188e *haldata = &Adapter->haldata; 487 + int res; 488 + u32 reg; 536 489 537 490 if (haldata->AntDivCfg == 0) 538 491 return; 539 492 540 - rtw_write32(Adapter, REG_LEDCFG0, rtw_read32(Adapter, REG_LEDCFG0) | BIT(23)); 493 + res = rtw_read32(Adapter, REG_LEDCFG0, &reg); 494 + if (res) 495 + return; 496 + 497 + rtw_write32(Adapter, REG_LEDCFG0, reg | BIT(23)); 541 498 rtl8188e_PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, BIT(13), 0x01); 542 499 543 500 if (rtl8188e_PHY_QueryBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300) == Antenna_A) ··· 569 514 u16 value16; 570 515 u8 txpktbuf_bndy; 571 516 u32 status = _SUCCESS; 517 + int res; 572 518 struct hal_data_8188e *haldata = &Adapter->haldata; 573 519 struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv; 574 520 struct registry_priv *pregistrypriv = &Adapter->registrypriv; 521 + u32 reg; 575 522 576 523 if (Adapter->pwrctrlpriv.bkeepfwalive) { 577 524 if (haldata->odmpriv.RFCalibrateInfo.bIQKInitialized) { ··· 671 614 /* Hw bug which Hw initials RxFF boundary size to a value which is larger than the real Rx buffer size in 88E. */ 672 615 /* */ 673 616 /* Enable MACTXEN/MACRXEN block */ 674 - value16 = rtw_read16(Adapter, REG_CR); 617 + res = rtw_read16(Adapter, REG_CR, &value16); 618 + if (res) 619 + return _FAIL; 620 + 675 621 value16 |= (MACTXEN | MACRXEN); 676 622 rtw_write8(Adapter, REG_CR, value16); 677 623 678 624 /* Enable TX Report */ 679 625 /* Enable Tx Report Timer */ 680 - value8 = rtw_read8(Adapter, REG_TX_RPT_CTRL); 626 + res = rtw_read8(Adapter, REG_TX_RPT_CTRL, &value8); 627 + if (res) 628 + return _FAIL; 629 + 681 630 rtw_write8(Adapter, REG_TX_RPT_CTRL, (value8 | BIT(1) | BIT(0))); 682 631 /* Set MAX RPT MACID */ 683 632 rtw_write8(Adapter, REG_TX_RPT_CTRL + 1, 2);/* FOR sta mode ,0: bc/mc ,1:AP */ ··· 747 684 rtw_write16(Adapter, REG_TX_RPT_TIME, 0x3DF0); 748 685 749 686 /* enable tx DMA to drop the redundate data of packet */ 750 - rtw_write16(Adapter, REG_TXDMA_OFFSET_CHK, (rtw_read16(Adapter, REG_TXDMA_OFFSET_CHK) | DROP_DATA_EN)); 687 + res = rtw_read16(Adapter, REG_TXDMA_OFFSET_CHK, &value16); 688 + if (res) 689 + return _FAIL; 690 + 691 + rtw_write16(Adapter, REG_TXDMA_OFFSET_CHK, (value16 | DROP_DATA_EN)); 751 692 752 693 /* 2010/08/26 MH Merge from 8192CE. */ 753 694 if (pwrctrlpriv->rf_pwrstate == rf_on) { ··· 771 704 rtw_write8(Adapter, REG_USB_HRPWM, 0); 772 705 773 706 /* ack for xmit mgmt frames. */ 774 - rtw_write32(Adapter, REG_FWHW_TXQ_CTRL, rtw_read32(Adapter, REG_FWHW_TXQ_CTRL) | BIT(12)); 707 + res = rtw_read32(Adapter, REG_FWHW_TXQ_CTRL, &reg); 708 + if (res) 709 + return _FAIL; 710 + 711 + rtw_write32(Adapter, REG_FWHW_TXQ_CTRL, reg | BIT(12)); 775 712 776 713 exit: 777 714 return status; ··· 785 714 { 786 715 u8 val8; 787 716 struct hal_data_8188e *haldata = &Adapter->haldata; 717 + int res; 788 718 789 719 /* Stop Tx Report Timer. 0x4EC[Bit1]=b'0 */ 790 - val8 = rtw_read8(Adapter, REG_TX_RPT_CTRL); 720 + res = rtw_read8(Adapter, REG_TX_RPT_CTRL, &val8); 721 + if (res) 722 + return; 723 + 791 724 rtw_write8(Adapter, REG_TX_RPT_CTRL, val8 & (~BIT(1))); 792 725 793 726 /* stop rx */ 794 727 rtw_write8(Adapter, REG_CR, 0x0); 795 728 796 729 /* Run LPS WL RFOFF flow */ 797 - HalPwrSeqCmdParsing(Adapter, Rtl8188E_NIC_LPS_ENTER_FLOW); 730 + HalPwrSeqCmdParsing(Adapter, LPS_ENTER_FLOW); 798 731 799 732 /* 2. 0x1F[7:0] = 0 turn off RF */ 800 733 801 - val8 = rtw_read8(Adapter, REG_MCUFWDL); 734 + res = rtw_read8(Adapter, REG_MCUFWDL, &val8); 735 + if (res) 736 + return; 737 + 802 738 if ((val8 & RAM_DL_SEL) && Adapter->bFWReady) { /* 8051 RAM code */ 803 739 /* Reset MCU 0x2[10]=0. */ 804 - val8 = rtw_read8(Adapter, REG_SYS_FUNC_EN + 1); 740 + res = rtw_read8(Adapter, REG_SYS_FUNC_EN + 1, &val8); 741 + if (res) 742 + return; 743 + 805 744 val8 &= ~BIT(2); /* 0x2[10], FEN_CPUEN */ 806 745 rtw_write8(Adapter, REG_SYS_FUNC_EN + 1, val8); 807 746 } ··· 821 740 822 741 /* YJ,add,111212 */ 823 742 /* Disable 32k */ 824 - val8 = rtw_read8(Adapter, REG_32K_CTRL); 743 + res = rtw_read8(Adapter, REG_32K_CTRL, &val8); 744 + if (res) 745 + return; 746 + 825 747 rtw_write8(Adapter, REG_32K_CTRL, val8 & (~BIT(0))); 826 748 827 749 /* Card disable power action flow */ 828 - HalPwrSeqCmdParsing(Adapter, Rtl8188E_NIC_DISABLE_FLOW); 750 + HalPwrSeqCmdParsing(Adapter, DISABLE_FLOW); 829 751 830 752 /* Reset MCU IO Wrapper */ 831 - val8 = rtw_read8(Adapter, REG_RSV_CTRL + 1); 753 + res = rtw_read8(Adapter, REG_RSV_CTRL + 1, &val8); 754 + if (res) 755 + return; 756 + 832 757 rtw_write8(Adapter, REG_RSV_CTRL + 1, (val8 & (~BIT(3)))); 833 - val8 = rtw_read8(Adapter, REG_RSV_CTRL + 1); 758 + 759 + res = rtw_read8(Adapter, REG_RSV_CTRL + 1, &val8); 760 + if (res) 761 + return; 762 + 834 763 rtw_write8(Adapter, REG_RSV_CTRL + 1, val8 | BIT(3)); 835 764 836 765 /* YJ,test add, 111207. For Power Consumption. */ 837 - val8 = rtw_read8(Adapter, GPIO_IN); 766 + res = rtw_read8(Adapter, GPIO_IN, &val8); 767 + if (res) 768 + return; 769 + 838 770 rtw_write8(Adapter, GPIO_OUT, val8); 839 771 rtw_write8(Adapter, GPIO_IO_SEL, 0xFF);/* Reg0x46 */ 840 772 841 - val8 = rtw_read8(Adapter, REG_GPIO_IO_SEL); 773 + res = rtw_read8(Adapter, REG_GPIO_IO_SEL, &val8); 774 + if (res) 775 + return; 776 + 842 777 rtw_write8(Adapter, REG_GPIO_IO_SEL, (val8 << 4)); 843 - val8 = rtw_read8(Adapter, REG_GPIO_IO_SEL + 1); 778 + res = rtw_read8(Adapter, REG_GPIO_IO_SEL + 1, &val8); 779 + if (res) 780 + return; 781 + 844 782 rtw_write8(Adapter, REG_GPIO_IO_SEL + 1, val8 | 0x0F);/* Reg0x43 */ 845 783 rtw_write32(Adapter, REG_BB_PAD_CTRL, 0x00080808);/* set LNA ,TRSW,EX_PA Pin to output mode */ 846 784 haldata->bMacPwrCtrlOn = false; ··· 912 812 913 813 static void Hal_EfuseParseMACAddr_8188EU(struct adapter *adapt, u8 *hwinfo, bool AutoLoadFail) 914 814 { 915 - u16 i; 916 - u8 sMacAddr[6] = {0x00, 0xE0, 0x4C, 0x81, 0x88, 0x02}; 917 815 struct eeprom_priv *eeprom = &adapt->eeprompriv; 918 816 919 817 if (AutoLoadFail) { 920 - for (i = 0; i < 6; i++) 921 - eeprom->mac_addr[i] = sMacAddr[i]; 818 + eth_random_addr(eeprom->mac_addr); 922 819 } else { 923 820 /* Read Permanent MAC address */ 924 821 memcpy(eeprom->mac_addr, &hwinfo[EEPROM_MAC_ADDR_88EU], ETH_ALEN); ··· 926 829 { 927 830 struct eeprom_priv *eeprom = &Adapter->eeprompriv; 928 831 struct led_priv *ledpriv = &Adapter->ledpriv; 832 + u8 *efuse_buf; 929 833 u8 eeValue; 834 + int res; 930 835 931 836 /* check system boot selection */ 932 - eeValue = rtw_read8(Adapter, REG_9346CR); 933 - eeprom->EepromOrEfuse = (eeValue & BOOT_FROM_EEPROM); 837 + res = rtw_read8(Adapter, REG_9346CR, &eeValue); 838 + if (res) 839 + return; 840 + 934 841 eeprom->bautoload_fail_flag = !(eeValue & EEPROM_EN); 935 842 936 - if (!is_boot_from_eeprom(Adapter)) 937 - EFUSE_ShadowMapUpdate(Adapter); 843 + efuse_buf = kmalloc(EFUSE_MAP_LEN_88E, GFP_KERNEL); 844 + if (!efuse_buf) 845 + return; 846 + memset(efuse_buf, 0xFF, EFUSE_MAP_LEN_88E); 847 + 848 + if (!(eeValue & BOOT_FROM_EEPROM) && !eeprom->bautoload_fail_flag) { 849 + rtl8188e_EfusePowerSwitch(Adapter, true); 850 + rtl8188e_ReadEFuse(Adapter, EFUSE_MAP_LEN_88E, efuse_buf); 851 + rtl8188e_EfusePowerSwitch(Adapter, false); 852 + } 938 853 939 854 /* parse the eeprom/efuse content */ 940 - Hal_EfuseParseIDCode88E(Adapter, eeprom->efuse_eeprom_data); 941 - Hal_EfuseParseMACAddr_8188EU(Adapter, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); 855 + Hal_EfuseParseIDCode88E(Adapter, efuse_buf); 856 + Hal_EfuseParseMACAddr_8188EU(Adapter, efuse_buf, eeprom->bautoload_fail_flag); 942 857 943 - Hal_ReadPowerSavingMode88E(Adapter, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); 944 - Hal_ReadTxPowerInfo88E(Adapter, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); 945 - rtl8188e_EfuseParseChnlPlan(Adapter, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); 946 - Hal_EfuseParseXtal_8188E(Adapter, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); 947 - Hal_ReadAntennaDiversity88E(Adapter, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); 948 - Hal_ReadThermalMeter_88E(Adapter, eeprom->efuse_eeprom_data, eeprom->bautoload_fail_flag); 858 + Hal_ReadPowerSavingMode88E(Adapter, efuse_buf, eeprom->bautoload_fail_flag); 859 + Hal_ReadTxPowerInfo88E(Adapter, efuse_buf, eeprom->bautoload_fail_flag); 860 + rtl8188e_EfuseParseChnlPlan(Adapter, efuse_buf, eeprom->bautoload_fail_flag); 861 + Hal_EfuseParseXtal_8188E(Adapter, efuse_buf, eeprom->bautoload_fail_flag); 862 + Hal_ReadAntennaDiversity88E(Adapter, efuse_buf, eeprom->bautoload_fail_flag); 863 + Hal_ReadThermalMeter_88E(Adapter, efuse_buf, eeprom->bautoload_fail_flag); 949 864 950 865 ledpriv->bRegUseLed = true; 951 - } 952 - 953 - static void ResumeTxBeacon(struct adapter *adapt) 954 - { 955 - struct hal_data_8188e *haldata = &adapt->haldata; 956 - 957 - /* 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value */ 958 - /* which should be read from register to a global variable. */ 959 - 960 - rtw_write8(adapt, REG_FWHW_TXQ_CTRL + 2, (haldata->RegFwHwTxQCtrl) | BIT(6)); 961 - haldata->RegFwHwTxQCtrl |= BIT(6); 962 - rtw_write8(adapt, REG_TBTT_PROHIBIT + 1, 0xff); 963 - haldata->RegReg542 |= BIT(0); 964 - rtw_write8(adapt, REG_TBTT_PROHIBIT + 2, haldata->RegReg542); 965 - } 966 - 967 - static void StopTxBeacon(struct adapter *adapt) 968 - { 969 - struct hal_data_8188e *haldata = &adapt->haldata; 970 - 971 - /* 2010.03.01. Marked by tynli. No need to call workitem beacause we record the value */ 972 - /* which should be read from register to a global variable. */ 973 - 974 - rtw_write8(adapt, REG_FWHW_TXQ_CTRL + 2, (haldata->RegFwHwTxQCtrl) & (~BIT(6))); 975 - haldata->RegFwHwTxQCtrl &= (~BIT(6)); 976 - rtw_write8(adapt, REG_TBTT_PROHIBIT + 1, 0x64); 977 - haldata->RegReg542 &= ~(BIT(0)); 978 - rtw_write8(adapt, REG_TBTT_PROHIBIT + 2, haldata->RegReg542); 979 - 980 - /* todo: CheckFwRsvdPageContent(Adapter); 2010.06.23. Added by tynli. */ 981 - } 982 - 983 - static void hw_var_set_opmode(struct adapter *Adapter, u8 *val) 984 - { 985 - u8 val8; 986 - u8 mode = *((u8 *)val); 987 - 988 - /* disable Port0 TSF update */ 989 - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) | BIT(4)); 990 - 991 - /* set net_type */ 992 - val8 = rtw_read8(Adapter, MSR) & 0x0c; 993 - val8 |= mode; 994 - rtw_write8(Adapter, MSR, val8); 995 - 996 - if ((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_)) { 997 - StopTxBeacon(Adapter); 998 - 999 - rtw_write8(Adapter, REG_BCN_CTRL, 0x19);/* disable atim wnd */ 1000 - } else if (mode == _HW_STATE_ADHOC_) { 1001 - ResumeTxBeacon(Adapter); 1002 - rtw_write8(Adapter, REG_BCN_CTRL, 0x1a); 1003 - } else if (mode == _HW_STATE_AP_) { 1004 - ResumeTxBeacon(Adapter); 1005 - 1006 - rtw_write8(Adapter, REG_BCN_CTRL, 0x12); 1007 - 1008 - /* Set RCR */ 1009 - rtw_write32(Adapter, REG_RCR, 0x7000208e);/* CBSSID_DATA must set to 0,reject ICV_ERR packet */ 1010 - /* enable to rx data frame */ 1011 - rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF); 1012 - /* enable to rx ps-poll */ 1013 - rtw_write16(Adapter, REG_RXFLTMAP1, 0x0400); 1014 - 1015 - /* Beacon Control related register for first time */ 1016 - rtw_write8(Adapter, REG_BCNDMATIM, 0x02); /* 2ms */ 1017 - 1018 - rtw_write8(Adapter, REG_ATIMWND, 0x0a); /* 10ms */ 1019 - rtw_write16(Adapter, REG_BCNTCFG, 0x00); 1020 - rtw_write16(Adapter, REG_TBTT_PROHIBIT, 0xff04); 1021 - rtw_write16(Adapter, REG_TSFTR_SYN_OFFSET, 0x7fff);/* +32767 (~32ms) */ 1022 - 1023 - /* reset TSF */ 1024 - rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(0)); 1025 - 1026 - /* BIT(3) - If set 0, hw will clr bcnq when tx becon ok/fail or port 0 */ 1027 - rtw_write8(Adapter, REG_MBID_NUM, rtw_read8(Adapter, REG_MBID_NUM) | BIT(3) | BIT(4)); 1028 - 1029 - /* enable BCN0 Function for if1 */ 1030 - /* don't enable update TSF0 for if1 (due to TSF update when beacon/probe rsp are received) */ 1031 - rtw_write8(Adapter, REG_BCN_CTRL, (DIS_TSF_UDT0_NORMAL_CHIP | EN_BCN_FUNCTION | BIT(1))); 1032 - 1033 - /* dis BCN1 ATIM WND if if2 is station */ 1034 - rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1) | BIT(0)); 1035 - } 1036 - } 1037 - 1038 - void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val) 1039 - { 1040 - struct hal_data_8188e *haldata = &Adapter->haldata; 1041 - struct dm_priv *pdmpriv = &haldata->dmpriv; 1042 - struct odm_dm_struct *podmpriv = &haldata->odmpriv; 1043 - 1044 - switch (variable) { 1045 - case HW_VAR_SET_OPMODE: 1046 - hw_var_set_opmode(Adapter, val); 1047 - break; 1048 - case HW_VAR_BASIC_RATE: 1049 - { 1050 - u16 BrateCfg = 0; 1051 - u8 RateIndex = 0; 1052 - 1053 - /* 2007.01.16, by Emily */ 1054 - /* Select RRSR (in Legacy-OFDM and CCK) */ 1055 - /* For 8190, we select only 24M, 12M, 6M, 11M, 5.5M, 2M, and 1M from the Basic rate. */ 1056 - /* We do not use other rates. */ 1057 - HalSetBrateCfg(Adapter, val, &BrateCfg); 1058 - 1059 - /* 2011.03.30 add by Luke Lee */ 1060 - /* CCK 2M ACK should be disabled for some BCM and Atheros AP IOT */ 1061 - /* because CCK 2M has poor TXEVM */ 1062 - /* CCK 5.5M & 11M ACK should be enabled for better performance */ 1063 - 1064 - BrateCfg = (BrateCfg | 0xd) & 0x15d; 1065 - 1066 - BrateCfg |= 0x01; /* default enable 1M ACK rate */ 1067 - /* Set RRSR rate table. */ 1068 - rtw_write8(Adapter, REG_RRSR, BrateCfg & 0xff); 1069 - rtw_write8(Adapter, REG_RRSR + 1, (BrateCfg >> 8) & 0xff); 1070 - rtw_write8(Adapter, REG_RRSR + 2, rtw_read8(Adapter, REG_RRSR + 2) & 0xf0); 1071 - 1072 - /* Set RTS initial rate */ 1073 - while (BrateCfg > 0x1) { 1074 - BrateCfg = (BrateCfg >> 1); 1075 - RateIndex++; 1076 - } 1077 - /* Ziv - Check */ 1078 - rtw_write8(Adapter, REG_INIRTS_RATE_SEL, RateIndex); 1079 - } 1080 - break; 1081 - case HW_VAR_CORRECT_TSF: 1082 - { 1083 - u64 tsf; 1084 - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; 1085 - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; 1086 - 1087 - tsf = pmlmeext->TSFValue - do_div(pmlmeext->TSFValue, 1088 - pmlmeinfo->bcn_interval * 1024) - 1024; /* us */ 1089 - 1090 - if (((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)) 1091 - StopTxBeacon(Adapter); 1092 - 1093 - /* disable related TSF function */ 1094 - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) & (~BIT(3))); 1095 - 1096 - rtw_write32(Adapter, REG_TSFTR, tsf); 1097 - rtw_write32(Adapter, REG_TSFTR + 4, tsf >> 32); 1098 - 1099 - /* enable related TSF function */ 1100 - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) | BIT(3)); 1101 - 1102 - if (((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)) 1103 - ResumeTxBeacon(Adapter); 1104 - } 1105 - break; 1106 - case HW_VAR_MLME_SITESURVEY: 1107 - if (*((u8 *)val)) { /* under sitesurvey */ 1108 - /* config RCR to receive different BSSID & not to receive data frame */ 1109 - u32 v = rtw_read32(Adapter, REG_RCR); 1110 - v &= ~(RCR_CBSSID_BCN); 1111 - rtw_write32(Adapter, REG_RCR, v); 1112 - /* reject all data frame */ 1113 - rtw_write16(Adapter, REG_RXFLTMAP2, 0x00); 1114 - 1115 - /* disable update TSF */ 1116 - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) | BIT(4)); 1117 - } else { /* sitesurvey done */ 1118 - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; 1119 - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; 1120 - 1121 - if ((is_client_associated_to_ap(Adapter)) || 1122 - ((pmlmeinfo->state & 0x03) == WIFI_FW_ADHOC_STATE)) { 1123 - /* enable to rx data frame */ 1124 - rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF); 1125 - 1126 - /* enable update TSF */ 1127 - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) & (~BIT(4))); 1128 - } else if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE) { 1129 - rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF); 1130 - /* enable update TSF */ 1131 - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL) & (~BIT(4))); 1132 - } 1133 - rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR) | RCR_CBSSID_BCN); 1134 - } 1135 - break; 1136 - case HW_VAR_SLOT_TIME: 1137 - { 1138 - u8 u1bAIFS, aSifsTime; 1139 - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; 1140 - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; 1141 - 1142 - rtw_write8(Adapter, REG_SLOT, val[0]); 1143 - 1144 - if (pmlmeinfo->WMM_enable == 0) { 1145 - if (pmlmeext->cur_wireless_mode == WIRELESS_11B) 1146 - aSifsTime = 10; 1147 - else 1148 - aSifsTime = 16; 1149 - 1150 - u1bAIFS = aSifsTime + (2 * pmlmeinfo->slotTime); 1151 - 1152 - /* <Roger_EXP> Temporary removed, 2008.06.20. */ 1153 - rtw_write8(Adapter, REG_EDCA_VO_PARAM, u1bAIFS); 1154 - rtw_write8(Adapter, REG_EDCA_VI_PARAM, u1bAIFS); 1155 - rtw_write8(Adapter, REG_EDCA_BE_PARAM, u1bAIFS); 1156 - rtw_write8(Adapter, REG_EDCA_BK_PARAM, u1bAIFS); 1157 - } 1158 - } 1159 - break; 1160 - case HW_VAR_DM_FLAG: 1161 - podmpriv->SupportAbility = *((u8 *)val); 1162 - break; 1163 - case HW_VAR_DM_FUNC_OP: 1164 - if (val[0]) 1165 - podmpriv->BK_SupportAbility = podmpriv->SupportAbility; 1166 - else 1167 - podmpriv->SupportAbility = podmpriv->BK_SupportAbility; 1168 - break; 1169 - case HW_VAR_DM_FUNC_RESET: 1170 - podmpriv->SupportAbility = pdmpriv->InitODMFlag; 1171 - break; 1172 - case HW_VAR_DM_FUNC_CLR: 1173 - podmpriv->SupportAbility = 0; 1174 - break; 1175 - case HW_VAR_AMPDU_FACTOR: 1176 - { 1177 - u8 RegToSet_Normal[4] = {0x41, 0xa8, 0x72, 0xb9}; 1178 - u8 FactorToSet; 1179 - u8 *pRegToSet; 1180 - u8 index = 0; 1181 - 1182 - pRegToSet = RegToSet_Normal; /* 0xb972a841; */ 1183 - FactorToSet = *((u8 *)val); 1184 - if (FactorToSet <= 3) { 1185 - FactorToSet = (1 << (FactorToSet + 2)); 1186 - if (FactorToSet > 0xf) 1187 - FactorToSet = 0xf; 1188 - 1189 - for (index = 0; index < 4; index++) { 1190 - if ((pRegToSet[index] & 0xf0) > (FactorToSet << 4)) 1191 - pRegToSet[index] = (pRegToSet[index] & 0x0f) | (FactorToSet << 4); 1192 - 1193 - if ((pRegToSet[index] & 0x0f) > FactorToSet) 1194 - pRegToSet[index] = (pRegToSet[index] & 0xf0) | (FactorToSet); 1195 - 1196 - rtw_write8(Adapter, (REG_AGGLEN_LMT + index), pRegToSet[index]); 1197 - } 1198 - } 1199 - } 1200 - break; 1201 - case HW_VAR_H2C_MEDIA_STATUS_RPT: 1202 - rtl8188e_set_FwMediaStatus_cmd(Adapter, (*(__le16 *)val)); 1203 - break; 1204 - default: 1205 - break; 1206 - } 1207 - 866 + kfree(efuse_buf); 1208 867 } 1209 868 1210 869 void UpdateHalRAMask8188EUsb(struct adapter *adapt, u32 mac_id, u8 rssi_level) ··· 1043 1190 struct mlme_ext_priv *pmlmeext = &adapt->mlmeextpriv; 1044 1191 struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; 1045 1192 u32 bcn_ctrl_reg = REG_BCN_CTRL; 1193 + int res; 1194 + u8 reg; 1046 1195 /* reset TSF, enable update TSF, correcting TSF On Beacon */ 1047 1196 1048 1197 /* BCN interval */ ··· 1055 1200 1056 1201 rtw_write8(adapt, REG_SLOT, 0x09); 1057 1202 1058 - value32 = rtw_read32(adapt, REG_TCR); 1203 + res = rtw_read32(adapt, REG_TCR, &value32); 1204 + if (res) 1205 + return; 1206 + 1059 1207 value32 &= ~TSFRST; 1060 1208 rtw_write32(adapt, REG_TCR, value32); 1061 1209 ··· 1071 1213 1072 1214 _BeaconFunctionEnable(adapt, true, true); 1073 1215 1074 - ResumeTxBeacon(adapt); 1216 + rtw_resume_tx_beacon(adapt); 1075 1217 1076 - rtw_write8(adapt, bcn_ctrl_reg, rtw_read8(adapt, bcn_ctrl_reg) | BIT(1)); 1218 + res = rtw_read8(adapt, bcn_ctrl_reg, &reg); 1219 + if (res) 1220 + return; 1221 + 1222 + rtw_write8(adapt, bcn_ctrl_reg, reg | BIT(1)); 1077 1223 } 1078 1224 1079 1225 void rtl8188eu_init_default_value(struct adapter *adapt)
+20 -13
drivers/staging/r8188eu/hal/usb_ops_linux.c
··· 94 94 return status; 95 95 } 96 96 97 - u8 rtw_read8(struct adapter *adapter, u32 addr) 97 + int __must_check rtw_read8(struct adapter *adapter, u32 addr, u8 *data) 98 98 { 99 99 struct io_priv *io_priv = &adapter->iopriv; 100 100 struct intf_hdl *intf = &io_priv->intf; 101 101 u16 value = addr & 0xffff; 102 - u8 data; 103 102 104 - usb_read(intf, value, &data, 1); 105 - 106 - return data; 103 + return usb_read(intf, value, data, 1); 107 104 } 108 105 109 - u16 rtw_read16(struct adapter *adapter, u32 addr) 106 + int __must_check rtw_read16(struct adapter *adapter, u32 addr, u16 *data) 110 107 { 111 108 struct io_priv *io_priv = &adapter->iopriv; 112 109 struct intf_hdl *intf = &io_priv->intf; 113 110 u16 value = addr & 0xffff; 114 - __le16 data; 111 + __le16 le_data; 112 + int res; 115 113 116 - usb_read(intf, value, &data, 2); 114 + res = usb_read(intf, value, &le_data, 2); 115 + if (res) 116 + return res; 117 117 118 - return le16_to_cpu(data); 118 + *data = le16_to_cpu(le_data); 119 + 120 + return 0; 119 121 } 120 122 121 - u32 rtw_read32(struct adapter *adapter, u32 addr) 123 + int __must_check rtw_read32(struct adapter *adapter, u32 addr, u32 *data) 122 124 { 123 125 struct io_priv *io_priv = &adapter->iopriv; 124 126 struct intf_hdl *intf = &io_priv->intf; 125 127 u16 value = addr & 0xffff; 126 - __le32 data; 128 + __le32 le_data; 129 + int res; 127 130 128 - usb_read(intf, value, &data, 4); 131 + res = usb_read(intf, value, &le_data, 4); 132 + if (res) 133 + return res; 129 134 130 - return le32_to_cpu(data); 135 + *data = le32_to_cpu(le_data); 136 + 137 + return 0; 131 138 } 132 139 133 140 int rtw_write8(struct adapter *adapter, u32 addr, u8 val)
-13
drivers/staging/r8188eu/include/Hal8188EPwrSeq.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2 - /* Copyright(c) 2007 - 2011 Realtek Corporation. */ 3 - 4 - #ifndef __HAL8188EPWRSEQ_H__ 5 - #define __HAL8188EPWRSEQ_H__ 6 - 7 - #include "HalPwrSeqCmd.h" 8 - 9 - extern struct wl_pwr_cfg rtl8188E_power_on_flow[]; 10 - extern struct wl_pwr_cfg rtl8188E_card_disable_flow[]; 11 - extern struct wl_pwr_cfg rtl8188E_enter_lps_flow[]; 12 - 13 - #endif /* __HAL8188EPWRSEQ_H__ */
-13
drivers/staging/r8188eu/include/Hal8188ERateAdaptive.h
··· 22 22 le32_to_cpu((*(__le32 *)(__rxstatusdesc + 16)) 23 23 #define GET_TX_RPT2_DESC_MACID_VALID_2_88E(__rxstatusdesc) \ 24 24 le32_to_cpu((*(__le32 *)(__rxstatusdesc + 20)) 25 - 26 - #define GET_TX_REPORT_TYPE1_RERTY_0(__paddr) \ 27 - le16_get_bits(*(__le16 *)__paddr, GENMASK(15, 0)) 28 - #define GET_TX_REPORT_TYPE1_RERTY_1(__paddr) \ 29 - LE_BITS_TO_1BYTE(__paddr + 2, 0, 8) 30 - #define GET_TX_REPORT_TYPE1_RERTY_2(__paddr) \ 31 - LE_BITS_TO_1BYTE(__paddr + 3, 0, 8) 32 - #define GET_TX_REPORT_TYPE1_RERTY_3(__paddr) \ 33 - LE_BITS_TO_1BYTE(__paddr + 4, 0, 8) 34 - #define GET_TX_REPORT_TYPE1_RERTY_4(__paddr) \ 35 - LE_BITS_TO_1BYTE(__paddr + 5, 0, 8) 36 - #define GET_TX_REPORT_TYPE1_DROP_0(__paddr) \ 37 - LE_BITS_TO_1BYTE(__paddr + 6, 0, 8) 38 25 /* End rate adaptive define */ 39 26 40 27 int ODM_RAInfo_Init_all(struct odm_dm_struct *dm_odm);
+5 -46
drivers/staging/r8188eu/include/HalPwrSeqCmd.h
··· 6 6 7 7 #include "drv_types.h" 8 8 9 - /*---------------------------------------------*/ 10 - /* 3 The value of cmd: 4 bits */ 11 - /*---------------------------------------------*/ 12 - 13 - #define PWR_CMD_WRITE 0x01 14 - /* offset: the read register offset */ 15 - /* msk: the mask of the write bits */ 16 - /* value: write value */ 17 - /* note: driver shall implement this cmd by read & msk after write */ 18 - 19 - #define PWR_CMD_POLLING 0x02 20 - /* offset: the read register offset */ 21 - /* msk: the mask of the polled value */ 22 - /* value: the value to be polled, masked by the msd field. */ 23 - /* note: driver shall implement this cmd by */ 24 - /* do{ */ 25 - /* if ( (Read(offset) & msk) == (value & msk) ) */ 26 - /* break; */ 27 - /* } while (not timeout); */ 28 - 29 - #define PWR_CMD_DELAY 0x03 30 - /* offset: the value to delay */ 31 - /* msk: N/A */ 32 - /* value: the unit of delay, 0: us, 1: ms */ 33 - 34 - #define PWR_CMD_END 0x04 35 - /* offset: N/A */ 36 - /* msk: N/A */ 37 - /* value: N/A */ 38 - 39 - enum pwrseq_cmd_delat_unit { 40 - PWRSEQ_DELAY_US, 41 - PWRSEQ_DELAY_MS, 9 + enum r8188eu_pwr_seq { 10 + PWR_ON_FLOW, 11 + DISABLE_FLOW, 12 + LPS_ENTER_FLOW, 42 13 }; 43 - 44 - struct wl_pwr_cfg { 45 - u16 offset; 46 - u8 cmd:4; 47 - u8 msk; 48 - u8 value; 49 - }; 50 - 51 - #define GET_PWR_CFG_OFFSET(__PWR_CMD) __PWR_CMD.offset 52 - #define GET_PWR_CFG_CMD(__PWR_CMD) __PWR_CMD.cmd 53 - #define GET_PWR_CFG_MASK(__PWR_CMD) __PWR_CMD.msk 54 - #define GET_PWR_CFG_VALUE(__PWR_CMD) __PWR_CMD.value 55 14 56 15 /* Prototype of protected function. */ 57 - u8 HalPwrSeqCmdParsing(struct adapter *padapter, struct wl_pwr_cfg PwrCfgCmd[]); 16 + u8 HalPwrSeqCmdParsing(struct adapter *padapter, enum r8188eu_pwr_seq seq); 58 17 59 18 #endif
-52
drivers/staging/r8188eu/include/basic_types.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2 - /* Copyright(c) 2007 - 2011 Realtek Corporation. */ 3 - 4 - #ifndef __BASIC_TYPES_H__ 5 - #define __BASIC_TYPES_H__ 6 - 7 - #include <linux/types.h> 8 - #define NDIS_OID uint 9 - 10 - typedef void (*proc_t)(void *); 11 - 12 - #define FIELD_OFFSET(s, field) ((ssize_t)&((s *)(0))->field) 13 - 14 - /* port from fw */ 15 - /* TODO: Macros Below are Sync from SD7-Driver. It is necessary 16 - * to check correctness */ 17 - 18 - /* 19 - * Call endian free function when 20 - * 1. Read/write packet content. 21 - * 2. Before write integer to IO. 22 - * 3. After read integer from IO. 23 - */ 24 - 25 - /* Convert little data endian to host ordering */ 26 - #define EF1BYTE(_val) \ 27 - ((u8)(_val)) 28 - 29 - /* Create a bit mask */ 30 - #define BIT_LEN_MASK_8(__bitlen) \ 31 - (0xFF >> (8 - (__bitlen))) 32 - 33 - /*Description: 34 - * Return 4-byte value in host byte ordering from 35 - * 4-byte pointer in little-endian system. 36 - */ 37 - #define LE_P1BYTE_TO_HOST_1BYTE(__pstart) \ 38 - (EF1BYTE(*((u8 *)(__pstart)))) 39 - 40 - /*Description: 41 - Translate subfield (continuous bits in little-endian) of 4-byte 42 - value to host byte ordering.*/ 43 - #define LE_BITS_TO_1BYTE(__pstart, __bitoffset, __bitlen) \ 44 - ( \ 45 - (LE_P1BYTE_TO_HOST_1BYTE(__pstart) >> (__bitoffset)) & \ 46 - BIT_LEN_MASK_8(__bitlen) \ 47 - ) 48 - 49 - #define N_BYTE_ALIGMENT(__value, __aligment) ((__aligment == 1) ? \ 50 - (__value) : (((__value + __aligment - 1) / __aligment) * __aligment)) 51 - 52 - #endif /* __BASIC_TYPES_H__ */
-3
drivers/staging/r8188eu/include/hal_com.h
··· 131 131 #define REG_NOA_DESC_START 0x05E8 132 132 #define REG_NOA_DESC_COUNT 0x05EC 133 133 134 - #include "HalVerDef.h" 135 - void dump_chip_info(struct HAL_VERSION ChipVersion); 136 - 137 134 /* return the final channel plan decision */ 138 135 u8 hal_com_get_channel_plan(struct adapter *padapter, 139 136 u8 hw_channel_plan,
+1 -19
drivers/staging/r8188eu/include/hal_intf.h
··· 8 8 #include "drv_types.h" 9 9 #include "Hal8188EPhyCfg.h" 10 10 11 - enum hw_variables { 12 - HW_VAR_SET_OPMODE, 13 - HW_VAR_BASIC_RATE, 14 - HW_VAR_CORRECT_TSF, 15 - HW_VAR_MLME_SITESURVEY, 16 - HW_VAR_SLOT_TIME, 17 - HW_VAR_DM_FLAG, 18 - HW_VAR_DM_FUNC_OP, 19 - HW_VAR_DM_FUNC_RESET, 20 - HW_VAR_DM_FUNC_CLR, 21 - HW_VAR_AMPDU_FACTOR, 22 - HW_VAR_H2C_MEDIA_STATUS_RPT, 23 - }; 24 - 25 11 typedef s32 (*c2h_id_filter)(u8 id); 26 - 27 - #define is_boot_from_eeprom(adapter) (adapter->eeprompriv.EepromOrEfuse) 28 12 29 13 void rtl8188eu_interface_configure(struct adapter *adapt); 30 14 void ReadAdapterInfo8188EU(struct adapter *Adapter); ··· 16 32 void rtl8188e_SetHalODMVar(struct adapter *Adapter, void *pValue1, bool bSet); 17 33 u32 rtl8188eu_InitPowerOn(struct adapter *adapt); 18 34 void rtl8188e_EfusePowerSwitch(struct adapter *pAdapter, u8 PwrState); 19 - void rtl8188e_ReadEFuse(struct adapter *Adapter, u16 _offset, u16 _size_byte, u8 *pbuf); 35 + void rtl8188e_ReadEFuse(struct adapter *Adapter, u16 _size_byte, u8 *pbuf); 20 36 21 37 void hal_notch_filter_8188e(struct adapter *adapter, bool enable); 22 38 ··· 27 43 struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt); 28 44 29 45 unsigned int rtl8188eu_inirp_init(struct adapter *Adapter); 30 - 31 - void SetHwReg8188EU(struct adapter *Adapter, u8 variable, u8 *val); 32 46 33 47 uint rtw_hal_init(struct adapter *padapter); 34 48 uint rtw_hal_deinit(struct adapter *padapter);
-7
drivers/staging/r8188eu/include/ieee80211.h
··· 624 624 ACT_PUBLIC_MAX 625 625 }; 626 626 627 - /* BACK action code */ 628 - enum rtw_ieee80211_back_actioncode { 629 - RTW_WLAN_ACTION_ADDBA_REQ = 0, 630 - RTW_WLAN_ACTION_ADDBA_RESP = 1, 631 - RTW_WLAN_ACTION_DELBA = 2, 632 - }; 633 - 634 627 #define OUI_MICROSOFT 0x0050f2 /* Microsoft (also used in Wi-Fi specs) 635 628 * 00:50:F2 */ 636 629 #define WME_OUI_TYPE 2
-3
drivers/staging/r8188eu/include/osdep_service.h
··· 5 5 #define __OSDEP_SERVICE_H_ 6 6 7 7 #include <linux/sched/signal.h> 8 - #include "basic_types.h" 9 8 10 9 #define _FAIL 0 11 10 #define _SUCCESS 1 ··· 75 76 INIT_LIST_HEAD(&((q)->queue)); \ 76 77 spin_lock_init(&((q)->lock)); \ 77 78 } while (0) 78 - 79 - void rtw_usleep_os(int us); 80 79 81 80 static inline unsigned char _cancel_timer_ex(struct timer_list *ptimer) 82 81 {
-5
drivers/staging/r8188eu/include/rtl8188e_hal.h
··· 26 26 #include "odm_RegConfig8188E.h" 27 27 #include "odm_RTL8188E.h" 28 28 29 - /* RTL8188E Power Configuration CMDs for USB/SDIO interfaces */ 30 - #define Rtl8188E_NIC_PWR_ON_FLOW rtl8188E_power_on_flow 31 - #define Rtl8188E_NIC_DISABLE_FLOW rtl8188E_card_disable_flow 32 - #define Rtl8188E_NIC_LPS_ENTER_FLOW rtl8188E_enter_lps_flow 33 - 34 29 #define DRVINFO_SZ 4 /* unit is 8bytes */ 35 30 #define PageNum_128(_Len) (u32)(((_Len)>>7) + ((_Len) & 0x7F ? 1 : 0)) 36 31
-143
drivers/staging/r8188eu/include/rtl8188e_spec.h
··· 9 9 #define HAL_PS_TIMER_INT_DELAY 50 /* 50 microseconds */ 10 10 #define HAL_92C_NAV_UPPER_UNIT 128 /* micro-second */ 11 11 12 - #define MAC_ADDR_LEN 6 13 12 /* 8188E PKT_BUFF_ACCESS_CTRL value */ 14 13 #define TXPKT_BUF_SELECT 0x69 15 14 #define RXPKT_BUF_SELECT 0xA5 ··· 425 426 /* Min Spacing related settings. */ 426 427 #define MAX_MSS_DENSITY_2T 0x13 427 428 #define MAX_MSS_DENSITY_1T 0x0A 428 - 429 - /* EEPROM enable when set 1 */ 430 - #define CmdEEPROM_En BIT(5) 431 - /* System EEPROM select, 0: boot from E-FUSE, 1: The EEPROM used is 9346 */ 432 - #define CmdEERPOMSEL BIT(4) 433 - #define Cmd9346CR_9356SEL BIT(4) 434 429 435 430 /* 8192C GPIO MUX Configuration Register (offset 0x40, 4 byte) */ 436 431 #define GPIOSEL_GPIO 0 ··· 1051 1058 #define SCR_NoSKMC BIT(5) /* No Key Search Multicast */ 1052 1059 #define SCR_TXBCUSEDK BIT(6) /* Force Tx Bcast pkt Use Default Key */ 1053 1060 #define SCR_RXBCUSEDK BIT(7) /* Force Rx Bcast pkt Use Default Key */ 1054 - 1055 - /* RTL8188E SDIO Configuration */ 1056 - 1057 - /* I/O bus domain address mapping */ 1058 - #define SDIO_LOCAL_BASE 0x10250000 1059 - #define WLAN_IOREG_BASE 0x10260000 1060 - #define FIRMWARE_FIFO_BASE 0x10270000 1061 - #define TX_HIQ_BASE 0x10310000 1062 - #define TX_MIQ_BASE 0x10320000 1063 - #define TX_LOQ_BASE 0x10330000 1064 - #define RX_RX0FF_BASE 0x10340000 1065 - 1066 - /* SDIO host local register space mapping. */ 1067 - #define SDIO_LOCAL_MSK 0x0FFF 1068 - #define WLAN_IOREG_MSK 0x7FFF 1069 - #define WLAN_FIFO_MSK 0x1FFF /* Aggregation Length[12:0] */ 1070 - #define WLAN_RX0FF_MSK 0x0003 1071 - 1072 - /* Without ref to the SDIO Device ID */ 1073 - #define SDIO_WITHOUT_REF_DEVICE_ID 0 1074 - #define SDIO_LOCAL_DEVICE_ID 0 /* 0b[16], 000b[15:13] */ 1075 - #define WLAN_TX_HIQ_DEVICE_ID 4 /* 0b[16], 100b[15:13] */ 1076 - #define WLAN_TX_MIQ_DEVICE_ID 5 /* 0b[16], 101b[15:13] */ 1077 - #define WLAN_TX_LOQ_DEVICE_ID 6 /* 0b[16], 110b[15:13] */ 1078 - #define WLAN_RX0FF_DEVICE_ID 7 /* 0b[16], 111b[15:13] */ 1079 - #define WLAN_IOREG_DEVICE_ID 8 /* 1b[16] */ 1080 - 1081 - /* SDIO Tx Free Page Index */ 1082 - #define HI_QUEUE_IDX 0 1083 - #define MID_QUEUE_IDX 1 1084 - #define LOW_QUEUE_IDX 2 1085 - #define PUBLIC_QUEUE_IDX 3 1086 - 1087 - #define SDIO_MAX_TX_QUEUE 3 /* HIQ, MIQ and LOQ */ 1088 - #define SDIO_MAX_RX_QUEUE 1 1089 - 1090 - /* SDIO Tx Control */ 1091 - #define SDIO_REG_TX_CTRL 0x0000 1092 - /* SDIO Host Interrupt Mask */ 1093 - #define SDIO_REG_HIMR 0x0014 1094 - /* SDIO Host Interrupt Service Routine */ 1095 - #define SDIO_REG_HISR 0x0018 1096 - /* HCI Current Power Mode */ 1097 - #define SDIO_REG_HCPWM 0x0019 1098 - /* RXDMA Request Length */ 1099 - #define SDIO_REG_RX0_REQ_LEN 0x001C 1100 - /* Free Tx Buffer Page */ 1101 - #define SDIO_REG_FREE_TXPG 0x0020 1102 - /* HCI Current Power Mode 1 */ 1103 - #define SDIO_REG_HCPWM1 0x0024 1104 - /* HCI Current Power Mode 2 */ 1105 - #define SDIO_REG_HCPWM2 0x0026 1106 - /* HTSF Informaion */ 1107 - #define SDIO_REG_HTSFR_INFO 0x0030 1108 - /* HCI Request Power Mode 1 */ 1109 - #define SDIO_REG_HRPWM1 0x0080 1110 - /* HCI Request Power Mode 2 */ 1111 - #define SDIO_REG_HRPWM2 0x0082 1112 - /* HCI Power Save Clock */ 1113 - #define SDIO_REG_HPS_CLKR 0x0084 1114 - /* SDIO HCI Suspend Control */ 1115 - #define SDIO_REG_HSUS_CTRL 0x0086 1116 - /* SDIO Host Extension Interrupt Mask Always */ 1117 - #define SDIO_REG_HIMR_ON 0x0090 1118 - /* SDIO Host Extension Interrupt Status Always */ 1119 - #define SDIO_REG_HISR_ON 0x0091 1120 - 1121 - #define SDIO_HIMR_DISABLED 0 1122 - 1123 - /* RTL8188E SDIO Host Interrupt Mask Register */ 1124 - #define SDIO_HIMR_RX_REQUEST_MSK BIT(0) 1125 - #define SDIO_HIMR_AVAL_MSK BIT(1) 1126 - #define SDIO_HIMR_TXERR_MSK BIT(2) 1127 - #define SDIO_HIMR_RXERR_MSK BIT(3) 1128 - #define SDIO_HIMR_TXFOVW_MSK BIT(4) 1129 - #define SDIO_HIMR_RXFOVW_MSK BIT(5) 1130 - #define SDIO_HIMR_TXBCNOK_MSK BIT(6) 1131 - #define SDIO_HIMR_TXBCNERR_MSK BIT(7) 1132 - #define SDIO_HIMR_BCNERLY_INT_MSK BIT(16) 1133 - #define SDIO_HIMR_C2HCMD_MSK BIT(17) 1134 - #define SDIO_HIMR_CPWM1_MSK BIT(18) 1135 - #define SDIO_HIMR_CPWM2_MSK BIT(19) 1136 - #define SDIO_HIMR_HSISR_IND_MSK BIT(20) 1137 - #define SDIO_HIMR_GTINT3_IND_MSK BIT(21) 1138 - #define SDIO_HIMR_GTINT4_IND_MSK BIT(22) 1139 - #define SDIO_HIMR_PSTIMEOUT_MSK BIT(23) 1140 - #define SDIO_HIMR_OCPINT_MSK BIT(24) 1141 - #define SDIO_HIMR_ATIMEND_MSK BIT(25) 1142 - #define SDIO_HIMR_ATIMEND_E_MSK BIT(26) 1143 - #define SDIO_HIMR_CTWEND_MSK BIT(27) 1144 - 1145 - /* RTL8188E SDIO Specific */ 1146 - #define SDIO_HIMR_MCU_ERR_MSK BIT(28) 1147 - #define SDIO_HIMR_TSF_BIT32_TOGGLE_MSK BIT(29) 1148 - 1149 - /* SDIO Host Interrupt Service Routine */ 1150 - #define SDIO_HISR_RX_REQUEST BIT(0) 1151 - #define SDIO_HISR_AVAL BIT(1) 1152 - #define SDIO_HISR_TXERR BIT(2) 1153 - #define SDIO_HISR_RXERR BIT(3) 1154 - #define SDIO_HISR_TXFOVW BIT(4) 1155 - #define SDIO_HISR_RXFOVW BIT(5) 1156 - #define SDIO_HISR_TXBCNOK BIT(6) 1157 - #define SDIO_HISR_TXBCNERR BIT(7) 1158 - #define SDIO_HISR_BCNERLY_INT BIT(16) 1159 - #define SDIO_HISR_C2HCMD BIT(17) 1160 - #define SDIO_HISR_CPWM1 BIT(18) 1161 - #define SDIO_HISR_CPWM2 BIT(19) 1162 - #define SDIO_HISR_HSISR_IND BIT(20) 1163 - #define SDIO_HISR_GTINT3_IND BIT(21) 1164 - #define SDIO_HISR_GTINT4_IND BIT(22) 1165 - #define SDIO_HISR_PSTIME BIT(23) 1166 - #define SDIO_HISR_OCPINT BIT(24) 1167 - #define SDIO_HISR_ATIMEND BIT(25) 1168 - #define SDIO_HISR_ATIMEND_E BIT(26) 1169 - #define SDIO_HISR_CTWEND BIT(27) 1170 - 1171 - /* RTL8188E SDIO Specific */ 1172 - #define SDIO_HISR_MCU_ERR BIT(28) 1173 - #define SDIO_HISR_TSF_BIT32_TOGGLE BIT(29) 1174 - 1175 - #define MASK_SDIO_HISR_CLEAR \ 1176 - (SDIO_HISR_TXERR | SDIO_HISR_RXERR | SDIO_HISR_TXFOVW |\ 1177 - SDIO_HISR_RXFOVW | SDIO_HISR_TXBCNOK | SDIO_HISR_TXBCNERR |\ 1178 - SDIO_HISR_C2HCMD | SDIO_HISR_CPWM1 | SDIO_HISR_CPWM2 |\ 1179 - SDIO_HISR_HSISR_IND | SDIO_HISR_GTINT3_IND | SDIO_HISR_GTINT4_IND |\ 1180 - SDIO_HISR_PSTIMEOUT | SDIO_HISR_OCPINT) 1181 - 1182 - /* SDIO HCI Suspend Control Register */ 1183 - #define HCI_RESUME_PWR_RDY BIT(1) 1184 - #define HCI_SUS_CTRL BIT(0) 1185 - 1186 - /* SDIO Tx FIFO related */ 1187 - /* The number of Tx FIFO free page */ 1188 - #define SDIO_TX_FREE_PG_QUEUE 4 1189 - #define SDIO_TX_FIFO_PAGE_SZ 128 1190 1061 1191 1062 /* 0xFE00h ~ 0xFE55h USB Configuration */ 1192 1063
-10
drivers/staging/r8188eu/include/rtw_eeprom.h
··· 7 7 #include "osdep_service.h" 8 8 #include "drv_types.h" 9 9 10 - #define HWSET_MAX_SIZE_512 512 11 - 12 10 struct eeprom_priv { 13 11 u8 bautoload_fail_flag; 14 12 u8 mac_addr[ETH_ALEN] __aligned(2); /* PermanentAddress */ 15 - u8 EepromOrEfuse; 16 - u8 efuse_eeprom_data[HWSET_MAX_SIZE_512] __aligned(4); 17 13 }; 18 - 19 - void eeprom_write16(struct adapter *padapter, u16 reg, u16 data); 20 - u16 eeprom_read16(struct adapter *padapter, u16 reg); 21 - void read_eeprom_content(struct adapter *padapter); 22 - void eeprom_read_sz(struct adapter *adapt, u16 reg, u8 *data, u32 sz); 23 - void read_eeprom_content_by_attrib(struct adapter *padapter); 24 14 25 15 #endif /* __RTL871X_EEPROM_H__ */
-2
drivers/staging/r8188eu/include/rtw_efuse.h
··· 8 8 9 9 void ReadEFuseByte(struct adapter *adapter, u16 _offset, u8 *pbuf); 10 10 11 - void EFUSE_ShadowMapUpdate(struct adapter *adapter); 12 - 13 11 #endif
+4 -4
drivers/staging/r8188eu/include/rtw_io.h
··· 220 220 void _rtw_attrib_read(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); 221 221 void _rtw_attrib_write(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); 222 222 223 - u8 rtw_read8(struct adapter *adapter, u32 addr); 224 - u16 rtw_read16(struct adapter *adapter, u32 addr); 225 - u32 rtw_read32(struct adapter *adapter, u32 addr); 223 + int __must_check rtw_read8(struct adapter *adapter, u32 addr, u8 *data); 224 + int __must_check rtw_read16(struct adapter *adapter, u32 addr, u16 *data); 225 + int __must_check rtw_read32(struct adapter *adapter, u32 addr, u32 *data); 226 226 void _rtw_read_mem(struct adapter *adapter, u32 addr, u32 cnt, u8 *pmem); 227 227 u32 rtw_read_port(struct adapter *adapter, u8 *pmem); 228 228 void rtw_read_port_cancel(struct adapter *adapter); ··· 283 283 void async_bus_io(struct io_queue *pio_q); 284 284 void bus_sync_io(struct io_queue *pio_q); 285 285 u32 _ioreq2rwmem(struct io_queue *pio_q); 286 - void dev_power_down(struct adapter * Adapter, u8 bpwrup); 286 + void dev_power_down(struct adapter *Adapter, u8 bpwrup); 287 287 288 288 #define PlatformEFIOWrite1Byte(_a,_b,_c) \ 289 289 rtw_write8(_a,_b,_c)
+8 -16
drivers/staging/r8188eu/include/rtw_iol.h
··· 41 41 void read_efuse_from_txpktbuf(struct adapter *adapter, int bcnhead, 42 42 u8 *content, u16 *size); 43 43 44 - int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, 45 - u8 value, u8 mask); 46 - int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, 47 - u16 value, u16 mask); 48 - int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, 49 - u32 value, u32 mask); 50 - int _rtw_IOL_append_WRF_cmd(struct xmit_frame *xmit_frame, u8 rf_path, 51 - u16 addr, u32 value, u32 mask); 52 - #define rtw_IOL_append_WB_cmd(xmit_frame, addr, value, mask) \ 53 - _rtw_IOL_append_WB_cmd((xmit_frame), (addr), (value) ,(mask)) 54 - #define rtw_IOL_append_WW_cmd(xmit_frame, addr, value, mask) \ 55 - _rtw_IOL_append_WW_cmd((xmit_frame), (addr), (value),(mask)) 56 - #define rtw_IOL_append_WD_cmd(xmit_frame, addr, value, mask) \ 57 - _rtw_IOL_append_WD_cmd((xmit_frame), (addr), (value), (mask)) 58 - #define rtw_IOL_append_WRF_cmd(xmit_frame, rf_path, addr, value, mask) \ 59 - _rtw_IOL_append_WRF_cmd((xmit_frame),(rf_path), (addr), (value), (mask)) 44 + int rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, 45 + u8 value, u8 mask); 46 + int rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, 47 + u16 value, u16 mask); 48 + int rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, 49 + u32 value, u32 mask); 50 + int rtw_IOL_append_WRF_cmd(struct xmit_frame *xmit_frame, u8 rf_path, 51 + u16 addr, u32 value, u32 mask); 60 52 61 53 u8 rtw_IOL_cmd_boundary_handle(struct xmit_frame *pxmit_frame); 62 54
+3 -6
drivers/staging/r8188eu/include/rtw_led.h
··· 37 37 LED_BLINK_RUNTOP = 13, /* Customized for RunTop */ 38 38 }; 39 39 40 - struct LED_871x { 40 + struct led_priv { 41 41 struct adapter *padapter; 42 + 43 + bool bRegUseLed; 42 44 43 45 enum LED_STATE_871x CurrLedState; /* Current LED state. */ 44 46 enum LED_STATE_871x BlinkingLedState; /* Next state for blinking, ··· 58 56 bool bLedLinkBlinkInProgress; 59 57 bool bLedScanBlinkInProgress; 60 58 struct delayed_work blink_work; 61 - }; 62 - 63 - struct led_priv{ 64 - struct LED_871x SwLed0; 65 - bool bRegUseLed; 66 59 }; 67 60 68 61 void rtl8188eu_InitSwLeds(struct adapter *padapter);
+8 -11
drivers/staging/r8188eu/include/rtw_mlme_ext.h
··· 424 424 int allocate_fw_sta_entry(struct adapter *padapter); 425 425 void flush_all_cam_entry(struct adapter *padapter); 426 426 427 + void rtw_mlme_under_site_survey(struct adapter *adapter); 428 + void rtw_mlme_site_survey_done(struct adapter *adapter); 429 + 427 430 void site_survey(struct adapter *padapter); 428 431 u8 collect_bss_info(struct adapter *padapter, struct recv_frame *precv_frame, 429 432 struct wlan_bssid_ex *bssid); ··· 458 455 void update_IOT_info(struct adapter *padapter); 459 456 void update_capinfo(struct adapter *adapter, u16 updatecap); 460 457 void update_wireless_mode(struct adapter *padapter); 458 + void rtw_set_basic_rate(struct adapter *adapter, u8 *rates); 461 459 void update_tx_basic_rate(struct adapter *padapter, u8 modulation); 462 460 void update_bmc_sta_support_rate(struct adapter *padapter, u32 mac_id); 463 461 int update_sta_support_rate(struct adapter *padapter, u8 *pvar_ie, ··· 472 468 void Update_RA_Entry(struct adapter *padapter, u32 mac_id); 473 469 void set_sta_rate(struct adapter *padapter, struct sta_info *psta); 474 470 475 - unsigned int receive_disconnect(struct adapter *padapter, 476 - unsigned char *macaddr, unsigned short reason); 471 + void receive_disconnect(struct adapter *padapter, unsigned char *macaddr, unsigned short reason); 477 472 478 473 unsigned char get_highest_rate_idx(u32 mask); 479 474 int support_short_GI(struct adapter *padapter, struct HT_caps_element *caps); ··· 527 524 unsigned short reason); 528 525 int issue_deauth_ex(struct adapter *padapter, u8 *da, unsigned short reason, 529 526 int try_cnt, int wait_ms); 530 - void issue_action_BA(struct adapter *padapter, unsigned char *raddr, 531 - unsigned char action, unsigned short status); 527 + void issue_action_BA(struct adapter *padapter, unsigned char *raddr, u8 action, u16 status); 532 528 unsigned int send_delba(struct adapter *padapter, u8 initiator, u8 *addr); 533 529 unsigned int send_beacon(struct adapter *padapter); 534 530 bool get_beacon_valid_bit(struct adapter *adapter); 535 531 void clear_beacon_valid_bit(struct adapter *adapter); 532 + void rtw_resume_tx_beacon(struct adapter *adapt); 533 + void rtw_stop_tx_beacon(struct adapter *adapt); 536 534 537 535 void start_clnt_assoc(struct adapter *padapter); 538 536 void start_clnt_auth(struct adapter *padapter); ··· 548 544 struct recv_frame *precv_frame); 549 545 unsigned int OnProbeRsp(struct adapter *padapter, 550 546 struct recv_frame *precv_frame); 551 - unsigned int DoReserved(struct adapter *padapter, 552 - struct recv_frame *precv_frame); 553 547 unsigned int OnBeacon(struct adapter *padapter, 554 548 struct recv_frame *precv_frame); 555 - unsigned int OnAtim(struct adapter *padapter, 556 - struct recv_frame *precv_frame); 557 549 unsigned int OnDisassoc(struct adapter *padapter, 558 550 struct recv_frame *precv_frame); 559 551 unsigned int OnAuth(struct adapter *padapter, ··· 591 591 592 592 bool cckrates_included(unsigned char *rate, int ratelen); 593 593 bool cckratesonly_included(unsigned char *rate, int ratelen); 594 - 595 - void update_TSF(struct mlme_ext_priv *pmlmeext, u8 *pframe, uint len); 596 - void correct_TSF(struct adapter *padapter, struct mlme_ext_priv *pmlmeext); 597 594 598 595 struct cmd_hdl { 599 596 uint parmsize;
-2
drivers/staging/r8188eu/include/usb_ops_linux.h
··· 26 26 #define usb_read_interrupt_complete(purb, regs) \ 27 27 usb_read_interrupt_complete(purb) 28 28 29 - unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr); 30 - 31 29 #endif
+54 -29
drivers/staging/r8188eu/os_dep/ioctl_linux.c
··· 687 687 enum ndis_802_11_network_infra networkType; 688 688 int ret = 0; 689 689 690 - 691 - 692 - if (_FAIL == rtw_pwr_wakeup(padapter)) { 693 - ret = -EPERM; 690 + ret = rtw_pwr_wakeup(padapter); 691 + if (ret) 694 692 goto exit; 695 - } 696 693 697 694 if (!padapter->hw_init_completed) { 698 695 ret = -EPERM; ··· 928 931 struct wlan_network *pnetwork = NULL; 929 932 enum ndis_802_11_auth_mode authmode; 930 933 931 - 932 - 933 - if (_FAIL == rtw_pwr_wakeup(padapter)) { 934 - ret = -1; 934 + ret = rtw_pwr_wakeup(padapter); 935 + if (ret) 935 936 goto exit; 936 - } 937 937 938 938 if (!padapter->bup) { 939 939 ret = -1; ··· 1043 1049 struct ndis_802_11_ssid ssid[RTW_SSID_SCAN_AMOUNT]; 1044 1050 struct wifidirect_info *pwdinfo = &padapter->wdinfo; 1045 1051 1046 - if (_FAIL == rtw_pwr_wakeup(padapter)) { 1047 - ret = -1; 1052 + ret = rtw_pwr_wakeup(padapter); 1053 + if (ret) 1048 1054 goto exit; 1049 - } 1050 1055 1051 1056 if (padapter->bDriverStopped) { 1052 1057 ret = -1; ··· 1245 1252 1246 1253 uint ret = 0, len; 1247 1254 1248 - if (_FAIL == rtw_pwr_wakeup(padapter)) { 1249 - ret = -1; 1255 + ret = rtw_pwr_wakeup(padapter); 1256 + if (ret) 1250 1257 goto exit; 1251 - } 1252 1258 1253 1259 if (!padapter->bup) { 1254 1260 ret = -1; ··· 1585 1593 if (erq->length > 0) { 1586 1594 wep.KeyLength = erq->length <= 5 ? 5 : 13; 1587 1595 1588 - wep.Length = wep.KeyLength + FIELD_OFFSET(struct ndis_802_11_wep, KeyMaterial); 1596 + wep.Length = wep.KeyLength + offsetof(struct ndis_802_11_wep, KeyMaterial); 1589 1597 } else { 1590 1598 wep.KeyLength = 0; 1591 1599 ··· 3118 3126 static void mac_reg_dump(struct adapter *padapter) 3119 3127 { 3120 3128 int i, j = 1; 3129 + u32 reg; 3130 + int res; 3131 + 3121 3132 pr_info("\n ======= MAC REG =======\n"); 3122 3133 for (i = 0x0; i < 0x300; i += 4) { 3123 3134 if (j % 4 == 1) 3124 3135 pr_info("0x%02x", i); 3125 - pr_info(" 0x%08x ", rtw_read32(padapter, i)); 3136 + 3137 + res = rtw_read32(padapter, i, &reg); 3138 + if (!res) 3139 + pr_info(" 0x%08x ", reg); 3140 + 3126 3141 if ((j++) % 4 == 0) 3127 3142 pr_info("\n"); 3128 3143 } 3129 3144 for (i = 0x400; i < 0x800; i += 4) { 3130 3145 if (j % 4 == 1) 3131 3146 pr_info("0x%02x", i); 3132 - pr_info(" 0x%08x ", rtw_read32(padapter, i)); 3147 + 3148 + res = rtw_read32(padapter, i, &reg); 3149 + if (!res) 3150 + pr_info(" 0x%08x ", reg); 3151 + 3133 3152 if ((j++) % 4 == 0) 3134 3153 pr_info("\n"); 3135 3154 } ··· 3148 3145 3149 3146 static void bb_reg_dump(struct adapter *padapter) 3150 3147 { 3151 - int i, j = 1; 3148 + int i, j = 1, res; 3149 + u32 reg; 3150 + 3152 3151 pr_info("\n ======= BB REG =======\n"); 3153 3152 for (i = 0x800; i < 0x1000; i += 4) { 3154 3153 if (j % 4 == 1) 3155 3154 pr_info("0x%02x", i); 3156 3155 3157 - pr_info(" 0x%08x ", rtw_read32(padapter, i)); 3156 + res = rtw_read32(padapter, i, &reg); 3157 + if (!res) 3158 + pr_info(" 0x%08x ", reg); 3159 + 3158 3160 if ((j++) % 4 == 0) 3159 3161 pr_info("\n"); 3160 3162 } ··· 3186 3178 { 3187 3179 struct hal_data_8188e *haldata = &adapter->haldata; 3188 3180 struct odm_dm_struct *odmpriv = &haldata->odmpriv; 3181 + int res; 3189 3182 3190 3183 switch (dm_func) { 3191 3184 case 0: ··· 3202 3193 if (!(odmpriv->SupportAbility & DYNAMIC_BB_DIG)) { 3203 3194 struct rtw_dig *digtable = &odmpriv->DM_DigTable; 3204 3195 3205 - digtable->CurIGValue = rtw_read8(adapter, 0xc50); 3196 + res = rtw_read8(adapter, 0xc50, &digtable->CurIGValue); 3197 + (void)res; 3198 + /* FIXME: return an error to caller */ 3206 3199 } 3207 3200 odmpriv->SupportAbility = DYNAMIC_ALL_FUNC_ENABLE; 3208 3201 break; 3209 3202 default: 3210 3203 break; 3211 3204 } 3205 + } 3206 + 3207 + static void rtw_set_dm_func_flag(struct adapter *adapter, u32 odm_flag) 3208 + { 3209 + struct hal_data_8188e *haldata = &adapter->haldata; 3210 + struct odm_dm_struct *odmpriv = &haldata->odmpriv; 3211 + 3212 + odmpriv->SupportAbility = odm_flag; 3212 3213 } 3213 3214 3214 3215 static int rtw_dbg_port(struct net_device *dev, ··· 3348 3329 u16 reg = arg; 3349 3330 u16 start_value = 0; 3350 3331 u32 write_num = extra_arg; 3351 - int i; 3332 + int i, res; 3352 3333 struct xmit_frame *xmit_frame; 3334 + u8 val8; 3353 3335 3354 3336 xmit_frame = rtw_IOL_accquire_xmit_frame(padapter); 3355 3337 if (!xmit_frame) { ··· 3363 3343 if (rtl8188e_IOL_exec_cmds_sync(padapter, xmit_frame, 5000, 0) != _SUCCESS) 3364 3344 ret = -EPERM; 3365 3345 3366 - rtw_read8(padapter, reg); 3346 + /* FIXME: is this read necessary? */ 3347 + res = rtw_read8(padapter, reg, &val8); 3348 + (void)res; 3367 3349 } 3368 3350 break; 3369 3351 ··· 3374 3352 u16 reg = arg; 3375 3353 u16 start_value = 200; 3376 3354 u32 write_num = extra_arg; 3377 - 3378 - int i; 3355 + u16 val16; 3356 + int i, res; 3379 3357 struct xmit_frame *xmit_frame; 3380 3358 3381 3359 xmit_frame = rtw_IOL_accquire_xmit_frame(padapter); ··· 3389 3367 if (rtl8188e_IOL_exec_cmds_sync(padapter, xmit_frame, 5000, 0) != _SUCCESS) 3390 3368 ret = -EPERM; 3391 3369 3392 - rtw_read16(padapter, reg); 3370 + /* FIXME: is this read necessary? */ 3371 + res = rtw_read16(padapter, reg, &val16); 3372 + (void)res; 3393 3373 } 3394 3374 break; 3395 3375 case 0x08: /* continuous write dword test */ ··· 3414 3390 if (rtl8188e_IOL_exec_cmds_sync(padapter, xmit_frame, 5000, 0) != _SUCCESS) 3415 3391 ret = -EPERM; 3416 3392 3417 - rtw_read32(padapter, reg); 3393 + /* FIXME: is this read necessary? */ 3394 + ret = rtw_read32(padapter, reg, &write_num); 3418 3395 } 3419 3396 break; 3420 3397 } ··· 3459 3434 case 0x06: 3460 3435 { 3461 3436 u32 ODMFlag = (u32)(0x0f & arg); 3462 - SetHwReg8188EU(padapter, HW_VAR_DM_FLAG, (u8 *)(&ODMFlag)); 3437 + rtw_set_dm_func_flag(padapter, ODMFlag); 3463 3438 } 3464 3439 break; 3465 3440 case 0x07:
+16 -3
drivers/staging/r8188eu/os_dep/os_intfs.c
··· 740 740 { 741 741 struct pwrctrl_priv *pwrpriv = &adapter->pwrctrlpriv; 742 742 u8 trycnt = 100; 743 + int res; 744 + u32 reg; 743 745 744 746 /* pause tx */ 745 747 rtw_write8(adapter, REG_TXPAUSE, 0xff); 746 748 747 749 /* keep sn */ 748 - adapter->xmitpriv.nqos_ssn = rtw_read16(adapter, REG_NQOS_SEQ); 750 + /* FIXME: return an error to caller */ 751 + res = rtw_read16(adapter, REG_NQOS_SEQ, &adapter->xmitpriv.nqos_ssn); 752 + if (res) 753 + return; 749 754 750 755 if (!pwrpriv->bkeepfwalive) { 751 756 /* RX DMA stop */ 757 + res = rtw_read32(adapter, REG_RXPKT_NUM, &reg); 758 + if (res) 759 + return; 760 + 752 761 rtw_write32(adapter, REG_RXPKT_NUM, 753 - (rtw_read32(adapter, REG_RXPKT_NUM) | RW_RELEASE_EN)); 762 + (reg | RW_RELEASE_EN)); 754 763 do { 755 - if (!(rtw_read32(adapter, REG_RXPKT_NUM) & RXDMA_IDLE)) 764 + res = rtw_read32(adapter, REG_RXPKT_NUM, &reg); 765 + if (res) 766 + continue; 767 + 768 + if (!(reg & RXDMA_IDLE)) 756 769 break; 757 770 } while (trycnt--); 758 771
-8
drivers/staging/r8188eu/os_dep/osdep_service.c
··· 42 42 Caller must check if the list is empty before calling rtw_list_delete 43 43 */ 44 44 45 - void rtw_usleep_os(int us) 46 - { 47 - if (1 < (us / 1000)) 48 - msleep(1); 49 - else 50 - msleep((us / 1000) + 1); 51 - } 52 - 53 45 static const struct device_type wlan_type = { 54 46 .name = "wlan", 55 47 };
+1 -1
drivers/staging/r8188eu/os_dep/usb_intf.c
··· 372 372 free_adapter: 373 373 if (pnetdev) 374 374 rtw_free_netdev(pnetdev); 375 - else if (padapter) 375 + else 376 376 vfree(padapter); 377 377 378 378 return NULL;
+1 -1
drivers/staging/r8188eu/os_dep/usb_ops_linux.c
··· 7 7 #include "../include/usb_ops_linux.h" 8 8 #include "../include/rtl8188e_recv.h" 9 9 10 - unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr) 10 + static unsigned int ffaddr2pipehdl(struct dvobj_priv *pdvobj, u32 addr) 11 11 { 12 12 unsigned int pipe = 0, ep_num = 0; 13 13 struct usb_device *pusbd = pdvobj->pusbdev;
+1 -1
drivers/staging/r8188eu/os_dep/xmit_linux.c
··· 71 71 if (!pxmitbuf->pallocated_buf) 72 72 return _FAIL; 73 73 74 - pxmitbuf->pbuf = (u8 *)N_BYTE_ALIGMENT((size_t)(pxmitbuf->pallocated_buf), XMITBUF_ALIGN_SZ); 74 + pxmitbuf->pbuf = (u8 *)ALIGN((size_t)(pxmitbuf->pallocated_buf), XMITBUF_ALIGN_SZ); 75 75 pxmitbuf->dma_transfer_addr = 0; 76 76 77 77 pxmitbuf->pxmit_urb = usb_alloc_urb(0, GFP_KERNEL);
+11 -13
drivers/staging/rtl8192e/rtllib_tx.c
··· 205 205 struct rtllib_txb *txb; 206 206 int i; 207 207 208 - txb = kmalloc(sizeof(struct rtllib_txb) + (sizeof(u8 *) * nr_frags), 209 - gfp_mask); 208 + txb = kzalloc(struct_size(txb, fragments, nr_frags), gfp_mask); 210 209 if (!txb) 211 210 return NULL; 212 211 213 - memset(txb, 0, sizeof(struct rtllib_txb)); 214 212 txb->nr_frags = nr_frags; 215 213 txb->frag_size = cpu_to_le16(txb_size); 216 214 217 215 for (i = 0; i < nr_frags; i++) { 218 216 txb->fragments[i] = dev_alloc_skb(txb_size); 219 - if (unlikely(!txb->fragments[i])) { 220 - i--; 221 - break; 222 - } 217 + if (unlikely(!txb->fragments[i])) 218 + goto err_free; 223 219 memset(txb->fragments[i]->cb, 0, sizeof(txb->fragments[i]->cb)); 224 220 } 225 - if (unlikely(i != nr_frags)) { 226 - while (i >= 0) 227 - dev_kfree_skb_any(txb->fragments[i--]); 228 - kfree(txb); 229 - return NULL; 230 - } 221 + 231 222 return txb; 223 + 224 + err_free: 225 + while (--i >= 0) 226 + dev_kfree_skb_any(txb->fragments[i]); 227 + kfree(txb); 228 + 229 + return NULL; 232 230 } 233 231 234 232 static int rtllib_classify(struct sk_buff *skb, u8 bIsAmsdu)
+15 -22
drivers/staging/rtl8192e/rtllib_wx.c
··· 17 17 #include <linux/module.h> 18 18 #include <linux/etherdevice.h> 19 19 #include "rtllib.h" 20 - struct modes_unit { 21 - char *mode_string; 22 - int mode_size; 23 - }; 24 - static struct modes_unit rtllib_modes[] = { 25 - {"a", 1}, 26 - {"b", 1}, 27 - {"g", 1}, 28 - {"?", 1}, 29 - {"N-24G", 5}, 30 - {"N-5G", 4}, 20 + 21 + static const char * const rtllib_modes[] = { 22 + "a", "b", "g", "?", "N-24G", "N-5G" 31 23 }; 32 24 33 25 #define MAX_CUSTOM_LEN 64 ··· 64 72 /* Add the protocol name */ 65 73 iwe.cmd = SIOCGIWNAME; 66 74 for (i = 0; i < ARRAY_SIZE(rtllib_modes); i++) { 67 - if (network->mode&(1<<i)) { 68 - sprintf(pname, rtllib_modes[i].mode_string, 69 - rtllib_modes[i].mode_size); 70 - pname += rtllib_modes[i].mode_size; 75 + if (network->mode & BIT(i)) { 76 + strcpy(pname, rtllib_modes[i]); 77 + pname += strlen(rtllib_modes[i]); 71 78 } 72 79 } 73 80 *pname = '\0'; ··· 149 158 max_rate = rate; 150 159 } 151 160 iwe.cmd = SIOCGIWRATE; 152 - iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0; 161 + iwe.u.bitrate.disabled = 0; 162 + iwe.u.bitrate.fixed = 0; 153 163 iwe.u.bitrate.value = max_rate * 500000; 154 164 start = iwe_stream_add_event_rsl(info, start, stop, &iwe, IW_EV_PARAM_LEN); 155 165 iwe.cmd = IWEVCUSTOM; ··· 277 285 struct iw_request_info *info, 278 286 union iwreq_data *wrqu, char *keybuf) 279 287 { 280 - struct iw_point *erq = &(wrqu->encoding); 288 + struct iw_point *erq = &wrqu->encoding; 281 289 struct net_device *dev = ieee->dev; 282 290 struct rtllib_security sec = { 283 291 .flags = 0 ··· 304 312 netdev_dbg(ieee->dev, 305 313 "Disabling encryption on key %d.\n", key); 306 314 lib80211_crypt_delayed_deinit(&ieee->crypt_info, crypt); 307 - } else 315 + } else { 308 316 netdev_dbg(ieee->dev, "Disabling encryption.\n"); 317 + } 309 318 310 319 /* Check all the keys to see if any are still configured, 311 320 * and if no key index was provided, de-init them all ··· 450 457 struct iw_request_info *info, 451 458 union iwreq_data *wrqu, char *keybuf) 452 459 { 453 - struct iw_point *erq = &(wrqu->encoding); 460 + struct iw_point *erq = &wrqu->encoding; 454 461 int len, key; 455 462 struct lib80211_crypt_data *crypt; 456 463 ··· 601 608 goto done; 602 609 } 603 610 *crypt = new_crypt; 604 - 605 611 } 606 612 607 613 if (ext->key_len > 0 && (*crypt)->ops->set_key && ··· 724 732 } else if (data->value & IW_AUTH_ALG_LEAP) { 725 733 ieee->open_wep = 1; 726 734 ieee->auth_mode = 2; 727 - } else 735 + } else { 728 736 return -EINVAL; 737 + } 729 738 break; 730 739 731 740 case IW_AUTH_WPA_ENABLED: ··· 769 776 kfree(ieee->wps_ie); 770 777 ieee->wps_ie = NULL; 771 778 if (len) { 772 - if (len != ie[1]+2) 779 + if (len != ie[1] + 2) 773 780 return -EINVAL; 774 781 buf = kmemdup(ie, len, GFP_KERNEL); 775 782 if (!buf)
+1 -1
drivers/staging/rtl8192u/r8192U.h
··· 1013 1013 bool bis_any_nonbepkts; 1014 1014 bool bcurrent_turbo_EDCA; 1015 1015 bool bis_cur_rdlstate; 1016 - struct timer_list fsync_timer; 1016 + struct delayed_work fsync_work; 1017 1017 bool bfsync_processing; /* 500ms Fsync timer is active or not */ 1018 1018 u32 rate_record; 1019 1019 u32 rateCountDiffRecord;
+19 -21
drivers/staging/rtl8192u/r8192U_dm.c
··· 2578 2578 priv->ieee80211->fsync_seconddiff_ratethreshold = 200; 2579 2579 priv->ieee80211->fsync_state = Default_Fsync; 2580 2580 priv->framesyncMonitor = 1; /* current default 0xc38 monitor on */ 2581 - timer_setup(&priv->fsync_timer, dm_fsync_timer_callback, 0); 2581 + INIT_DELAYED_WORK(&priv->fsync_work, dm_fsync_work_callback); 2582 2582 } 2583 2583 2584 2584 static void dm_deInit_fsync(struct net_device *dev) 2585 2585 { 2586 2586 struct r8192_priv *priv = ieee80211_priv(dev); 2587 2587 2588 - del_timer_sync(&priv->fsync_timer); 2588 + cancel_delayed_work_sync(&priv->fsync_work); 2589 2589 } 2590 2590 2591 - void dm_fsync_timer_callback(struct timer_list *t) 2591 + void dm_fsync_work_callback(struct work_struct *work) 2592 2592 { 2593 - struct r8192_priv *priv = from_timer(priv, t, fsync_timer); 2593 + struct r8192_priv *priv = 2594 + container_of(work, struct r8192_priv, fsync_work.work); 2594 2595 struct net_device *dev = priv->ieee80211->dev; 2595 2596 u32 rate_index, rate_count = 0, rate_count_diff = 0; 2596 2597 bool bSwitchFromCountDiff = false; ··· 2658 2657 } 2659 2658 } 2660 2659 if (bDoubleTimeInterval) { 2661 - if (timer_pending(&priv->fsync_timer)) 2662 - del_timer_sync(&priv->fsync_timer); 2663 - priv->fsync_timer.expires = jiffies + 2664 - msecs_to_jiffies(priv->ieee80211->fsync_time_interval*priv->ieee80211->fsync_multiple_timeinterval); 2665 - add_timer(&priv->fsync_timer); 2660 + cancel_delayed_work_sync(&priv->fsync_work); 2661 + schedule_delayed_work(&priv->fsync_work, 2662 + msecs_to_jiffies(priv 2663 + ->ieee80211->fsync_time_interval * 2664 + priv->ieee80211->fsync_multiple_timeinterval)); 2666 2665 } else { 2667 - if (timer_pending(&priv->fsync_timer)) 2668 - del_timer_sync(&priv->fsync_timer); 2669 - priv->fsync_timer.expires = jiffies + 2670 - msecs_to_jiffies(priv->ieee80211->fsync_time_interval); 2671 - add_timer(&priv->fsync_timer); 2666 + cancel_delayed_work_sync(&priv->fsync_work); 2667 + schedule_delayed_work(&priv->fsync_work, 2668 + msecs_to_jiffies(priv 2669 + ->ieee80211->fsync_time_interval)); 2672 2670 } 2673 2671 } else { 2674 2672 /* Let Register return to default value; */ ··· 2695 2695 struct r8192_priv *priv = ieee80211_priv(dev); 2696 2696 2697 2697 RT_TRACE(COMP_HALDM, "%s\n", __func__); 2698 - del_timer_sync(&(priv->fsync_timer)); 2698 + cancel_delayed_work_sync(&priv->fsync_work); 2699 2699 2700 2700 /* Let Register return to default value; */ 2701 2701 if (priv->bswitch_fsync) { ··· 2736 2736 if (priv->ieee80211->fsync_rate_bitmap & rateBitmap) 2737 2737 priv->rate_record += priv->stats.received_rate_histogram[1][rateIndex]; 2738 2738 } 2739 - if (timer_pending(&priv->fsync_timer)) 2740 - del_timer_sync(&priv->fsync_timer); 2741 - priv->fsync_timer.expires = jiffies + 2742 - msecs_to_jiffies(priv->ieee80211->fsync_time_interval); 2743 - add_timer(&priv->fsync_timer); 2739 + cancel_delayed_work_sync(&priv->fsync_work); 2740 + schedule_delayed_work(&priv->fsync_work, 2741 + msecs_to_jiffies(priv->ieee80211->fsync_time_interval)); 2744 2742 2745 2743 write_nic_dword(dev, rOFDM0_RxDetector2, 0x465c12cd); 2746 2744 } ··· 3000 3002 /* for initial tx rate */ 3001 3003 /*priv->stats.last_packet_rate = read_nic_byte(dev, INITIAL_TX_RATE_REG);*/ 3002 3004 read_nic_byte(dev, INITIAL_TX_RATE_REG, &ieee->softmac_stats.last_packet_rate); 3003 - /* for tx tx retry count */ 3005 + /* for tx retry count */ 3004 3006 /*priv->stats.txretrycount = read_nic_dword(dev, TX_RETRY_COUNT_REG);*/ 3005 3007 read_nic_dword(dev, TX_RETRY_COUNT_REG, &ieee->softmac_stats.txretrycount); 3006 3008 }
+1 -1
drivers/staging/rtl8192u/r8192U_dm.h
··· 166 166 void dm_init_edca_turbo(struct net_device *dev); 167 167 void dm_rf_operation_test_callback(unsigned long data); 168 168 void dm_rf_pathcheck_workitemcallback(struct work_struct *work); 169 - void dm_fsync_timer_callback(struct timer_list *t); 169 + void dm_fsync_work_callback(struct work_struct *work); 170 170 void dm_cck_txpower_adjust(struct net_device *dev, bool binch14); 171 171 void dm_shadow_init(struct net_device *dev); 172 172 void dm_initialize_txpower_tracking(struct net_device *dev);
+1 -1
drivers/staging/rtl8723bs/core/rtw_mlme_ext.c
··· 960 960 return _FAIL; 961 961 962 962 frame_type = GetFrameSubType(pframe); 963 - if (frame_type == WIFI_ASSOCREQ) 963 + if (frame_type == WIFI_ASSOCREQ) 964 964 ie_offset = _ASOCREQ_IE_OFFSET_; 965 965 else /* WIFI_REASSOCREQ */ 966 966 ie_offset = _REASOCREQ_IE_OFFSET_;
+66 -159
drivers/staging/rtl8723bs/os_dep/ioctl_cfg80211.c
··· 366 366 int freq = (int)cur_network->network.configuration.ds_config; 367 367 struct ieee80211_channel *chan; 368 368 369 - if (pwdev->iftype != NL80211_IFTYPE_ADHOC) { 369 + if (pwdev->iftype != NL80211_IFTYPE_ADHOC) 370 370 return; 371 - } 372 371 373 372 if (!rtw_cfg80211_check_bss(padapter)) { 374 373 struct wlan_bssid_ex *pnetwork = &(padapter->mlmeextpriv.mlmext_info.network); ··· 543 544 goto exit; 544 545 } 545 546 546 - if (wep_key_len > 0) { 547 + if (wep_key_len > 0) 547 548 wep_key_len = wep_key_len <= 5 ? 5 : 13; 548 - } 549 549 550 550 if (psecuritypriv->bWepDefaultKeyIdxSet == 0) { 551 551 /* wep default key has not been set, so use this key index as default key. */ ··· 580 582 memcpy(grpkey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); 581 583 582 584 psecuritypriv->dot118021XGrpPrivacy = _WEP40_; 583 - if (param->u.crypt.key_len == 13) { 585 + if (param->u.crypt.key_len == 13) 584 586 psecuritypriv->dot118021XGrpPrivacy = _WEP104_; 585 - } 586 587 587 588 } else if (strcmp(param->u.crypt.alg, "TKIP") == 0) { 588 589 psecuritypriv->dot118021XGrpPrivacy = _TKIP_; ··· 623 626 624 627 } 625 628 626 - if (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X && psta) /* psk/802_1x */ 627 - { 628 - if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) 629 - { 630 - if (param->u.crypt.set_tx == 1) /* pairwise key */ 631 - { 629 + if (psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_8021X && psta) { /* psk/802_1x */ 630 + if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { 631 + if (param->u.crypt.set_tx == 1) { /* pairwise key */ 632 632 memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); 633 633 634 - if (strcmp(param->u.crypt.alg, "WEP") == 0) 635 - { 634 + if (strcmp(param->u.crypt.alg, "WEP") == 0) { 636 635 psta->dot118021XPrivacy = _WEP40_; 637 636 if (param->u.crypt.key_len == 13) 638 - { 639 637 psta->dot118021XPrivacy = _WEP104_; 640 - } 641 - } 642 - else if (strcmp(param->u.crypt.alg, "TKIP") == 0) 643 - { 638 + } else if (strcmp(param->u.crypt.alg, "TKIP") == 0) { 644 639 psta->dot118021XPrivacy = _TKIP_; 645 640 646 641 /* DEBUG_ERR("set key length :param->u.crypt.key_len =%d\n", param->u.crypt.key_len); */ ··· 642 653 643 654 psecuritypriv->busetkipkey = true; 644 655 645 - } 646 - else if (strcmp(param->u.crypt.alg, "CCMP") == 0) 647 - { 656 + } else if (strcmp(param->u.crypt.alg, "CCMP") == 0) { 648 657 649 658 psta->dot118021XPrivacy = _AES_; 650 - } 651 - else 652 - { 659 + } else { 653 660 psta->dot118021XPrivacy = _NO_PRIVACY_; 654 661 } 655 662 ··· 655 670 656 671 psta->bpairwise_key_installed = true; 657 672 658 - } 659 - else/* group key??? */ 660 - { 661 - if (strcmp(param->u.crypt.alg, "WEP") == 0) 662 - { 673 + } else { /* group key??? */ 674 + if (strcmp(param->u.crypt.alg, "WEP") == 0) { 663 675 memcpy(grpkey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); 664 676 665 677 psecuritypriv->dot118021XGrpPrivacy = _WEP40_; 666 678 if (param->u.crypt.key_len == 13) 667 - { 668 679 psecuritypriv->dot118021XGrpPrivacy = _WEP104_; 669 - } 670 - } 671 - else if (strcmp(param->u.crypt.alg, "TKIP") == 0) 672 - { 680 + } else if (strcmp(param->u.crypt.alg, "TKIP") == 0) { 673 681 psecuritypriv->dot118021XGrpPrivacy = _TKIP_; 674 682 675 683 memcpy(grpkey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); ··· 674 696 675 697 psecuritypriv->busetkipkey = true; 676 698 677 - } 678 - else if (strcmp(param->u.crypt.alg, "CCMP") == 0) 679 - { 699 + } else if (strcmp(param->u.crypt.alg, "CCMP") == 0) { 680 700 psecuritypriv->dot118021XGrpPrivacy = _AES_; 681 701 682 702 memcpy(grpkey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); 683 - } 684 - else 685 - { 703 + } else { 686 704 psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; 687 705 } 688 706 ··· 691 717 rtw_ap_set_group_key(padapter, param->u.crypt.key, psecuritypriv->dot118021XGrpPrivacy, param->u.crypt.idx); 692 718 693 719 pbcmc_sta = rtw_get_bcmc_stainfo(padapter); 694 - if (pbcmc_sta) 695 - { 720 + if (pbcmc_sta) { 696 721 pbcmc_sta->ieee8021x_blocked = false; 697 722 pbcmc_sta->dot118021XPrivacy = psecuritypriv->dot118021XGrpPrivacy;/* rx will use bmc_sta's dot118021XPrivacy */ 698 723 } ··· 719 746 param->u.crypt.err = 0; 720 747 param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0'; 721 748 722 - if (param_len < (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len) 723 - { 749 + if (param_len < (u32) ((u8 *) param->u.crypt.key - (u8 *) param) + param->u.crypt.key_len) { 724 750 ret = -EINVAL; 725 751 goto exit; 726 752 } 727 753 728 754 if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff && 729 755 param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff && 730 - param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) 731 - { 756 + param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) { 732 757 if (param->u.crypt.idx >= WEP_KEYS 733 - || param->u.crypt.idx >= BIP_MAX_KEYID 734 - ) 735 - { 758 + || param->u.crypt.idx >= BIP_MAX_KEYID) { 736 759 ret = -EINVAL; 737 760 goto exit; 738 761 } ··· 739 770 } 740 771 } 741 772 742 - if (strcmp(param->u.crypt.alg, "WEP") == 0) 743 - { 773 + if (strcmp(param->u.crypt.alg, "WEP") == 0) { 744 774 wep_key_idx = param->u.crypt.idx; 745 775 wep_key_len = param->u.crypt.key_len; 746 776 747 - if ((wep_key_idx >= WEP_KEYS) || (wep_key_len <= 0)) 748 - { 777 + if ((wep_key_idx >= WEP_KEYS) || (wep_key_len <= 0)) { 749 778 ret = -EINVAL; 750 779 goto exit; 751 780 } 752 781 753 - if (psecuritypriv->bWepDefaultKeyIdxSet == 0) 754 - { 782 + if (psecuritypriv->bWepDefaultKeyIdxSet == 0) { 755 783 /* wep default key has not been set, so use this key index as default key. */ 756 784 757 785 wep_key_len = wep_key_len <= 5 ? 5 : 13; ··· 757 791 psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; 758 792 psecuritypriv->dot118021XGrpPrivacy = _WEP40_; 759 793 760 - if (wep_key_len == 13) 761 - { 794 + if (wep_key_len == 13) { 762 795 psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; 763 796 psecuritypriv->dot118021XGrpPrivacy = _WEP104_; 764 797 } ··· 774 809 goto exit; 775 810 } 776 811 777 - if (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) /* 802_1x */ 778 - { 812 + if (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X) { /* 802_1x */ 779 813 struct sta_info *psta, *pbcmc_sta; 780 814 struct sta_priv *pstapriv = &padapter->stapriv; 781 815 782 - if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_MP_STATE) == true) /* sta mode */ 783 - { 816 + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_MP_STATE) == true) { /* sta mode */ 784 817 psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); 785 818 if (psta) { 786 819 /* Jeff: don't disable ieee8021x_blocked while clearing key */ ··· 787 824 788 825 789 826 if ((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled) || 790 - (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) 791 - { 827 + (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) { 792 828 psta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; 793 829 } 794 830 795 - if (param->u.crypt.set_tx == 1)/* pairwise key */ 796 - { 831 + if (param->u.crypt.set_tx == 1) { /* pairwise key */ 797 832 798 833 memcpy(psta->dot118021x_UncstKey.skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); 799 834 800 - if (strcmp(param->u.crypt.alg, "TKIP") == 0)/* set mic key */ 801 - { 835 + if (strcmp(param->u.crypt.alg, "TKIP") == 0) { /* set mic key */ 802 836 /* DEBUG_ERR(("\nset key length :param->u.crypt.key_len =%d\n", param->u.crypt.key_len)); */ 803 837 memcpy(psta->dot11tkiptxmickey.skey, &(param->u.crypt.key[16]), 8); 804 838 memcpy(psta->dot11tkiprxmickey.skey, &(param->u.crypt.key[24]), 8); ··· 805 845 } 806 846 807 847 rtw_setstakey_cmd(padapter, psta, true, true); 808 - } 809 - else/* group key */ 810 - { 811 - if (strcmp(param->u.crypt.alg, "TKIP") == 0 || strcmp(param->u.crypt.alg, "CCMP") == 0) 812 - { 848 + } else { /* group key */ 849 + if (strcmp(param->u.crypt.alg, "TKIP") == 0 || strcmp(param->u.crypt.alg, "CCMP") == 0) { 813 850 memcpy(padapter->securitypriv.dot118021XGrpKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); 814 851 memcpy(padapter->securitypriv.dot118021XGrptxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[16]), 8); 815 852 memcpy(padapter->securitypriv.dot118021XGrprxmickey[param->u.crypt.idx].skey, &(param->u.crypt.key[24]), 8); ··· 814 857 815 858 padapter->securitypriv.dot118021XGrpKeyid = param->u.crypt.idx; 816 859 rtw_set_key(padapter, &padapter->securitypriv, param->u.crypt.idx, 1, true); 817 - } 818 - else if (strcmp(param->u.crypt.alg, "BIP") == 0) 819 - { 860 + } else if (strcmp(param->u.crypt.alg, "BIP") == 0) { 820 861 /* save the IGTK key, length 16 bytes */ 821 862 memcpy(padapter->securitypriv.dot11wBIPKey[param->u.crypt.idx].skey, param->u.crypt.key, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); 822 863 /* ··· 828 873 } 829 874 830 875 pbcmc_sta = rtw_get_bcmc_stainfo(padapter); 831 - if (!pbcmc_sta) 832 - { 876 + if (!pbcmc_sta) { 833 877 /* DEBUG_ERR(("Set OID_802_11_ADD_KEY: bcmc stainfo is null\n")); */ 834 - } 835 - else 836 - { 878 + } else { 837 879 /* Jeff: don't disable ieee8021x_blocked while clearing key */ 838 880 if (strcmp(param->u.crypt.alg, "none") != 0) 839 881 pbcmc_sta->ieee8021x_blocked = false; 840 882 841 883 if ((padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption2Enabled) || 842 - (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) 843 - { 884 + (padapter->securitypriv.ndisencryptstatus == Ndis802_11Encryption3Enabled)) { 844 885 pbcmc_sta->dot118021XPrivacy = padapter->securitypriv.dot11PrivacyAlgrthm; 845 886 } 846 887 } 847 - } 848 - else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) /* adhoc mode */ 849 - { 888 + } else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) { /* adhoc mode */ 850 889 } 851 890 } 852 891 ··· 898 949 899 950 900 951 if (!mac_addr || is_broadcast_ether_addr(mac_addr)) 901 - { 902 952 param->u.crypt.set_tx = 0; /* for wpa/wpa2 group key */ 903 - } else { 953 + else 904 954 param->u.crypt.set_tx = 1; /* for wpa/wpa2 pairwise key */ 905 - } 906 955 907 956 param->u.crypt.idx = key_index; 908 957 909 958 if (params->seq_len && params->seq) 910 - { 911 959 memcpy(param->u.crypt.seq, (u8 *)params->seq, params->seq_len); 912 - } 913 960 914 - if (params->key_len && params->key) 915 - { 961 + if (params->key_len && params->key) { 916 962 param->u.crypt.key_len = params->key_len; 917 963 memcpy(param->u.crypt.key, (u8 *)params->key, params->key_len); 918 964 } 919 965 920 - if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == true) 921 - { 966 + if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == true) { 922 967 ret = rtw_cfg80211_set_encryption(ndev, param, param_len); 923 - } 924 - else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == true) 925 - { 968 + } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == true) { 926 969 if (mac_addr) 927 970 memcpy(param->sta_addr, (void *)mac_addr, ETH_ALEN); 928 971 929 972 ret = rtw_cfg80211_ap_set_encryption(ndev, param, param_len); 930 - } 931 - else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true 932 - || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true) 933 - { 973 + } else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true 974 + || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true) { 934 975 ret = rtw_cfg80211_set_encryption(ndev, param, param_len); 935 976 } 936 977 ··· 946 1007 struct adapter *padapter = rtw_netdev_priv(ndev); 947 1008 struct security_priv *psecuritypriv = &padapter->securitypriv; 948 1009 949 - if (key_index == psecuritypriv->dot11PrivacyKeyIndex) 950 - { 1010 + if (key_index == psecuritypriv->dot11PrivacyKeyIndex) { 951 1011 /* clear the flag of wep default key set. */ 952 1012 psecuritypriv->bWepDefaultKeyIdxSet = 0; 953 1013 } ··· 962 1024 struct adapter *padapter = rtw_netdev_priv(ndev); 963 1025 struct security_priv *psecuritypriv = &padapter->securitypriv; 964 1026 965 - if ((key_index < WEP_KEYS) && ((psecuritypriv->dot11PrivacyAlgrthm == _WEP40_) || (psecuritypriv->dot11PrivacyAlgrthm == _WEP104_))) /* set wep default key */ 966 - { 1027 + if ((key_index < WEP_KEYS) && ((psecuritypriv->dot11PrivacyAlgrthm == _WEP40_) || (psecuritypriv->dot11PrivacyAlgrthm == _WEP104_))) { /* set wep default key */ 967 1028 psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; 968 1029 969 1030 psecuritypriv->dot11PrivacyKeyIndex = key_index; 970 1031 971 1032 psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; 972 1033 psecuritypriv->dot118021XGrpPrivacy = _WEP40_; 973 - if (psecuritypriv->dot11DefKeylen[key_index] == 13) 974 - { 1034 + if (psecuritypriv->dot11DefKeylen[key_index] == 13) { 975 1035 psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; 976 1036 psecuritypriv->dot118021XGrpPrivacy = _WEP104_; 977 1037 } ··· 1007 1071 1008 1072 /* for infra./P2PClient mode */ 1009 1073 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) 1010 - && check_fwstate(pmlmepriv, _FW_LINKED) 1011 - ) 1012 - { 1074 + && check_fwstate(pmlmepriv, _FW_LINKED)) { 1013 1075 struct wlan_network *cur_network = &(pmlmepriv->cur_network); 1014 1076 1015 1077 if (memcmp((u8 *)mac, cur_network->network.mac_address, ETH_ALEN)) { ··· 1033 1099 if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) 1034 1100 || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) 1035 1101 || check_fwstate(pmlmepriv, WIFI_AP_STATE)) 1036 - && check_fwstate(pmlmepriv, _FW_LINKED) 1037 - ) 1038 - { 1102 + && check_fwstate(pmlmepriv, _FW_LINKED)) { 1039 1103 /* TODO: should acquire station info... */ 1040 1104 } 1041 1105 ··· 1053 1121 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); 1054 1122 int ret = 0; 1055 1123 1056 - if (adapter_to_dvobj(padapter)->processing_dev_remove == true) 1057 - { 1124 + if (adapter_to_dvobj(padapter)->processing_dev_remove == true) { 1058 1125 ret = -EPERM; 1059 1126 goto exit; 1060 1127 } ··· 1072 1141 1073 1142 old_type = rtw_wdev->iftype; 1074 1143 1075 - if (old_type != type) 1076 - { 1144 + if (old_type != type) { 1077 1145 pmlmeext->action_public_rxseq = 0xffff; 1078 1146 pmlmeext->action_public_dialog_token = 0xff; 1079 1147 } ··· 1094 1164 1095 1165 rtw_wdev->iftype = type; 1096 1166 1097 - if (rtw_set_802_11_infrastructure_mode(padapter, networkType) == false) 1098 - { 1167 + if (rtw_set_802_11_infrastructure_mode(padapter, networkType) == false) { 1099 1168 rtw_wdev->iftype = old_type; 1100 1169 ret = -EPERM; 1101 1170 goto exit; ··· 1159 1230 1160 1231 /* report network only if the current channel set contains the channel to which this network belongs */ 1161 1232 if (rtw_ch_set_search_ch(padapter->mlmeextpriv.channel_set, pnetwork->network.configuration.ds_config) >= 0 1162 - && true == rtw_validate_ssid(&(pnetwork->network.ssid)) 1163 - ) 1164 - { 1233 + && true == rtw_validate_ssid(&(pnetwork->network.ssid))) { 1165 1234 /* ev =translate_scan(padapter, a, pnetwork, ev, stop); */ 1166 1235 rtw_cfg80211_inform_bss(padapter, pnetwork); 1167 1236 } ··· 1176 1249 u8 *wps_ie; 1177 1250 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); 1178 1251 1179 - if (len > 0) 1180 - { 1252 + if (len > 0) { 1181 1253 wps_ie = rtw_get_wps_ie(buf, len, NULL, &wps_ielen); 1182 - if (wps_ie) 1183 - { 1184 - if (pmlmepriv->wps_probe_req_ie) 1185 - { 1254 + if (wps_ie) { 1255 + if (pmlmepriv->wps_probe_req_ie) { 1186 1256 pmlmepriv->wps_probe_req_ie_len = 0; 1187 1257 kfree(pmlmepriv->wps_probe_req_ie); 1188 1258 pmlmepriv->wps_probe_req_ie = NULL; ··· 1231 1307 pwdev_priv->scan_request = request; 1232 1308 spin_unlock_bh(&pwdev_priv->scan_req_lock); 1233 1309 1234 - if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == true) 1235 - { 1236 - if (check_fwstate(pmlmepriv, WIFI_UNDER_WPS|_FW_UNDER_SURVEY|_FW_UNDER_LINKING) == true) 1237 - { 1310 + if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == true) { 1311 + if (check_fwstate(pmlmepriv, WIFI_UNDER_WPS|_FW_UNDER_SURVEY|_FW_UNDER_LINKING) == true) { 1238 1312 need_indicate_scan_done = true; 1239 1313 goto check_need_indicate_scan_done; 1240 1314 } ··· 1255 1333 goto check_need_indicate_scan_done; 1256 1334 } 1257 1335 1258 - if (pmlmepriv->LinkDetectInfo.bBusyTraffic == true) 1259 - { 1260 - static unsigned long lastscantime = 0; 1336 + if (pmlmepriv->LinkDetectInfo.bBusyTraffic == true) { 1337 + static unsigned long lastscantime; 1261 1338 unsigned long passtime; 1262 1339 1263 1340 passtime = jiffies_to_msecs(jiffies - lastscantime); 1264 1341 lastscantime = jiffies; 1265 - if (passtime > 12000) 1266 - { 1342 + if (passtime > 12000) { 1267 1343 need_indicate_scan_done = true; 1268 1344 goto check_need_indicate_scan_done; 1269 1345 } ··· 1300 1380 } else if (request->n_channels <= 4) { 1301 1381 for (j = request->n_channels - 1; j >= 0; j--) 1302 1382 for (i = 0; i < survey_times; i++) 1303 - { 1304 1383 memcpy(&ch[j*survey_times+i], &ch[j], sizeof(struct rtw_ieee80211_channel)); 1305 - } 1306 1384 _status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, ch, survey_times * request->n_channels); 1307 1385 } else { 1308 1386 _status = rtw_sitesurvey_cmd(padapter, ssid, RTW_SSID_SCAN_AMOUNT, NULL, 0); ··· 1309 1391 1310 1392 1311 1393 if (_status == false) 1312 - { 1313 1394 ret = -1; 1314 - } 1315 1395 1316 1396 check_need_indicate_scan_done: 1317 1397 kfree(ssid); 1318 - if (need_indicate_scan_done) 1319 - { 1398 + if (need_indicate_scan_done) { 1320 1399 rtw_cfg80211_surveydone_event_callback(padapter); 1321 1400 rtw_cfg80211_indicate_scan_done(padapter, false); 1322 1401 } ··· 1339 1424 1340 1425 1341 1426 if (wpa_version & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2)) 1342 - { 1343 1427 psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPAPSK; 1344 - } 1345 1428 1346 1429 return 0; 1347 1430 ··· 1498 1585 if (pairwise_cipher == 0) 1499 1586 pairwise_cipher = WPA_CIPHER_NONE; 1500 1587 1501 - switch (group_cipher) 1502 - { 1588 + switch (group_cipher) { 1503 1589 case WPA_CIPHER_NONE: 1504 1590 padapter->securitypriv.dot118021XGrpPrivacy = _NO_PRIVACY_; 1505 1591 padapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled; ··· 1521 1609 break; 1522 1610 } 1523 1611 1524 - switch (pairwise_cipher) 1525 - { 1612 + switch (pairwise_cipher) { 1526 1613 case WPA_CIPHER_NONE: 1527 1614 padapter->securitypriv.dot11PrivacyAlgrthm = _NO_PRIVACY_; 1528 1615 padapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled; ··· 1642 1731 1643 1732 rtw_wdev->iftype = NL80211_IFTYPE_STATION; 1644 1733 1645 - if (rtw_set_802_11_infrastructure_mode(padapter, Ndis802_11Infrastructure) == false) 1646 - { 1734 + if (rtw_set_802_11_infrastructure_mode(padapter, Ndis802_11Infrastructure) == false) { 1647 1735 rtw_wdev->iftype = old_type; 1648 1736 ret = -EPERM; 1649 1737 goto leave_ibss; ··· 1702 1792 ret = -EBUSY; 1703 1793 goto exit; 1704 1794 } 1705 - if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == true) { 1795 + if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == true) 1706 1796 rtw_scan_abort(padapter); 1707 - } 1708 1797 1709 1798 psecuritypriv->ndisencryptstatus = Ndis802_11EncryptionDisabled; 1710 1799 psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_; ··· 2197 2288 mon_ndev->ieee80211_ptr = mon_wdev; 2198 2289 2199 2290 ret = cfg80211_register_netdevice(mon_ndev); 2200 - if (ret) { 2291 + if (ret) 2201 2292 goto out; 2202 - } 2203 2293 2204 2294 *ndev = pwdev_priv->pmon_ndev = mon_ndev; 2205 2295 memcpy(pwdev_priv->ifname_mon, name, IFNAMSIZ+1); ··· 2311 2403 rtw_ies_remove_ie(pbuf, &len, _BEACON_IE_OFFSET_, WLAN_EID_VENDOR_SPECIFIC, P2P_OUI, 4); 2312 2404 rtw_ies_remove_ie(pbuf, &len, _BEACON_IE_OFFSET_, WLAN_EID_VENDOR_SPECIFIC, WFD_OUI, 4); 2313 2405 2314 - if (rtw_check_beacon_data(adapter, pbuf, len) == _SUCCESS) { 2406 + if (rtw_check_beacon_data(adapter, pbuf, len) == _SUCCESS) 2315 2407 ret = 0; 2316 - } else { 2408 + else 2317 2409 ret = -EINVAL; 2318 - } 2319 2410 2320 2411 2321 2412 kfree(pbuf);
+2 -4
drivers/staging/rts5208/spi.c
··· 460 460 spi->clk_div = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5]; 461 461 spi->write_en = srb->cmnd[6]; 462 462 463 - dev_dbg(rtsx_dev(chip), "%s: ", __func__); 464 - dev_dbg(rtsx_dev(chip), "spi_clock = %d, ", spi->spi_clock); 465 - dev_dbg(rtsx_dev(chip), "clk_div = %d, ", spi->clk_div); 466 - dev_dbg(rtsx_dev(chip), "write_en = %d\n", spi->write_en); 463 + dev_dbg(rtsx_dev(chip), "spi_clock = %d, clk_div = %d, write_en = %d\n", 464 + spi->spi_clock, spi->clk_div, spi->write_en); 467 465 468 466 return STATUS_SUCCESS; 469 467 }
+1 -1
drivers/staging/sm750fb/ddk750_dvi.c
··· 15 15 #ifdef DVI_CTRL_SII164 16 16 { 17 17 .init = sii164InitChip, 18 - .get_vendor_id = sii164GetVendorID, 18 + .get_vendor_id = sii164_get_vendor_id, 19 19 .get_device_id = sii164GetDeviceID, 20 20 #ifdef SII164_FULL_FUNCTIONS 21 21 .reset_chip = sii164ResetChip,
+1 -1
drivers/staging/sm750fb/ddk750_power.h
··· 15 15 } 16 16 17 17 void ddk750_set_dpms(enum dpms state); 18 - void sm750_set_power_mode(unsigned int powerMode); 18 + void sm750_set_power_mode(unsigned int mode); 19 19 void sm750_set_current_gate(unsigned int gate); 20 20 21 21 /*
+3 -3
drivers/staging/sm750fb/ddk750_sii164.c
··· 29 29 #endif 30 30 31 31 /* 32 - * sii164GetVendorID 32 + * sii164_get_vendor_id 33 33 * This function gets the vendor ID of the DVI controller chip. 34 34 * 35 35 * Output: 36 36 * Vendor ID 37 37 */ 38 - unsigned short sii164GetVendorID(void) 38 + unsigned short sii164_get_vendor_id(void) 39 39 { 40 40 unsigned short vendorID; 41 41 ··· 140 140 #endif 141 141 142 142 /* Check if SII164 Chip exists */ 143 - if ((sii164GetVendorID() == SII164_VENDOR_ID) && 143 + if ((sii164_get_vendor_id() == SII164_VENDOR_ID) && 144 144 (sii164GetDeviceID() == SII164_DEVICE_ID)) { 145 145 /* 146 146 * Initialize SII164 controller chip.
+1 -1
drivers/staging/sm750fb/ddk750_sii164.h
··· 27 27 unsigned char pllFilterEnable, 28 28 unsigned char pllFilterValue); 29 29 30 - unsigned short sii164GetVendorID(void); 30 + unsigned short sii164_get_vendor_id(void); 31 31 unsigned short sii164GetDeviceID(void); 32 32 33 33 #ifdef SII164_FULL_FUNCTIONS
+24 -16
drivers/staging/vc04_services/bcm2835-audio/bcm2835-vchiq.c
··· 25 25 static void bcm2835_audio_lock(struct bcm2835_audio_instance *instance) 26 26 { 27 27 mutex_lock(&instance->vchi_mutex); 28 - vchiq_use_service(instance->service_handle); 28 + vchiq_use_service(instance->alsa_stream->chip->vchi_ctx->instance, 29 + instance->service_handle); 29 30 } 30 31 31 32 static void bcm2835_audio_unlock(struct bcm2835_audio_instance *instance) 32 33 { 33 - vchiq_release_service(instance->service_handle); 34 + vchiq_release_service(instance->alsa_stream->chip->vchi_ctx->instance, 35 + instance->service_handle); 34 36 mutex_unlock(&instance->vchi_mutex); 35 37 } 36 38 ··· 46 44 init_completion(&instance->msg_avail_comp); 47 45 } 48 46 49 - status = vchiq_queue_kernel_message(instance->service_handle, 50 - m, sizeof(*m)); 47 + status = vchiq_queue_kernel_message(instance->alsa_stream->chip->vchi_ctx->instance, 48 + instance->service_handle, m, sizeof(*m)); 51 49 if (status) { 52 50 dev_err(instance->dev, 53 51 "vchi message queue failed: %d, msg=%d\n", ··· 91 89 return bcm2835_audio_send_msg(instance, &m, wait); 92 90 } 93 91 94 - static enum vchiq_status audio_vchi_callback(enum vchiq_reason reason, 92 + static enum vchiq_status audio_vchi_callback(struct vchiq_instance *vchiq_instance, 93 + enum vchiq_reason reason, 95 94 struct vchiq_header *header, 96 95 unsigned int handle, void *userdata) 97 96 { 98 - struct bcm2835_audio_instance *instance = vchiq_get_service_userdata(handle); 97 + struct bcm2835_audio_instance *instance = vchiq_get_service_userdata(vchiq_instance, 98 + handle); 99 99 struct vc_audio_msg *m; 100 100 101 101 if (reason != VCHIQ_MESSAGE_AVAILABLE) ··· 118 114 dev_err(instance->dev, "unexpected callback type=%d\n", m->type); 119 115 } 120 116 121 - vchiq_release_message(handle, header); 117 + vchiq_release_message(vchiq_instance, instance->service_handle, header); 122 118 return VCHIQ_SUCCESS; 123 119 } 124 120 ··· 147 143 } 148 144 149 145 /* Finished with the service for now */ 150 - vchiq_release_service(instance->service_handle); 146 + vchiq_release_service(instance->alsa_stream->chip->vchi_ctx->instance, 147 + instance->service_handle); 151 148 152 149 return 0; 153 150 } ··· 158 153 int status; 159 154 160 155 mutex_lock(&instance->vchi_mutex); 161 - vchiq_use_service(instance->service_handle); 156 + vchiq_use_service(instance->alsa_stream->chip->vchi_ctx->instance, 157 + instance->service_handle); 162 158 163 159 /* Close all VCHI service connections */ 164 - status = vchiq_close_service(instance->service_handle); 160 + status = vchiq_close_service(instance->alsa_stream->chip->vchi_ctx->instance, 161 + instance->service_handle); 165 162 if (status) { 166 163 dev_err(instance->dev, 167 164 "failed to close VCHI service connection (status=%d)\n", ··· 233 226 goto deinit; 234 227 235 228 bcm2835_audio_lock(instance); 236 - vchiq_get_peer_version(instance->service_handle, 229 + vchiq_get_peer_version(vchi_ctx->instance, instance->service_handle, 237 230 &instance->peer_version); 238 231 bcm2835_audio_unlock(instance); 239 232 if (instance->peer_version < 2 || force_bulk) ··· 329 322 unsigned int size, void *src) 330 323 { 331 324 struct bcm2835_audio_instance *instance = alsa_stream->instance; 325 + struct bcm2835_vchi_ctx *vchi_ctx = alsa_stream->chip->vchi_ctx; 326 + struct vchiq_instance *vchiq_instance = vchi_ctx->instance; 332 327 struct vc_audio_msg m = { 333 328 .type = VC_AUDIO_MSG_TYPE_WRITE, 334 329 .write.count = size, ··· 352 343 count = size; 353 344 if (!instance->max_packet) { 354 345 /* Send the message to the videocore */ 355 - status = vchiq_bulk_transmit(instance->service_handle, src, 356 - count, NULL, 357 - VCHIQ_BULK_MODE_BLOCKING); 346 + status = vchiq_bulk_transmit(vchiq_instance, instance->service_handle, src, count, 347 + NULL, VCHIQ_BULK_MODE_BLOCKING); 358 348 } else { 359 349 while (count > 0) { 360 350 int bytes = min(instance->max_packet, count); 361 351 362 - status = vchiq_queue_kernel_message(instance->service_handle, 363 - src, bytes); 352 + status = vchiq_queue_kernel_message(vchiq_instance, 353 + instance->service_handle, src, bytes); 364 354 src += bytes; 365 355 count -= bytes; 366 356 }
+28 -20
drivers/staging/vc04_services/include/linux/raspberrypi/vchiq.h
··· 53 53 unsigned int size; 54 54 }; 55 55 56 + struct vchiq_instance; 57 + 56 58 struct vchiq_service_base { 57 59 int fourcc; 58 - enum vchiq_status (*callback)(enum vchiq_reason reason, 60 + enum vchiq_status (*callback)(struct vchiq_instance *instance, 61 + enum vchiq_reason reason, 59 62 struct vchiq_header *header, 60 63 unsigned int handle, 61 64 void *bulk_userdata); ··· 74 71 75 72 struct vchiq_service_params_kernel { 76 73 int fourcc; 77 - enum vchiq_status (*callback)(enum vchiq_reason reason, 74 + enum vchiq_status (*callback)(struct vchiq_instance *instance, 75 + enum vchiq_reason reason, 78 76 struct vchiq_header *header, 79 77 unsigned int handle, 80 78 void *bulk_userdata); ··· 92 88 extern enum vchiq_status vchiq_open_service(struct vchiq_instance *instance, 93 89 const struct vchiq_service_params_kernel *params, 94 90 unsigned int *pservice); 95 - extern enum vchiq_status vchiq_close_service(unsigned int service); 96 - extern enum vchiq_status vchiq_use_service(unsigned int service); 97 - extern enum vchiq_status vchiq_release_service(unsigned int service); 98 - extern void vchiq_msg_queue_push(unsigned int handle, struct vchiq_header *header); 99 - extern void vchiq_release_message(unsigned int service, 100 - struct vchiq_header *header); 101 - extern int vchiq_queue_kernel_message(unsigned int handle, void *data, 102 - unsigned int size); 103 - extern enum vchiq_status vchiq_bulk_transmit(unsigned int service, 104 - const void *data, unsigned int size, void *userdata, 105 - enum vchiq_bulk_mode mode); 106 - extern enum vchiq_status vchiq_bulk_receive(unsigned int service, 107 - void *data, unsigned int size, void *userdata, 108 - enum vchiq_bulk_mode mode); 109 - extern void *vchiq_get_service_userdata(unsigned int service); 110 - extern enum vchiq_status vchiq_get_peer_version(unsigned int handle, 111 - short *peer_version); 112 - extern struct vchiq_header *vchiq_msg_hold(unsigned int handle); 91 + extern enum vchiq_status vchiq_close_service(struct vchiq_instance *instance, 92 + unsigned int service); 93 + extern enum vchiq_status vchiq_use_service(struct vchiq_instance *instance, unsigned int service); 94 + extern enum vchiq_status vchiq_release_service(struct vchiq_instance *instance, 95 + unsigned int service); 96 + extern void vchiq_msg_queue_push(struct vchiq_instance *instance, unsigned int handle, 97 + struct vchiq_header *header); 98 + extern void vchiq_release_message(struct vchiq_instance *instance, unsigned int service, 99 + struct vchiq_header *header); 100 + extern int vchiq_queue_kernel_message(struct vchiq_instance *instance, unsigned int handle, 101 + void *data, unsigned int size); 102 + extern enum vchiq_status vchiq_bulk_transmit(struct vchiq_instance *instance, unsigned int service, 103 + const void *data, unsigned int size, void *userdata, 104 + enum vchiq_bulk_mode mode); 105 + extern enum vchiq_status vchiq_bulk_receive(struct vchiq_instance *instance, unsigned int service, 106 + void *data, unsigned int size, void *userdata, 107 + enum vchiq_bulk_mode mode); 108 + extern void *vchiq_get_service_userdata(struct vchiq_instance *instance, unsigned int service); 109 + extern enum vchiq_status vchiq_get_peer_version(struct vchiq_instance *instance, 110 + unsigned int handle, 111 + short *peer_version); 112 + extern struct vchiq_header *vchiq_msg_hold(struct vchiq_instance *instance, unsigned int handle); 113 113 114 114 #endif /* VCHIQ_H */
+82
drivers/staging/vc04_services/interface/TESTING
··· 1 + This document contains some hints to test the function of the VCHIQ driver 2 + without having additional hardware to the Raspberry Pi. 3 + 4 + * Requirements & limitations 5 + 6 + Testing the VCHIQ driver requires a Raspberry Pi with one of the following SoC: 7 + - BCM2835 ( e.g. Raspberry Pi Zero W ) 8 + - BCM2836 ( e.g. Raspberry Pi 2 ) 9 + - BCM2837 ( e.g. Raspberry Pi 3 B+ ) 10 + 11 + The BCM2711 used in the Raspberry Pi 4 is currently not supported in the 12 + mainline kernel. 13 + 14 + There are no specific requirements to the VideoCore firmware to get VCHIQ 15 + working. 16 + 17 + The test scenarios described in this document based on the tool vchiq_test. 18 + Its source code is available here: https://github.com/raspberrypi/userland 19 + 20 + * Configuration 21 + 22 + Here are the most common kernel configurations: 23 + 24 + 1. BCM2835 target SoC (ARM 32 bit) 25 + 26 + Just use bcm2835_defconfig which already has VCHIQ enabled. 27 + 28 + 2. BCM2836/7 target SoC (ARM 32 bit) 29 + 30 + Use the multi_v7_defconfig as a base and then enable all VCHIQ options. 31 + 32 + 3. BCM2837 target SoC (ARM 64 bit) 33 + 34 + Use the defconfig as a base and then enable all VCHIQ options. 35 + 36 + * Scenarios 37 + 38 + * Initial test 39 + 40 + Check the driver is probed and /dev/vchiq is created 41 + 42 + * Functional test 43 + 44 + Command: vchiq_test -f 10 45 + 46 + Expected output: 47 + Functional test - iters:10 48 + ======== iteration 1 ======== 49 + Testing bulk transfer for alignment. 50 + Testing bulk transfer at PAGE_SIZE. 51 + ... 52 + 53 + * Ping test 54 + 55 + Command: vchiq_test -p 1 56 + 57 + Expected output: 58 + Ping test - service:echo, iters:1, version 3 59 + vchi ping (size 0) -> 57.000000us 60 + vchi ping (size 0, 0 async, 0 oneway) -> 122.000000us 61 + vchi bulk (size 0, 0 async, 0 oneway) -> 546.000000us 62 + vchi bulk (size 0, 0 oneway) -> 230.000000us 63 + vchi ping (size 0) -> 49.000000us 64 + vchi ping (size 0, 0 async, 0 oneway) -> 70.000000us 65 + vchi bulk (size 0, 0 async, 0 oneway) -> 296.000000us 66 + vchi bulk (size 0, 0 oneway) -> 266.000000us 67 + vchi ping (size 0, 1 async, 0 oneway) -> 65.000000us 68 + vchi bulk (size 0, 0 oneway) -> 456.000000us 69 + vchi ping (size 0, 2 async, 0 oneway) -> 74.000000us 70 + vchi bulk (size 0, 0 oneway) -> 640.000000us 71 + vchi ping (size 0, 10 async, 0 oneway) -> 125.000000us 72 + vchi bulk (size 0, 0 oneway) -> 2309.000000us 73 + vchi ping (size 0, 0 async, 1 oneway) -> 70.000000us 74 + vchi ping (size 0, 0 async, 2 oneway) -> 76.000000us 75 + vchi ping (size 0, 0 async, 10 oneway) -> 105.000000us 76 + vchi ping (size 0, 10 async, 10 oneway) -> 165.000000us 77 + vchi ping (size 0, 100 async, 0 oneway) -> nanus 78 + vchi bulk (size 0, 0 oneway) -> nanus 79 + vchi ping (size 0, 0 async, 100 oneway) -> nanus 80 + vchi ping (size 0, 100 async, 100 oneway) -> infus 81 + vchi ping (size 0, 200 async, 0 oneway) -> infus 82 + ...
+47 -49
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
··· 148 148 static char *g_fragments_base; 149 149 static char *g_free_fragments; 150 150 static struct semaphore g_free_fragments_sema; 151 - static struct device *g_dev; 152 151 153 152 static DEFINE_SEMAPHORE(g_free_fragments_mutex); 154 153 155 154 static enum vchiq_status 156 - vchiq_blocking_bulk_transfer(unsigned int handle, void *data, 155 + vchiq_blocking_bulk_transfer(struct vchiq_instance *instance, unsigned int handle, void *data, 157 156 unsigned int size, enum vchiq_bulk_dir dir); 158 157 159 158 static irqreturn_t ··· 174 175 } 175 176 176 177 static void 177 - cleanup_pagelistinfo(struct vchiq_pagelist_info *pagelistinfo) 178 + cleanup_pagelistinfo(struct vchiq_instance *instance, struct vchiq_pagelist_info *pagelistinfo) 178 179 { 179 180 if (pagelistinfo->scatterlist_mapped) { 180 - dma_unmap_sg(g_dev, pagelistinfo->scatterlist, 181 + dma_unmap_sg(instance->state->dev, pagelistinfo->scatterlist, 181 182 pagelistinfo->num_pages, pagelistinfo->dma_dir); 182 183 } 183 184 184 185 if (pagelistinfo->pages_need_release) 185 186 unpin_user_pages(pagelistinfo->pages, pagelistinfo->num_pages); 186 187 187 - dma_free_coherent(g_dev, pagelistinfo->pagelist_buffer_size, 188 + dma_free_coherent(instance->state->dev, pagelistinfo->pagelist_buffer_size, 188 189 pagelistinfo->pagelist, pagelistinfo->dma_addr); 189 190 } 190 191 ··· 211 212 */ 212 213 213 214 static struct vchiq_pagelist_info * 214 - create_pagelist(char *buf, char __user *ubuf, 215 + create_pagelist(struct vchiq_instance *instance, char *buf, char __user *ubuf, 215 216 size_t count, unsigned short type) 216 217 { 217 218 struct pagelist *pagelist; ··· 249 250 /* Allocate enough storage to hold the page pointers and the page 250 251 * list 251 252 */ 252 - pagelist = dma_alloc_coherent(g_dev, pagelist_size, &dma_addr, 253 + pagelist = dma_alloc_coherent(instance->state->dev, pagelist_size, &dma_addr, 253 254 GFP_KERNEL); 254 255 255 256 vchiq_log_trace(vchiq_arm_log_level, "%s - %pK", __func__, pagelist); ··· 291 292 size_t bytes = PAGE_SIZE - off; 292 293 293 294 if (!pg) { 294 - cleanup_pagelistinfo(pagelistinfo); 295 + cleanup_pagelistinfo(instance, pagelistinfo); 295 296 return NULL; 296 297 } 297 298 ··· 314 315 /* This is probably due to the process being killed */ 315 316 if (actual_pages > 0) 316 317 unpin_user_pages(pages, actual_pages); 317 - cleanup_pagelistinfo(pagelistinfo); 318 + cleanup_pagelistinfo(instance, pagelistinfo); 318 319 return NULL; 319 320 } 320 321 /* release user pages */ ··· 337 338 count -= len; 338 339 } 339 340 340 - dma_buffers = dma_map_sg(g_dev, 341 + dma_buffers = dma_map_sg(instance->state->dev, 341 342 scatterlist, 342 343 num_pages, 343 344 pagelistinfo->dma_dir); 344 345 345 346 if (dma_buffers == 0) { 346 - cleanup_pagelistinfo(pagelistinfo); 347 + cleanup_pagelistinfo(instance, pagelistinfo); 347 348 return NULL; 348 349 } 349 350 ··· 377 378 char *fragments; 378 379 379 380 if (down_interruptible(&g_free_fragments_sema)) { 380 - cleanup_pagelistinfo(pagelistinfo); 381 + cleanup_pagelistinfo(instance, pagelistinfo); 381 382 return NULL; 382 383 } 383 384 ··· 396 397 } 397 398 398 399 static void 399 - free_pagelist(struct vchiq_pagelist_info *pagelistinfo, 400 + free_pagelist(struct vchiq_instance *instance, struct vchiq_pagelist_info *pagelistinfo, 400 401 int actual) 401 402 { 402 403 struct pagelist *pagelist = pagelistinfo->pagelist; ··· 410 411 * NOTE: dma_unmap_sg must be called before the 411 412 * cpu can touch any of the data/pages. 412 413 */ 413 - dma_unmap_sg(g_dev, pagelistinfo->scatterlist, 414 + dma_unmap_sg(instance->state->dev, pagelistinfo->scatterlist, 414 415 pagelistinfo->num_pages, pagelistinfo->dma_dir); 415 416 pagelistinfo->scatterlist_mapped = 0; 416 417 ··· 459 460 set_page_dirty(pages[i]); 460 461 } 461 462 462 - cleanup_pagelistinfo(pagelistinfo); 463 + cleanup_pagelistinfo(instance, pagelistinfo); 463 464 } 464 465 465 466 int vchiq_platform_init(struct platform_device *pdev, struct vchiq_state *state) ··· 518 519 *(char **)&g_fragments_base[i * g_fragments_size] = NULL; 519 520 sema_init(&g_free_fragments_sema, MAX_FRAGMENTS); 520 521 521 - err = vchiq_init_state(state, vchiq_slot_zero); 522 + err = vchiq_init_state(state, vchiq_slot_zero, dev); 522 523 if (err) 523 524 return err; 524 525 ··· 546 547 return err ? : -ENXIO; 547 548 } 548 549 549 - g_dev = dev; 550 550 vchiq_log_info(vchiq_arm_log_level, "vchiq_init - done (slots %pK, phys %pad)", 551 551 vchiq_slot_zero, &slot_phys); 552 552 ··· 602 604 void 603 605 remote_event_signal(struct remote_event *event) 604 606 { 607 + /* 608 + * Ensure that all writes to shared data structures have completed 609 + * before signalling the peer. 610 + */ 605 611 wmb(); 606 612 607 613 event->fired = 1; ··· 617 615 } 618 616 619 617 int 620 - vchiq_prepare_bulk_data(struct vchiq_bulk *bulk, void *offset, 618 + vchiq_prepare_bulk_data(struct vchiq_instance *instance, struct vchiq_bulk *bulk, void *offset, 621 619 void __user *uoffset, int size, int dir) 622 620 { 623 621 struct vchiq_pagelist_info *pagelistinfo; 624 622 625 - pagelistinfo = create_pagelist(offset, uoffset, size, 623 + pagelistinfo = create_pagelist(instance, offset, uoffset, size, 626 624 (dir == VCHIQ_BULK_RECEIVE) 627 625 ? PAGELIST_READ 628 626 : PAGELIST_WRITE); ··· 642 640 } 643 641 644 642 void 645 - vchiq_complete_bulk(struct vchiq_bulk *bulk) 643 + vchiq_complete_bulk(struct vchiq_instance *instance, struct vchiq_bulk *bulk) 646 644 { 647 645 if (bulk && bulk->remote_data && bulk->actual) 648 - free_pagelist((struct vchiq_pagelist_info *)bulk->remote_data, 646 + free_pagelist(instance, (struct vchiq_pagelist_info *)bulk->remote_data, 649 647 bulk->actual); 650 648 } 651 649 ··· 823 821 *phandle = service->handle; 824 822 status = vchiq_open_service_internal(service, current->pid); 825 823 if (status != VCHIQ_SUCCESS) { 826 - vchiq_remove_service(service->handle); 824 + vchiq_remove_service(instance, service->handle); 827 825 *phandle = VCHIQ_SERVICE_HANDLE_INVALID; 828 826 } 829 827 } ··· 836 834 EXPORT_SYMBOL(vchiq_open_service); 837 835 838 836 enum vchiq_status 839 - vchiq_bulk_transmit(unsigned int handle, const void *data, unsigned int size, 840 - void *userdata, enum vchiq_bulk_mode mode) 837 + vchiq_bulk_transmit(struct vchiq_instance *instance, unsigned int handle, const void *data, 838 + unsigned int size, void *userdata, enum vchiq_bulk_mode mode) 841 839 { 842 840 enum vchiq_status status; 843 841 ··· 845 843 switch (mode) { 846 844 case VCHIQ_BULK_MODE_NOCALLBACK: 847 845 case VCHIQ_BULK_MODE_CALLBACK: 848 - status = vchiq_bulk_transfer(handle, 846 + status = vchiq_bulk_transfer(instance, handle, 849 847 (void *)data, NULL, 850 848 size, userdata, mode, 851 849 VCHIQ_BULK_TRANSMIT); 852 850 break; 853 851 case VCHIQ_BULK_MODE_BLOCKING: 854 - status = vchiq_blocking_bulk_transfer(handle, (void *)data, size, 852 + status = vchiq_blocking_bulk_transfer(instance, handle, (void *)data, size, 855 853 VCHIQ_BULK_TRANSMIT); 856 854 break; 857 855 default: ··· 873 871 } 874 872 EXPORT_SYMBOL(vchiq_bulk_transmit); 875 873 876 - enum vchiq_status vchiq_bulk_receive(unsigned int handle, void *data, 877 - unsigned int size, void *userdata, 874 + enum vchiq_status vchiq_bulk_receive(struct vchiq_instance *instance, unsigned int handle, 875 + void *data, unsigned int size, void *userdata, 878 876 enum vchiq_bulk_mode mode) 879 877 { 880 878 enum vchiq_status status; ··· 883 881 switch (mode) { 884 882 case VCHIQ_BULK_MODE_NOCALLBACK: 885 883 case VCHIQ_BULK_MODE_CALLBACK: 886 - status = vchiq_bulk_transfer(handle, data, NULL, 884 + status = vchiq_bulk_transfer(instance, handle, data, NULL, 887 885 size, userdata, 888 886 mode, VCHIQ_BULK_RECEIVE); 889 887 break; 890 888 case VCHIQ_BULK_MODE_BLOCKING: 891 - status = vchiq_blocking_bulk_transfer(handle, (void *)data, size, 889 + status = vchiq_blocking_bulk_transfer(instance, handle, (void *)data, size, 892 890 VCHIQ_BULK_RECEIVE); 893 891 break; 894 892 default: ··· 911 909 EXPORT_SYMBOL(vchiq_bulk_receive); 912 910 913 911 static enum vchiq_status 914 - vchiq_blocking_bulk_transfer(unsigned int handle, void *data, unsigned int size, 915 - enum vchiq_bulk_dir dir) 912 + vchiq_blocking_bulk_transfer(struct vchiq_instance *instance, unsigned int handle, void *data, 913 + unsigned int size, enum vchiq_bulk_dir dir) 916 914 { 917 - struct vchiq_instance *instance; 918 915 struct vchiq_service *service; 919 916 enum vchiq_status status; 920 917 struct bulk_waiter_node *waiter = NULL, *iter; 921 918 922 - service = find_service_by_handle(handle); 919 + service = find_service_by_handle(instance, handle); 923 920 if (!service) 924 921 return VCHIQ_ERROR; 925 - 926 - instance = service->instance; 927 922 928 923 vchiq_service_put(service); 929 924 ··· 958 959 } 959 960 } 960 961 961 - status = vchiq_bulk_transfer(handle, data, NULL, size, 962 + status = vchiq_bulk_transfer(instance, handle, data, NULL, size, 962 963 &waiter->bulk_waiter, 963 964 VCHIQ_BULK_MODE_BLOCKING, dir); 964 965 if ((status != VCHIQ_RETRY) || fatal_signal_pending(current) || !waiter->bulk_waiter.bulk) { ··· 1045 1046 } 1046 1047 1047 1048 enum vchiq_status 1048 - service_callback(enum vchiq_reason reason, struct vchiq_header *header, 1049 - unsigned int handle, void *bulk_userdata) 1049 + service_callback(struct vchiq_instance *instance, enum vchiq_reason reason, 1050 + struct vchiq_header *header, unsigned int handle, void *bulk_userdata) 1050 1051 { 1051 1052 /* 1052 1053 * How do we ensure the callback goes to the right client? ··· 1056 1057 */ 1057 1058 struct user_service *user_service; 1058 1059 struct vchiq_service *service; 1059 - struct vchiq_instance *instance; 1060 1060 bool skip_completion = false; 1061 1061 1062 1062 DEBUG_INITIALISE(g_state.local); ··· 1063 1065 DEBUG_TRACE(SERVICE_CALLBACK_LINE); 1064 1066 1065 1067 rcu_read_lock(); 1066 - service = handle_to_service(handle); 1068 + service = handle_to_service(instance, handle); 1067 1069 if (WARN_ON(!service)) { 1068 1070 rcu_read_unlock(); 1069 1071 return VCHIQ_SUCCESS; 1070 1072 } 1071 1073 1072 1074 user_service = (struct user_service *)service->base.userdata; 1073 - instance = user_service->instance; 1074 1075 1075 1076 if (!instance || instance->closing) { 1076 1077 rcu_read_unlock(); ··· 1315 1318 */ 1316 1319 1317 1320 static enum vchiq_status 1318 - vchiq_keepalive_vchiq_callback(enum vchiq_reason reason, 1321 + vchiq_keepalive_vchiq_callback(struct vchiq_instance *instance, 1322 + enum vchiq_reason reason, 1319 1323 struct vchiq_header *header, 1320 1324 unsigned int service_user, void *bulk_user) 1321 1325 { ··· 1385 1387 */ 1386 1388 while (uc--) { 1387 1389 atomic_inc(&arm_state->ka_use_ack_count); 1388 - status = vchiq_use_service(ka_handle); 1390 + status = vchiq_use_service(instance, ka_handle); 1389 1391 if (status != VCHIQ_SUCCESS) { 1390 1392 vchiq_log_error(vchiq_susp_log_level, 1391 1393 "%s vchiq_use_service error %d", __func__, status); 1392 1394 } 1393 1395 } 1394 1396 while (rc--) { 1395 - status = vchiq_release_service(ka_handle); 1397 + status = vchiq_release_service(instance, ka_handle); 1396 1398 if (status != VCHIQ_SUCCESS) { 1397 1399 vchiq_log_error(vchiq_susp_log_level, 1398 1400 "%s vchiq_release_service error %d", __func__, ··· 1588 1590 } 1589 1591 1590 1592 enum vchiq_status 1591 - vchiq_use_service(unsigned int handle) 1593 + vchiq_use_service(struct vchiq_instance *instance, unsigned int handle) 1592 1594 { 1593 1595 enum vchiq_status ret = VCHIQ_ERROR; 1594 - struct vchiq_service *service = find_service_by_handle(handle); 1596 + struct vchiq_service *service = find_service_by_handle(instance, handle); 1595 1597 1596 1598 if (service) { 1597 1599 ret = vchiq_use_internal(service->state, service, USE_TYPE_SERVICE); ··· 1602 1604 EXPORT_SYMBOL(vchiq_use_service); 1603 1605 1604 1606 enum vchiq_status 1605 - vchiq_release_service(unsigned int handle) 1607 + vchiq_release_service(struct vchiq_instance *instance, unsigned int handle) 1606 1608 { 1607 1609 enum vchiq_status ret = VCHIQ_ERROR; 1608 - struct vchiq_service *service = find_service_by_handle(handle); 1610 + struct vchiq_service *service = find_service_by_handle(instance, handle); 1609 1611 1610 1612 if (service) { 1611 1613 ret = vchiq_release_internal(service->state, service);
+4 -4
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.h
··· 86 86 vchiq_get_state(void); 87 87 88 88 enum vchiq_status 89 - vchiq_use_service(unsigned int handle); 89 + vchiq_use_service(struct vchiq_instance *instance, unsigned int handle); 90 90 91 91 extern enum vchiq_status 92 - vchiq_release_service(unsigned int handle); 92 + vchiq_release_service(struct vchiq_instance *instance, unsigned int handle); 93 93 94 94 extern enum vchiq_status 95 95 vchiq_check_service(struct vchiq_service *service); ··· 138 138 #endif /* IS_ENABLED(CONFIG_VCHIQ_CDEV) */ 139 139 140 140 extern enum vchiq_status 141 - service_callback(enum vchiq_reason reason, struct vchiq_header *header, 142 - unsigned int handle, void *bulk_userdata); 141 + service_callback(struct vchiq_instance *vchiq_instance, enum vchiq_reason reason, 142 + struct vchiq_header *header, unsigned int handle, void *bulk_userdata); 143 143 144 144 extern void 145 145 free_bulk_waiter(struct vchiq_instance *instance);
+60 -46
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c
··· 13 13 #include <linux/rcupdate.h> 14 14 #include <linux/sched/signal.h> 15 15 16 + #include "vchiq_arm.h" 16 17 #include "vchiq_core.h" 17 18 18 19 #define VCHIQ_SLOT_HANDLER_STACK 8192 ··· 162 161 DEFINE_SPINLOCK(bulk_waiter_spinlock); 163 162 static DEFINE_SPINLOCK(quota_spinlock); 164 163 165 - struct vchiq_state *vchiq_states[VCHIQ_MAX_STATES]; 166 164 static unsigned int handle_seq; 167 165 168 166 static const char *const srvstate_names[] = { ··· 234 234 service->srvstate = newstate; 235 235 } 236 236 237 + struct vchiq_service *handle_to_service(struct vchiq_instance *instance, unsigned int handle) 238 + { 239 + int idx = handle & (VCHIQ_MAX_SERVICES - 1); 240 + 241 + return rcu_dereference(instance->state->services[idx]); 242 + } 237 243 struct vchiq_service * 238 - find_service_by_handle(unsigned int handle) 244 + find_service_by_handle(struct vchiq_instance *instance, unsigned int handle) 239 245 { 240 246 struct vchiq_service *service; 241 247 242 248 rcu_read_lock(); 243 - service = handle_to_service(handle); 249 + service = handle_to_service(instance, handle); 244 250 if (service && service->srvstate != VCHIQ_SRVSTATE_FREE && 245 251 service->handle == handle && 246 252 kref_get_unless_zero(&service->ref_count)) { ··· 287 281 struct vchiq_service *service; 288 282 289 283 rcu_read_lock(); 290 - service = handle_to_service(handle); 284 + service = handle_to_service(instance, handle); 291 285 if (service && service->srvstate != VCHIQ_SRVSTATE_FREE && 292 286 service->handle == handle && 293 287 service->instance == instance && ··· 308 302 struct vchiq_service *service; 309 303 310 304 rcu_read_lock(); 311 - service = handle_to_service(handle); 305 + service = handle_to_service(instance, handle); 312 306 if (service && 313 307 (service->srvstate == VCHIQ_SRVSTATE_FREE || 314 308 service->srvstate == VCHIQ_SRVSTATE_CLOSED) && ··· 404 398 } 405 399 406 400 int 407 - vchiq_get_client_id(unsigned int handle) 401 + vchiq_get_client_id(struct vchiq_instance *instance, unsigned int handle) 408 402 { 409 403 struct vchiq_service *service; 410 404 int id; 411 405 412 406 rcu_read_lock(); 413 - service = handle_to_service(handle); 407 + service = handle_to_service(instance, handle); 414 408 id = service ? service->client_id : 0; 415 409 rcu_read_unlock(); 416 410 return id; 417 411 } 418 412 419 413 void * 420 - vchiq_get_service_userdata(unsigned int handle) 414 + vchiq_get_service_userdata(struct vchiq_instance *instance, unsigned int handle) 421 415 { 422 416 void *userdata; 423 417 struct vchiq_service *service; 424 418 425 419 rcu_read_lock(); 426 - service = handle_to_service(handle); 420 + service = handle_to_service(instance, handle); 427 421 userdata = service ? service->base.userdata : NULL; 428 422 rcu_read_unlock(); 429 423 return userdata; ··· 472 466 vchiq_log_trace(vchiq_core_log_level, "%d: callback:%d (%s, %pK, %pK)", 473 467 service->state->id, service->localport, reason_names[reason], 474 468 header, bulk_userdata); 475 - status = service->base.callback(reason, header, service->handle, bulk_userdata); 469 + status = service->base.callback(service->instance, reason, header, service->handle, 470 + bulk_userdata); 476 471 if (status == VCHIQ_ERROR) { 477 472 vchiq_log_warning(vchiq_core_log_level, 478 473 "%d: ignoring ERROR from callback to service %x", ··· 482 475 } 483 476 484 477 if (reason != VCHIQ_MESSAGE_AVAILABLE) 485 - vchiq_release_message(service->handle, header); 478 + vchiq_release_message(service->instance, service->handle, header); 486 479 487 480 return status; 488 481 } ··· 528 521 return 0; 529 522 } 530 523 event->armed = 0; 524 + /* Ensure that the peer sees that we are not waiting (armed == 0). */ 531 525 wmb(); 532 526 } 533 527 ··· 651 643 652 644 skip_service: 653 645 state->poll_needed = 1; 646 + /* Ensure the slot handler thread sees the poll_needed flag. */ 654 647 wmb(); 655 648 656 649 /* ... and ensure the slot handler runs. */ ··· 1158 1149 1159 1150 remote_event_wait(&state->sync_release_event, &local->sync_release); 1160 1151 1152 + /* Ensure that reads don't overtake the remote_event_wait. */ 1161 1153 rmb(); 1162 1154 1163 1155 header = (struct vchiq_header *)SLOT_DATA_FROM_INDEX(state, ··· 1451 1441 } 1452 1442 1453 1443 if (queue->process != queue->local_insert) { 1454 - vchiq_complete_bulk(bulk); 1444 + vchiq_complete_bulk(service->instance, bulk); 1455 1445 1456 1446 vchiq_log_info(SRVTRACE_LEVEL(service), 1457 1447 "%s %c%c%c%c d:%d ABORTED - tx len:%d, rx len:%d", ··· 1779 1769 1780 1770 DEBUG_TRACE(PARSE_LINE); 1781 1771 WARN_ON(queue->process == queue->local_insert); 1782 - vchiq_complete_bulk(bulk); 1772 + vchiq_complete_bulk(service->instance, bulk); 1783 1773 queue->process++; 1784 1774 mutex_unlock(&service->bulk_mutex); 1785 1775 DEBUG_TRACE(PARSE_LINE); ··· 1962 1952 DEBUG_TRACE(SLOT_HANDLER_LINE); 1963 1953 remote_event_wait(&state->trigger_event, &local->trigger); 1964 1954 1955 + /* Ensure that reads don't overtake the remote_event_wait. */ 1965 1956 rmb(); 1966 1957 1967 1958 DEBUG_TRACE(SLOT_HANDLER_LINE); ··· 2025 2014 2026 2015 remote_event_wait(&state->sync_trigger_event, &local->sync_trigger); 2027 2016 2017 + /* Ensure that reads don't overtake the remote_event_wait. */ 2028 2018 rmb(); 2029 2019 2030 2020 msgid = header->msgid; ··· 2154 2142 } 2155 2143 2156 2144 int 2157 - vchiq_init_state(struct vchiq_state *state, struct vchiq_slot_zero *slot_zero) 2145 + vchiq_init_state(struct vchiq_state *state, struct vchiq_slot_zero *slot_zero, struct device *dev) 2158 2146 { 2159 2147 struct vchiq_shared_state *local; 2160 2148 struct vchiq_shared_state *remote; 2161 2149 char threadname[16]; 2162 2150 int i, ret; 2163 - 2164 - if (vchiq_states[0]) { 2165 - pr_err("%s: VCHIQ state already initialized\n", __func__); 2166 - return -EINVAL; 2167 - } 2168 2151 2169 2152 local = &slot_zero->slave; 2170 2153 remote = &slot_zero->master; ··· 2175 2168 } 2176 2169 2177 2170 memset(state, 0, sizeof(struct vchiq_state)); 2171 + 2172 + state->dev = dev; 2178 2173 2179 2174 /* 2180 2175 * initialize shared state pointers ··· 2281 2272 wake_up_process(state->recycle_thread); 2282 2273 wake_up_process(state->sync_thread); 2283 2274 2284 - vchiq_states[0] = state; 2285 - 2286 2275 /* Indicate readiness to the other side */ 2287 2276 local->initialised = 1; 2288 2277 ··· 2294 2287 return ret; 2295 2288 } 2296 2289 2297 - void vchiq_msg_queue_push(unsigned int handle, struct vchiq_header *header) 2290 + void vchiq_msg_queue_push(struct vchiq_instance *instance, unsigned int handle, 2291 + struct vchiq_header *header) 2298 2292 { 2299 - struct vchiq_service *service = find_service_by_handle(handle); 2293 + struct vchiq_service *service = find_service_by_handle(instance, handle); 2300 2294 int pos; 2301 2295 2302 2296 if (!service) ··· 2317 2309 } 2318 2310 EXPORT_SYMBOL(vchiq_msg_queue_push); 2319 2311 2320 - struct vchiq_header *vchiq_msg_hold(unsigned int handle) 2312 + struct vchiq_header *vchiq_msg_hold(struct vchiq_instance *instance, unsigned int handle) 2321 2313 { 2322 - struct vchiq_service *service = find_service_by_handle(handle); 2314 + struct vchiq_service *service = find_service_by_handle(instance, handle); 2323 2315 struct vchiq_header *header; 2324 2316 int pos; 2325 2317 ··· 2874 2866 /* Find all services registered to this client and remove them. */ 2875 2867 i = 0; 2876 2868 while ((service = next_service_by_instance(state, instance, &i)) != NULL) { 2877 - (void)vchiq_remove_service(service->handle); 2869 + (void)vchiq_remove_service(instance, service->handle); 2878 2870 vchiq_service_put(service); 2879 2871 } 2880 2872 } 2881 2873 2882 2874 enum vchiq_status 2883 - vchiq_close_service(unsigned int handle) 2875 + vchiq_close_service(struct vchiq_instance *instance, unsigned int handle) 2884 2876 { 2885 2877 /* Unregister the service */ 2886 - struct vchiq_service *service = find_service_by_handle(handle); 2878 + struct vchiq_service *service = find_service_by_handle(instance, handle); 2887 2879 enum vchiq_status status = VCHIQ_SUCCESS; 2888 2880 2889 2881 if (!service) ··· 2938 2930 EXPORT_SYMBOL(vchiq_close_service); 2939 2931 2940 2932 enum vchiq_status 2941 - vchiq_remove_service(unsigned int handle) 2933 + vchiq_remove_service(struct vchiq_instance *instance, unsigned int handle) 2942 2934 { 2943 2935 /* Unregister the service */ 2944 - struct vchiq_service *service = find_service_by_handle(handle); 2936 + struct vchiq_service *service = find_service_by_handle(instance, handle); 2945 2937 enum vchiq_status status = VCHIQ_SUCCESS; 2946 2938 2947 2939 if (!service) ··· 3004 2996 * When called in blocking mode, the userdata field points to a bulk_waiter 3005 2997 * structure. 3006 2998 */ 3007 - enum vchiq_status vchiq_bulk_transfer(unsigned int handle, void *offset, void __user *uoffset, 3008 - int size, void *userdata, enum vchiq_bulk_mode mode, 3009 - enum vchiq_bulk_dir dir) 2999 + enum vchiq_status vchiq_bulk_transfer(struct vchiq_instance *instance, unsigned int handle, 3000 + void *offset, void __user *uoffset, int size, void *userdata, 3001 + enum vchiq_bulk_mode mode, enum vchiq_bulk_dir dir) 3010 3002 { 3011 - struct vchiq_service *service = find_service_by_handle(handle); 3003 + struct vchiq_service *service = find_service_by_handle(instance, handle); 3012 3004 struct vchiq_bulk_queue *queue; 3013 3005 struct vchiq_bulk *bulk; 3014 3006 struct vchiq_state *state; ··· 3083 3075 bulk->size = size; 3084 3076 bulk->actual = VCHIQ_BULK_ACTUAL_ABORTED; 3085 3077 3086 - if (vchiq_prepare_bulk_data(bulk, offset, uoffset, size, dir)) 3078 + if (vchiq_prepare_bulk_data(instance, bulk, offset, uoffset, size, dir)) 3087 3079 goto unlock_error_exit; 3088 3080 3081 + /* 3082 + * Ensure that the bulk data record is visible to the peer 3083 + * before proceeding. 3084 + */ 3089 3085 wmb(); 3090 3086 3091 3087 vchiq_log_info(vchiq_core_log_level, "%d: bt (%d->%d) %cx %x@%pad %pK", ··· 3151 3139 unlock_both_error_exit: 3152 3140 mutex_unlock(&state->slot_mutex); 3153 3141 cancel_bulk_error_exit: 3154 - vchiq_complete_bulk(bulk); 3142 + vchiq_complete_bulk(service->instance, bulk); 3155 3143 unlock_error_exit: 3156 3144 mutex_unlock(&service->bulk_mutex); 3157 3145 ··· 3162 3150 } 3163 3151 3164 3152 enum vchiq_status 3165 - vchiq_queue_message(unsigned int handle, 3153 + vchiq_queue_message(struct vchiq_instance *instance, unsigned int handle, 3166 3154 ssize_t (*copy_callback)(void *context, void *dest, 3167 3155 size_t offset, size_t maxsize), 3168 3156 void *context, 3169 3157 size_t size) 3170 3158 { 3171 - struct vchiq_service *service = find_service_by_handle(handle); 3159 + struct vchiq_service *service = find_service_by_handle(instance, handle); 3172 3160 enum vchiq_status status = VCHIQ_ERROR; 3173 3161 int data_id; 3174 3162 ··· 3211 3199 return status; 3212 3200 } 3213 3201 3214 - int vchiq_queue_kernel_message(unsigned int handle, void *data, unsigned int size) 3202 + int vchiq_queue_kernel_message(struct vchiq_instance *instance, unsigned int handle, void *data, 3203 + unsigned int size) 3215 3204 { 3216 3205 enum vchiq_status status; 3217 3206 3218 3207 while (1) { 3219 - status = vchiq_queue_message(handle, memcpy_copy_callback, 3208 + status = vchiq_queue_message(instance, handle, memcpy_copy_callback, 3220 3209 data, size); 3221 3210 3222 3211 /* ··· 3236 3223 EXPORT_SYMBOL(vchiq_queue_kernel_message); 3237 3224 3238 3225 void 3239 - vchiq_release_message(unsigned int handle, 3226 + vchiq_release_message(struct vchiq_instance *instance, unsigned int handle, 3240 3227 struct vchiq_header *header) 3241 3228 { 3242 - struct vchiq_service *service = find_service_by_handle(handle); 3229 + struct vchiq_service *service = find_service_by_handle(instance, handle); 3243 3230 struct vchiq_shared_state *remote; 3244 3231 struct vchiq_state *state; 3245 3232 int slot_index; ··· 3278 3265 } 3279 3266 3280 3267 enum vchiq_status 3281 - vchiq_get_peer_version(unsigned int handle, short *peer_version) 3268 + vchiq_get_peer_version(struct vchiq_instance *instance, unsigned int handle, short *peer_version) 3282 3269 { 3283 3270 enum vchiq_status status = VCHIQ_ERROR; 3284 - struct vchiq_service *service = find_service_by_handle(handle); 3271 + struct vchiq_service *service = find_service_by_handle(instance, handle); 3285 3272 3286 3273 if (!service) 3287 3274 goto exit; ··· 3313 3300 } 3314 3301 3315 3302 int 3316 - vchiq_set_service_option(unsigned int handle, enum vchiq_service_option option, int value) 3303 + vchiq_set_service_option(struct vchiq_instance *instance, unsigned int handle, 3304 + enum vchiq_service_option option, int value) 3317 3305 { 3318 - struct vchiq_service *service = find_service_by_handle(handle); 3306 + struct vchiq_service *service = find_service_by_handle(instance, handle); 3319 3307 struct vchiq_service_quota *quota; 3320 3308 int ret = -EINVAL; 3321 3309
+14 -24
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h
··· 314 314 }; 315 315 316 316 struct vchiq_state { 317 + struct device *dev; 317 318 int id; 318 319 int initialised; 319 320 enum vchiq_connstate conn_state; ··· 449 448 extern int vchiq_core_msg_log_level; 450 449 extern int vchiq_sync_log_level; 451 450 452 - extern struct vchiq_state *vchiq_states[VCHIQ_MAX_STATES]; 453 - 454 451 extern const char * 455 452 get_conn_state_name(enum vchiq_connstate conn_state); 456 453 ··· 456 457 vchiq_init_slots(void *mem_base, int mem_size); 457 458 458 459 extern int 459 - vchiq_init_state(struct vchiq_state *state, struct vchiq_slot_zero *slot_zero); 460 + vchiq_init_state(struct vchiq_state *state, struct vchiq_slot_zero *slot_zero, struct device *dev); 460 461 461 462 extern enum vchiq_status 462 463 vchiq_connect_internal(struct vchiq_state *state, struct vchiq_instance *instance); ··· 486 487 remote_event_pollall(struct vchiq_state *state); 487 488 488 489 extern enum vchiq_status 489 - vchiq_bulk_transfer(unsigned int handle, void *offset, void __user *uoffset, 490 - int size, void *userdata, enum vchiq_bulk_mode mode, 490 + vchiq_bulk_transfer(struct vchiq_instance *instance, unsigned int handle, void *offset, 491 + void __user *uoffset, int size, void *userdata, enum vchiq_bulk_mode mode, 491 492 enum vchiq_bulk_dir dir); 492 493 493 494 extern int ··· 506 507 request_poll(struct vchiq_state *state, struct vchiq_service *service, 507 508 int poll_type); 508 509 509 - static inline struct vchiq_service * 510 - handle_to_service(unsigned int handle) 511 - { 512 - int idx = handle & (VCHIQ_MAX_SERVICES - 1); 513 - struct vchiq_state *state = vchiq_states[(handle / VCHIQ_MAX_SERVICES) & 514 - (VCHIQ_MAX_STATES - 1)]; 515 - 516 - if (!state) 517 - return NULL; 518 - return rcu_dereference(state->services[idx]); 519 - } 510 + struct vchiq_service *handle_to_service(struct vchiq_instance *instance, unsigned int handle); 520 511 521 512 extern struct vchiq_service * 522 - find_service_by_handle(unsigned int handle); 513 + find_service_by_handle(struct vchiq_instance *instance, unsigned int handle); 523 514 524 515 extern struct vchiq_service * 525 516 find_service_by_port(struct vchiq_state *state, unsigned int localport); ··· 537 548 vchiq_service_put(struct vchiq_service *service); 538 549 539 550 extern enum vchiq_status 540 - vchiq_queue_message(unsigned int handle, 551 + vchiq_queue_message(struct vchiq_instance *instance, unsigned int handle, 541 552 ssize_t (*copy_callback)(void *context, void *dest, 542 553 size_t offset, size_t maxsize), 543 554 void *context, 544 555 size_t size); 545 556 546 - int vchiq_prepare_bulk_data(struct vchiq_bulk *bulk, void *offset, void __user *uoffset, 547 - int size, int dir); 557 + int vchiq_prepare_bulk_data(struct vchiq_instance *instance, struct vchiq_bulk *bulk, void *offset, 558 + void __user *uoffset, int size, int dir); 548 559 549 - void vchiq_complete_bulk(struct vchiq_bulk *bulk); 560 + void vchiq_complete_bulk(struct vchiq_instance *instance, struct vchiq_bulk *bulk); 550 561 551 562 void remote_event_signal(struct remote_event *event); 552 563 ··· 584 595 585 596 void vchiq_log_dump_mem(const char *label, u32 addr, const void *void_mem, size_t num_bytes); 586 597 587 - enum vchiq_status vchiq_remove_service(unsigned int service); 598 + enum vchiq_status vchiq_remove_service(struct vchiq_instance *instance, unsigned int service); 588 599 589 - int vchiq_get_client_id(unsigned int service); 600 + int vchiq_get_client_id(struct vchiq_instance *instance, unsigned int service); 590 601 591 602 void vchiq_get_config(struct vchiq_config *config); 592 603 593 - int vchiq_set_service_option(unsigned int service, enum vchiq_service_option option, int value); 604 + int vchiq_set_service_option(struct vchiq_instance *instance, unsigned int service, 605 + enum vchiq_service_option option, int value); 594 606 595 607 #endif
+21 -19
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c
··· 108 108 } 109 109 110 110 static int 111 - vchiq_ioc_queue_message(unsigned int handle, struct vchiq_element *elements, 112 - unsigned long count) 111 + vchiq_ioc_queue_message(struct vchiq_instance *instance, unsigned int handle, 112 + struct vchiq_element *elements, unsigned long count) 113 113 { 114 114 struct vchiq_io_copy_callback_context context; 115 115 enum vchiq_status status = VCHIQ_SUCCESS; ··· 127 127 total_size += elements[i].size; 128 128 } 129 129 130 - status = vchiq_queue_message(handle, vchiq_ioc_copy_element_data, 130 + status = vchiq_queue_message(instance, handle, vchiq_ioc_copy_element_data, 131 131 &context, total_size); 132 132 133 133 if (status == VCHIQ_ERROR) ··· 191 191 if (args->is_open) { 192 192 status = vchiq_open_service_internal(service, instance->pid); 193 193 if (status != VCHIQ_SUCCESS) { 194 - vchiq_remove_service(service->handle); 194 + vchiq_remove_service(instance, service->handle); 195 195 return (status == VCHIQ_RETRY) ? 196 196 -EINTR : -EIO; 197 197 } ··· 266 266 /* Copy to user space if msgbuf is not NULL */ 267 267 if (!args->buf || (copy_to_user(args->buf, header->data, header->size) == 0)) { 268 268 ret = header->size; 269 - vchiq_release_message(service->handle, header); 269 + vchiq_release_message(instance, service->handle, header); 270 270 } else { 271 271 ret = -EFAULT; 272 272 } ··· 330 330 userdata = args->userdata; 331 331 } 332 332 333 - status = vchiq_bulk_transfer(args->handle, NULL, args->data, args->size, 333 + status = vchiq_bulk_transfer(instance, args->handle, NULL, args->data, args->size, 334 334 userdata, args->mode, dir); 335 335 336 336 if (!waiter) { ··· 529 529 } 530 530 531 531 /* Now it has been copied, the message can be released. */ 532 - vchiq_release_message(service->handle, header); 532 + vchiq_release_message(instance, service->handle, header); 533 533 534 534 /* The completion must point to the msgbuf. */ 535 535 user_completion.header = msgbuf; ··· 596 596 i = 0; 597 597 while ((service = next_service_by_instance(instance->state, 598 598 instance, &i))) { 599 - status = vchiq_remove_service(service->handle); 599 + status = vchiq_remove_service(instance, service->handle); 600 600 vchiq_service_put(service); 601 601 if (status != VCHIQ_SUCCESS) 602 602 break; ··· 649 649 break; 650 650 651 651 if (put_user(args.handle, &argp->handle)) { 652 - vchiq_remove_service(args.handle); 652 + vchiq_remove_service(instance, args.handle); 653 653 ret = -EFAULT; 654 654 } 655 655 } break; ··· 673 673 */ 674 674 if (!user_service->close_pending) { 675 675 status = (cmd == VCHIQ_IOC_CLOSE_SERVICE) ? 676 - vchiq_close_service(service->handle) : 677 - vchiq_remove_service(service->handle); 676 + vchiq_close_service(instance, service->handle) : 677 + vchiq_remove_service(instance, service->handle); 678 678 if (status != VCHIQ_SUCCESS) 679 679 break; 680 680 } ··· 731 731 732 732 if (copy_from_user(elements, args.elements, 733 733 args.count * sizeof(struct vchiq_element)) == 0) 734 - ret = vchiq_ioc_queue_message(args.handle, elements, 734 + ret = vchiq_ioc_queue_message(instance, args.handle, elements, 735 735 args.count); 736 736 else 737 737 ret = -EFAULT; ··· 788 788 case VCHIQ_IOC_GET_CLIENT_ID: { 789 789 unsigned int handle = (unsigned int)arg; 790 790 791 - ret = vchiq_get_client_id(handle); 791 + ret = vchiq_get_client_id(instance, handle); 792 792 } break; 793 793 794 794 case VCHIQ_IOC_GET_CONFIG: { ··· 827 827 break; 828 828 } 829 829 830 - ret = vchiq_set_service_option(args.handle, args.option, 830 + ret = vchiq_set_service_option(instance, args.handle, args.option, 831 831 args.value); 832 832 } break; 833 833 ··· 908 908 { 909 909 struct vchiq_create_service args; 910 910 struct vchiq_create_service32 args32; 911 + struct vchiq_instance *instance = file->private_data; 911 912 long ret; 912 913 913 914 if (copy_from_user(&args32, ptrargs32, sizeof(args32))) ··· 927 926 .handle = args32.handle, 928 927 }; 929 928 930 - ret = vchiq_ioc_create_service(file->private_data, &args); 929 + ret = vchiq_ioc_create_service(instance, &args); 931 930 if (ret < 0) 932 931 return ret; 933 932 934 933 if (put_user(args.handle, &ptrargs32->handle)) { 935 - vchiq_remove_service(args.handle); 934 + vchiq_remove_service(instance, args.handle); 936 935 return -EFAULT; 937 936 } 938 937 ··· 961 960 struct vchiq_queue_message args; 962 961 struct vchiq_queue_message32 args32; 963 962 struct vchiq_service *service; 963 + struct vchiq_instance *instance = file->private_data; 964 964 int ret; 965 965 966 966 if (copy_from_user(&args32, arg, sizeof(args32))) ··· 976 974 if (args32.count > MAX_ELEMENTS) 977 975 return -EINVAL; 978 976 979 - service = find_service_for_instance(file->private_data, args.handle); 977 + service = find_service_for_instance(instance, args.handle); 980 978 if (!service) 981 979 return -EINVAL; 982 980 ··· 996 994 compat_ptr(element32[count].data); 997 995 elements[count].size = element32[count].size; 998 996 } 999 - ret = vchiq_ioc_queue_message(args.handle, elements, 997 + ret = vchiq_ioc_queue_message(instance, args.handle, elements, 1000 998 args.count); 1001 999 } else { 1002 1000 ret = -EINVAL; ··· 1263 1261 spin_unlock(&msg_queue_spinlock); 1264 1262 1265 1263 if (header) 1266 - vchiq_release_message(service->handle, header); 1264 + vchiq_release_message(instance, service->handle, header); 1267 1265 spin_lock(&msg_queue_spinlock); 1268 1266 } 1269 1267
+32 -31
drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
··· 292 292 /* Dummy receive to ensure the buffers remain in order */ 293 293 len = 8; 294 294 /* queue the bulk submission */ 295 - vchiq_use_service(instance->service_handle); 296 - ret = vchiq_bulk_receive(instance->service_handle, 295 + vchiq_use_service(instance->vchiq_instance, instance->service_handle); 296 + ret = vchiq_bulk_receive(instance->vchiq_instance, instance->service_handle, 297 297 msg_context->u.bulk.buffer->buffer, 298 298 /* Actual receive needs to be a multiple 299 299 * of 4 bytes ··· 302 302 msg_context, 303 303 VCHIQ_BULK_MODE_CALLBACK); 304 304 305 - vchiq_release_service(instance->service_handle); 305 + vchiq_release_service(instance->vchiq_instance, instance->service_handle); 306 306 307 307 if (ret != 0) 308 308 pr_err("%s: ctx: %p, vchiq_bulk_receive failed %d\n", ··· 436 436 /* no payload in message */ 437 437 m.u.buffer_from_host.payload_in_message = 0; 438 438 439 - vchiq_use_service(instance->service_handle); 439 + vchiq_use_service(instance->vchiq_instance, instance->service_handle); 440 440 441 - ret = vchiq_queue_kernel_message(instance->service_handle, &m, 441 + ret = vchiq_queue_kernel_message(instance->vchiq_instance, instance->service_handle, &m, 442 442 sizeof(struct mmal_msg_header) + 443 443 sizeof(m.u.buffer_from_host)); 444 444 if (ret) 445 445 atomic_dec(&port->buffers_with_vpu); 446 446 447 - vchiq_release_service(instance->service_handle); 447 + vchiq_release_service(instance->vchiq_instance, instance->service_handle); 448 448 449 449 return ret; 450 450 } ··· 548 548 } 549 549 550 550 /* incoming event service callback */ 551 - static enum vchiq_status service_callback(enum vchiq_reason reason, 551 + static enum vchiq_status service_callback(struct vchiq_instance *vchiq_instance, 552 + enum vchiq_reason reason, 552 553 struct vchiq_header *header, 553 554 unsigned int handle, void *bulk_ctx) 554 555 { 555 - struct vchiq_mmal_instance *instance = vchiq_get_service_userdata(handle); 556 + struct vchiq_mmal_instance *instance = vchiq_get_service_userdata(vchiq_instance, handle); 556 557 u32 msg_len; 557 558 struct mmal_msg *msg; 558 559 struct mmal_msg_context *msg_context; ··· 573 572 /* handling is different for buffer messages */ 574 573 switch (msg->h.type) { 575 574 case MMAL_MSG_TYPE_BUFFER_FROM_HOST: 576 - vchiq_release_message(handle, header); 575 + vchiq_release_message(vchiq_instance, handle, header); 577 576 break; 578 577 579 578 case MMAL_MSG_TYPE_EVENT_TO_HOST: 580 579 event_to_host_cb(instance, msg, msg_len); 581 - vchiq_release_message(handle, header); 580 + vchiq_release_message(vchiq_instance, handle, header); 582 581 583 582 break; 584 583 585 584 case MMAL_MSG_TYPE_BUFFER_TO_HOST: 586 585 buffer_to_host_cb(instance, msg, msg_len); 587 - vchiq_release_message(handle, header); 586 + vchiq_release_message(vchiq_instance, handle, header); 588 587 break; 589 588 590 589 default: 591 590 /* messages dependent on header context to complete */ 592 591 if (!msg->h.context) { 593 592 pr_err("received message context was null!\n"); 594 - vchiq_release_message(handle, header); 593 + vchiq_release_message(vchiq_instance, handle, header); 595 594 break; 596 595 } 597 596 ··· 600 599 if (!msg_context) { 601 600 pr_err("received invalid message context %u!\n", 602 601 msg->h.context); 603 - vchiq_release_message(handle, header); 602 + vchiq_release_message(vchiq_instance, handle, header); 604 603 break; 605 604 } 606 605 ··· 679 678 DBG_DUMP_MSG(msg, (sizeof(struct mmal_msg_header) + payload_len), 680 679 ">>> sync message"); 681 680 682 - vchiq_use_service(instance->service_handle); 681 + vchiq_use_service(instance->vchiq_instance, instance->service_handle); 683 682 684 - ret = vchiq_queue_kernel_message(instance->service_handle, msg, 683 + ret = vchiq_queue_kernel_message(instance->vchiq_instance, instance->service_handle, msg, 685 684 sizeof(struct mmal_msg_header) + 686 685 payload_len); 687 686 688 - vchiq_release_service(instance->service_handle); 687 + vchiq_release_service(instance->vchiq_instance, instance->service_handle); 689 688 690 689 if (ret) { 691 690 pr_err("error %d queuing message\n", ret); ··· 825 824 port->component->handle, port->handle); 826 825 827 826 release_msg: 828 - vchiq_release_message(instance->service_handle, rmsg_handle); 827 + vchiq_release_message(instance->vchiq_instance, instance->service_handle, rmsg_handle); 829 828 830 829 return ret; 831 830 } ··· 920 919 pr_debug("%s:result:%d component:0x%x port:%d\n", 921 920 __func__, ret, port->component->handle, port->handle); 922 921 923 - vchiq_release_message(instance->service_handle, rmsg_handle); 922 + vchiq_release_message(instance->vchiq_instance, instance->service_handle, rmsg_handle); 924 923 925 924 return ret; 926 925 } ··· 968 967 component->inputs, component->outputs, component->clocks); 969 968 970 969 release_msg: 971 - vchiq_release_message(instance->service_handle, rmsg_handle); 970 + vchiq_release_message(instance->vchiq_instance, instance->service_handle, rmsg_handle); 972 971 973 972 return ret; 974 973 } ··· 1001 1000 1002 1001 release_msg: 1003 1002 1004 - vchiq_release_message(instance->service_handle, rmsg_handle); 1003 + vchiq_release_message(instance->vchiq_instance, instance->service_handle, rmsg_handle); 1005 1004 1006 1005 return ret; 1007 1006 } ··· 1033 1032 ret = -rmsg->u.component_enable_reply.status; 1034 1033 1035 1034 release_msg: 1036 - vchiq_release_message(instance->service_handle, rmsg_handle); 1035 + vchiq_release_message(instance->vchiq_instance, instance->service_handle, rmsg_handle); 1037 1036 1038 1037 return ret; 1039 1038 } ··· 1066 1065 1067 1066 release_msg: 1068 1067 1069 - vchiq_release_message(instance->service_handle, rmsg_handle); 1068 + vchiq_release_message(instance->vchiq_instance, instance->service_handle, rmsg_handle); 1070 1069 1071 1070 return ret; 1072 1071 } ··· 1098 1097 *minor_out = rmsg->u.version.minor; 1099 1098 1100 1099 release_msg: 1101 - vchiq_release_message(instance->service_handle, rmsg_handle); 1100 + vchiq_release_message(instance->vchiq_instance, instance->service_handle, rmsg_handle); 1102 1101 1103 1102 return ret; 1104 1103 } ··· 1140 1139 port_action_type_names[action_type], action_type); 1141 1140 1142 1141 release_msg: 1143 - vchiq_release_message(instance->service_handle, rmsg_handle); 1142 + vchiq_release_message(instance->vchiq_instance, instance->service_handle, rmsg_handle); 1144 1143 1145 1144 return ret; 1146 1145 } ··· 1188 1187 action_type, connect_component_handle, connect_port_handle); 1189 1188 1190 1189 release_msg: 1191 - vchiq_release_message(instance->service_handle, rmsg_handle); 1190 + vchiq_release_message(instance->vchiq_instance, instance->service_handle, rmsg_handle); 1192 1191 1193 1192 return ret; 1194 1193 } ··· 1229 1228 ret, port->component->handle, port->handle, parameter_id); 1230 1229 1231 1230 release_msg: 1232 - vchiq_release_message(instance->service_handle, rmsg_handle); 1231 + vchiq_release_message(instance->vchiq_instance, instance->service_handle, rmsg_handle); 1233 1232 1234 1233 return ret; 1235 1234 } ··· 1288 1287 ret, port->component->handle, port->handle, parameter_id); 1289 1288 1290 1289 release_msg: 1291 - vchiq_release_message(instance->service_handle, rmsg_handle); 1290 + vchiq_release_message(instance->vchiq_instance, instance->service_handle, rmsg_handle); 1292 1291 1293 1292 return ret; 1294 1293 } ··· 1833 1832 if (mutex_lock_interruptible(&instance->vchiq_mutex)) 1834 1833 return -EINTR; 1835 1834 1836 - vchiq_use_service(instance->service_handle); 1835 + vchiq_use_service(instance->vchiq_instance, instance->service_handle); 1837 1836 1838 - status = vchiq_close_service(instance->service_handle); 1837 + status = vchiq_close_service(instance->vchiq_instance, instance->service_handle); 1839 1838 if (status != 0) 1840 1839 pr_err("mmal-vchiq: VCHIQ close failed\n"); 1841 1840 ··· 1923 1922 goto err_close_services; 1924 1923 } 1925 1924 1926 - vchiq_release_service(instance->service_handle); 1925 + vchiq_release_service(instance->vchiq_instance, instance->service_handle); 1927 1926 1928 1927 *out_instance = instance; 1929 1928 1930 1929 return 0; 1931 1930 1932 1931 err_close_services: 1933 - vchiq_close_service(instance->service_handle); 1932 + vchiq_close_service(instance->vchiq_instance, instance->service_handle); 1934 1933 destroy_workqueue(instance->bulk_wq); 1935 1934 err_free: 1936 1935 kfree(instance);
+27
drivers/staging/vme_user/Kconfig
··· 1 1 # SPDX-License-Identifier: GPL-2.0 2 + menuconfig VME_BUS 3 + bool "VME bridge support" 4 + depends on STAGING && PCI 5 + help 6 + If you say Y here you get support for the VME bridge Framework. 7 + 8 + if VME_BUS 9 + 10 + comment "VME Bridge Drivers" 11 + 12 + config VME_TSI148 13 + tristate "Tempe" 14 + depends on HAS_DMA 15 + help 16 + If you say Y here you get support for the Tundra TSI148 VME bridge 17 + chip. 18 + 19 + config VME_FAKE 20 + tristate "Fake" 21 + help 22 + If you say Y here you get support for the fake VME bridge. This 23 + provides a virtualised VME Bus for devices with no VME bridge. This 24 + is mainly useful for VME development (in the absence of VME 25 + hardware). 26 + 2 27 comment "VME Device Drivers" 3 28 4 29 config VME_USER ··· 36 11 37 12 To compile this driver as a module, choose M here. The module will 38 13 be called vme_user. If unsure, say N. 14 + 15 + endif
+3
drivers/staging/vme_user/Makefile
··· 3 3 # Makefile for the VME device drivers. 4 4 # 5 5 6 + obj-$(CONFIG_VME_BUS) += vme.o 6 7 obj-$(CONFIG_VME_USER) += vme_user.o 8 + obj-$(CONFIG_VME_TSI148) += vme_tsi148.o 9 + obj-$(CONFIG_VME_FAKE) += vme_fake.o
+1 -1
drivers/staging/vme_user/vme_user.c
··· 33 33 34 34 #include <linux/io.h> 35 35 #include <linux/uaccess.h> 36 - #include <linux/vme.h> 37 36 37 + #include "vme.h" 38 38 #include "vme_user.h" 39 39 40 40 static const char driver_name[] = "vme_user";
+5 -5
drivers/staging/vt6655/baseband.c
··· 1912 1912 iowrite8(by_bb_addr, iobase + MAC_REG_BBREGADR); 1913 1913 1914 1914 /* turn on REGR */ 1915 - MACvRegBitsOn(iobase, MAC_REG_BBREGCTL, BBREGCTL_REGR); 1915 + vt6655_mac_reg_bits_on(iobase, MAC_REG_BBREGCTL, BBREGCTL_REGR); 1916 1916 /* W_MAX_TIMEOUT is the timeout period */ 1917 1917 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) { 1918 1918 by_value = ioread8(iobase + MAC_REG_BBREGCTL); ··· 1957 1957 iowrite8(by_data, iobase + MAC_REG_BBREGDATA); 1958 1958 1959 1959 /* turn on BBREGCTL_REGW */ 1960 - MACvRegBitsOn(iobase, MAC_REG_BBREGCTL, BBREGCTL_REGW); 1960 + vt6655_mac_reg_bits_on(iobase, MAC_REG_BBREGCTL, BBREGCTL_REGW); 1961 1961 /* W_MAX_TIMEOUT is the timeout period */ 1962 1962 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) { 1963 1963 by_value = ioread8(iobase + MAC_REG_BBREGCTL); ··· 2013 2013 byVT3253B0_AGC4_RFMD2959[ii][0], 2014 2014 byVT3253B0_AGC4_RFMD2959[ii][1]); 2015 2015 2016 - VNSvOutPortD(iobase + MAC_REG_ITRTMSET, 0x23); 2017 - MACvRegBitsOn(iobase, MAC_REG_PAPEDELAY, BIT(0)); 2016 + iowrite32(0x23, iobase + MAC_REG_ITRTMSET); 2017 + vt6655_mac_reg_bits_on(iobase, MAC_REG_PAPEDELAY, BIT(0)); 2018 2018 } 2019 2019 priv->abyBBVGA[0] = 0x18; 2020 2020 priv->abyBBVGA[1] = 0x0A; ··· 2054 2054 byVT3253B0_AGC[ii][1]); 2055 2055 2056 2056 iowrite8(0x23, iobase + MAC_REG_ITRTMSET); 2057 - MACvRegBitsOn(iobase, MAC_REG_PAPEDELAY, BIT(0)); 2057 + vt6655_mac_reg_bits_on(iobase, MAC_REG_PAPEDELAY, BIT(0)); 2058 2058 2059 2059 priv->abyBBVGA[0] = 0x14; 2060 2060 priv->abyBBVGA[1] = 0x0A;
+46 -57
drivers/staging/vt6655/card.c
··· 293 293 qwTSFOffset = CARDqGetTSFOffset(byRxRate, qwBSSTimestamp, 294 294 local_tsf); 295 295 /* adjust TSF, HW's TSF add TSF Offset reg */ 296 - VNSvOutPortD(priv->port_offset + MAC_REG_TSFOFST, 297 - (u32)qwTSFOffset); 298 - VNSvOutPortD(priv->port_offset + MAC_REG_TSFOFST + 4, 299 - (u32)(qwTSFOffset >> 32)); 300 - MACvRegBitsOn(priv->port_offset, MAC_REG_TFTCTL, 301 - TFTCTL_TSFSYNCEN); 296 + qwTSFOffset = le64_to_cpu(qwTSFOffset); 297 + iowrite32((u32)qwTSFOffset, priv->port_offset + MAC_REG_TSFOFST); 298 + iowrite32((u32)(qwTSFOffset >> 32), priv->port_offset + MAC_REG_TSFOFST + 4); 299 + vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_TFTCTL, TFTCTL_TSFSYNCEN); 302 300 } 303 301 return true; 304 302 } ··· 324 326 qwNextTBTT = CARDqGetNextTBTT(qwNextTBTT, wBeaconInterval); 325 327 326 328 /* set HW beacon interval */ 327 - VNSvOutPortW(priv->port_offset + MAC_REG_BI, wBeaconInterval); 329 + iowrite16(wBeaconInterval, priv->port_offset + MAC_REG_BI); 328 330 priv->wBeaconInterval = wBeaconInterval; 329 331 /* Set NextTBTT */ 330 - VNSvOutPortD(priv->port_offset + MAC_REG_NEXTTBTT, (u32)qwNextTBTT); 331 - VNSvOutPortD(priv->port_offset + MAC_REG_NEXTTBTT + 4, 332 - (u32)(qwNextTBTT >> 32)); 333 - MACvRegBitsOn(priv->port_offset, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN); 332 + qwNextTBTT = le64_to_cpu(qwNextTBTT); 333 + iowrite32((u32)qwNextTBTT, priv->port_offset + MAC_REG_NEXTTBTT); 334 + iowrite32((u32)(qwNextTBTT >> 32), priv->port_offset + MAC_REG_NEXTTBTT + 4); 335 + vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN); 334 336 335 337 return true; 336 338 } ··· 352 354 353 355 switch (priv->byRFType) { 354 356 case RF_RFMD2959: 355 - MACvWordRegBitsOff(priv->port_offset, MAC_REG_SOFTPWRCTL, 356 - SOFTPWRCTL_TXPEINV); 357 - MACvWordRegBitsOn(priv->port_offset, MAC_REG_SOFTPWRCTL, 358 - SOFTPWRCTL_SWPE1); 357 + vt6655_mac_word_reg_bits_off(priv->port_offset, MAC_REG_SOFTPWRCTL, 358 + SOFTPWRCTL_TXPEINV); 359 + vt6655_mac_word_reg_bits_on(priv->port_offset, MAC_REG_SOFTPWRCTL, 360 + SOFTPWRCTL_SWPE1); 359 361 break; 360 362 361 363 case RF_AIROHA: 362 364 case RF_AL2230S: 363 - MACvWordRegBitsOff(priv->port_offset, MAC_REG_SOFTPWRCTL, 364 - SOFTPWRCTL_SWPE2); 365 - MACvWordRegBitsOff(priv->port_offset, MAC_REG_SOFTPWRCTL, 366 - SOFTPWRCTL_SWPE3); 365 + vt6655_mac_word_reg_bits_off(priv->port_offset, MAC_REG_SOFTPWRCTL, 366 + SOFTPWRCTL_SWPE2); 367 + vt6655_mac_word_reg_bits_off(priv->port_offset, MAC_REG_SOFTPWRCTL, 368 + SOFTPWRCTL_SWPE3); 367 369 break; 368 370 } 369 371 370 - MACvRegBitsOff(priv->port_offset, MAC_REG_HOSTCR, HOSTCR_RXON); 372 + vt6655_mac_reg_bits_off(priv->port_offset, MAC_REG_HOSTCR, HOSTCR_RXON); 371 373 372 374 bb_set_deep_sleep(priv, priv->local_id); 373 375 374 376 priv->radio_off = true; 375 377 pr_debug("chester power off\n"); 376 - MACvRegBitsOn(priv->port_offset, MAC_REG_GPIOCTL0, 377 - LED_ACTSET); /* LED issue */ 378 + vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_GPIOCTL0, LED_ACTSET); /* LED issue */ 378 379 } 379 380 380 381 void CARDvSafeResetTx(struct vnt_private *priv) ··· 408 411 MACvSetCurrTXDescAddr(TYPE_AC0DMA, priv, priv->td1_pool_dma); 409 412 410 413 /* set MAC Beacon TX pointer */ 411 - MACvSetCurrBCNTxDescAddr(priv->port_offset, 412 - (priv->tx_beacon_dma)); 414 + iowrite32((u32)priv->tx_beacon_dma, priv->port_offset + MAC_REG_BCNDMAPTR); 413 415 } 414 416 415 417 /* ··· 449 453 } 450 454 451 455 /* set perPkt mode */ 452 - MACvRx0PerPktMode(priv->port_offset); 453 - MACvRx1PerPktMode(priv->port_offset); 456 + iowrite32(RX_PERPKT, priv->port_offset + MAC_REG_RXDMACTL0); 457 + iowrite32(RX_PERPKT, priv->port_offset + MAC_REG_RXDMACTL1); 454 458 /* set MAC RD pointer */ 455 459 MACvSetCurrRx0DescAddr(priv, priv->rd0_pool_dma); 456 460 ··· 549 553 /* swap over to get correct write order */ 550 554 swap(phy.swap[0], phy.swap[1]); 551 555 552 - VNSvOutPortD(priv->port_offset + MAC_REG_RSPINF_B_1, phy.field_write); 556 + iowrite32(phy.field_write, priv->port_offset + MAC_REG_RSPINF_B_1); 553 557 554 558 /* RSPINF_b_2 */ 555 559 vnt_get_phy_field(priv, 14, ··· 558 562 559 563 swap(phy.swap[0], phy.swap[1]); 560 564 561 - VNSvOutPortD(priv->port_offset + MAC_REG_RSPINF_B_2, phy.field_write); 565 + iowrite32(phy.field_write, priv->port_offset + MAC_REG_RSPINF_B_2); 562 566 563 567 /* RSPINF_b_5 */ 564 568 vnt_get_phy_field(priv, 14, ··· 567 571 568 572 swap(phy.swap[0], phy.swap[1]); 569 573 570 - VNSvOutPortD(priv->port_offset + MAC_REG_RSPINF_B_5, phy.field_write); 574 + iowrite32(phy.field_write, priv->port_offset + MAC_REG_RSPINF_B_5); 571 575 572 576 /* RSPINF_b_11 */ 573 577 vnt_get_phy_field(priv, 14, ··· 576 580 577 581 swap(phy.swap[0], phy.swap[1]); 578 582 579 - VNSvOutPortD(priv->port_offset + MAC_REG_RSPINF_B_11, phy.field_write); 583 + iowrite32(phy.field_write, priv->port_offset + MAC_REG_RSPINF_B_11); 580 584 581 585 /* RSPINF_a_6 */ 582 586 s_vCalculateOFDMRParameter(RATE_6M, 583 587 bb_type, 584 588 &byTxRate, 585 589 &byRsvTime); 586 - VNSvOutPortW(priv->port_offset + MAC_REG_RSPINF_A_6, 587 - MAKEWORD(byTxRate, byRsvTime)); 590 + iowrite16(MAKEWORD(byTxRate, byRsvTime), priv->port_offset + MAC_REG_RSPINF_A_6); 588 591 /* RSPINF_a_9 */ 589 592 s_vCalculateOFDMRParameter(RATE_9M, 590 593 bb_type, 591 594 &byTxRate, 592 595 &byRsvTime); 593 - VNSvOutPortW(priv->port_offset + MAC_REG_RSPINF_A_9, 594 - MAKEWORD(byTxRate, byRsvTime)); 596 + iowrite16(MAKEWORD(byTxRate, byRsvTime), priv->port_offset + MAC_REG_RSPINF_A_9); 595 597 /* RSPINF_a_12 */ 596 598 s_vCalculateOFDMRParameter(RATE_12M, 597 599 bb_type, 598 600 &byTxRate, 599 601 &byRsvTime); 600 - VNSvOutPortW(priv->port_offset + MAC_REG_RSPINF_A_12, 601 - MAKEWORD(byTxRate, byRsvTime)); 602 + iowrite16(MAKEWORD(byTxRate, byRsvTime), priv->port_offset + MAC_REG_RSPINF_A_12); 602 603 /* RSPINF_a_18 */ 603 604 s_vCalculateOFDMRParameter(RATE_18M, 604 605 bb_type, 605 606 &byTxRate, 606 607 &byRsvTime); 607 - VNSvOutPortW(priv->port_offset + MAC_REG_RSPINF_A_18, 608 - MAKEWORD(byTxRate, byRsvTime)); 608 + iowrite16(MAKEWORD(byTxRate, byRsvTime), priv->port_offset + MAC_REG_RSPINF_A_18); 609 609 /* RSPINF_a_24 */ 610 610 s_vCalculateOFDMRParameter(RATE_24M, 611 611 bb_type, 612 612 &byTxRate, 613 613 &byRsvTime); 614 - VNSvOutPortW(priv->port_offset + MAC_REG_RSPINF_A_24, 615 - MAKEWORD(byTxRate, byRsvTime)); 614 + iowrite16(MAKEWORD(byTxRate, byRsvTime), priv->port_offset + MAC_REG_RSPINF_A_24); 616 615 /* RSPINF_a_36 */ 617 616 s_vCalculateOFDMRParameter(CARDwGetOFDMControlRate((void *)priv, 618 617 RATE_36M), 619 618 bb_type, 620 619 &byTxRate, 621 620 &byRsvTime); 622 - VNSvOutPortW(priv->port_offset + MAC_REG_RSPINF_A_36, 623 - MAKEWORD(byTxRate, byRsvTime)); 621 + iowrite16(MAKEWORD(byTxRate, byRsvTime), priv->port_offset + MAC_REG_RSPINF_A_36); 624 622 /* RSPINF_a_48 */ 625 623 s_vCalculateOFDMRParameter(CARDwGetOFDMControlRate((void *)priv, 626 624 RATE_48M), 627 625 bb_type, 628 626 &byTxRate, 629 627 &byRsvTime); 630 - VNSvOutPortW(priv->port_offset + MAC_REG_RSPINF_A_48, 631 - MAKEWORD(byTxRate, byRsvTime)); 628 + iowrite16(MAKEWORD(byTxRate, byRsvTime), priv->port_offset + MAC_REG_RSPINF_A_48); 632 629 /* RSPINF_a_54 */ 633 630 s_vCalculateOFDMRParameter(CARDwGetOFDMControlRate((void *)priv, 634 631 RATE_54M), 635 632 bb_type, 636 633 &byTxRate, 637 634 &byRsvTime); 638 - VNSvOutPortW(priv->port_offset + MAC_REG_RSPINF_A_54, 639 - MAKEWORD(byTxRate, byRsvTime)); 635 + iowrite16(MAKEWORD(byTxRate, byRsvTime), priv->port_offset + MAC_REG_RSPINF_A_54); 640 636 /* RSPINF_a_72 */ 641 637 s_vCalculateOFDMRParameter(CARDwGetOFDMControlRate((void *)priv, 642 638 RATE_54M), 643 639 bb_type, 644 640 &byTxRate, 645 641 &byRsvTime); 646 - VNSvOutPortW(priv->port_offset + MAC_REG_RSPINF_A_72, 647 - MAKEWORD(byTxRate, byRsvTime)); 642 + iowrite16(MAKEWORD(byTxRate, byRsvTime), priv->port_offset + MAC_REG_RSPINF_A_72); 648 643 /* Set to Page0 */ 649 644 MACvSelectPage0(priv->port_offset); 650 645 ··· 721 734 * In: 722 735 * priv - The adapter to be read 723 736 * Out: 724 - * qwCurrTSF - Current TSF counter 737 + * none 725 738 * 726 - * Return Value: true if success; otherwise false 739 + * Return Value: Current TSF counter 727 740 */ 728 741 u64 vt6655_get_current_tsf(struct vnt_private *priv) 729 742 { ··· 732 745 unsigned char data; 733 746 u32 low, high; 734 747 735 - MACvRegBitsOn(iobase, MAC_REG_TFTCTL, TFTCTL_TSFCNTRRD); 748 + vt6655_mac_reg_bits_on(iobase, MAC_REG_TFTCTL, TFTCTL_TSFCNTRRD); 736 749 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) { 737 750 data = ioread8(iobase + MAC_REG_TFTCTL); 738 751 if (!(data & TFTCTL_TSFCNTRRD)) ··· 795 808 796 809 qwNextTBTT = CARDqGetNextTBTT(qwNextTBTT, wBeaconInterval); 797 810 /* Set NextTBTT */ 798 - VNSvOutPortD(iobase + MAC_REG_NEXTTBTT, (u32)qwNextTBTT); 799 - VNSvOutPortD(iobase + MAC_REG_NEXTTBTT + 4, (u32)(qwNextTBTT >> 32)); 800 - MACvRegBitsOn(iobase, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN); 811 + qwNextTBTT = le64_to_cpu(qwNextTBTT); 812 + iowrite32((u32)qwNextTBTT, iobase + MAC_REG_NEXTTBTT); 813 + iowrite32((u32)(qwNextTBTT >> 32), iobase + MAC_REG_NEXTTBTT + 4); 814 + vt6655_mac_reg_bits_on(iobase, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN); 801 815 } 802 816 803 817 /* ··· 822 834 823 835 qwTSF = CARDqGetNextTBTT(qwTSF, wBeaconInterval); 824 836 /* Set NextTBTT */ 825 - VNSvOutPortD(iobase + MAC_REG_NEXTTBTT, (u32)qwTSF); 826 - VNSvOutPortD(iobase + MAC_REG_NEXTTBTT + 4, (u32)(qwTSF >> 32)); 827 - MACvRegBitsOn(iobase, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN); 837 + qwTSF = le64_to_cpu(qwTSF); 838 + iowrite32((u32)qwTSF, iobase + MAC_REG_NEXTTBTT); 839 + iowrite32((u32)(qwTSF >> 32), iobase + MAC_REG_NEXTTBTT + 4); 840 + vt6655_mac_reg_bits_on(iobase, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN); 828 841 pr_debug("Card:Update Next TBTT[%8llx]\n", qwTSF); 829 842 }
+1 -1
drivers/staging/vt6655/channel.c
··· 94 94 } 95 95 96 96 /* clear NAV */ 97 - MACvRegBitsOn(priv->port_offset, MAC_REG_MACCR, MACCR_CLRNAV); 97 + vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_MACCR, MACCR_CLRNAV); 98 98 99 99 /* TX_PE will reserve 3 us for MAX2829 A mode only, 100 100 * it is for better TX throughput
+51 -37
drivers/staging/vt6655/device_main.c
··· 122 122 static void device_free_info(struct vnt_private *priv); 123 123 static void device_print_info(struct vnt_private *priv); 124 124 125 + static void vt6655_mac_write_bssid_addr(void __iomem *iobase, const u8 *mac_addr); 126 + static void vt6655_mac_read_ether_addr(void __iomem *iobase, u8 *mac_addr); 127 + 125 128 static int device_init_rd0_ring(struct vnt_private *priv); 126 129 static int device_init_rd1_ring(struct vnt_private *priv); 127 130 static int device_init_td0_ring(struct vnt_private *priv); ··· 187 184 pr_debug(" preamble_type= %d\n", (int)priv->preamble_type); 188 185 pr_debug(" byShortPreamble= %d\n", (int)priv->byShortPreamble); 189 186 pr_debug(" byBBType= %d\n", (int)priv->byBBType); 187 + } 188 + 189 + static void vt6655_mac_write_bssid_addr(void __iomem *iobase, const u8 *mac_addr) 190 + { 191 + iowrite8(1, iobase + MAC_REG_PAGE1SEL); 192 + for (int i = 0; i < 6; i++) 193 + iowrite8(mac_addr[i], iobase + MAC_REG_BSSID0 + i); 194 + iowrite8(0, iobase + MAC_REG_PAGE1SEL); 195 + } 196 + 197 + static void vt6655_mac_read_ether_addr(void __iomem *iobase, u8 *mac_addr) 198 + { 199 + iowrite8(1, iobase + MAC_REG_PAGE1SEL); 200 + for (int i = 0; i < 6; i++) 201 + mac_addr[i] = ioread8(iobase + MAC_REG_PAR0 + i); 202 + iowrite8(0, iobase + MAC_REG_PAGE1SEL); 190 203 } 191 204 192 205 /* ··· 359 340 } 360 341 361 342 /* use relative tx timeout and 802.11i D4 */ 362 - MACvWordRegBitsOn(priv->port_offset, 363 - MAC_REG_CFG, (CFG_TKIPOPT | CFG_NOTXTIMEOUT)); 343 + vt6655_mac_word_reg_bits_on(priv->port_offset, MAC_REG_CFG, 344 + (CFG_TKIPOPT | CFG_NOTXTIMEOUT)); 364 345 365 346 /* set performance parameter by registry */ 366 347 MACvSetShortRetryLimit(priv, priv->byShortRetryLimit); ··· 417 398 CARDvSafeResetTx(priv); 418 399 419 400 if (priv->local_id <= REV_ID_VT3253_A1) 420 - MACvRegBitsOn(priv->port_offset, MAC_REG_RCR, RCR_WPAERR); 401 + vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_RCR, RCR_WPAERR); 421 402 422 403 /* Turn On Rx DMA */ 423 404 MACvReceive0(priv->port_offset); ··· 1074 1055 * update ISR counter 1075 1056 */ 1076 1057 while (isr && priv->vif) { 1077 - MACvWriteISR(priv->port_offset, isr); 1058 + iowrite32(isr, priv->port_offset + MAC_REG_ISR); 1078 1059 1079 1060 if (isr & ISR_FETALERR) { 1080 1061 pr_debug(" ISR_FETALERR\n"); 1081 1062 iowrite8(0, priv->port_offset + MAC_REG_SOFTPWRCTL); 1082 - VNSvOutPortW(priv->port_offset + 1083 - MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPECTI); 1063 + iowrite16(SOFTPWRCTL_SWPECTI, priv->port_offset + MAC_REG_SOFTPWRCTL); 1084 1064 device_error(priv, isr); 1085 1065 } 1086 1066 ··· 1153 1135 if (priv->vif) 1154 1136 vnt_interrupt_process(priv); 1155 1137 1156 - MACvIntEnable(priv->port_offset, IMR_MASK_VALUE); 1138 + iowrite32(IMR_MASK_VALUE, priv->port_offset + MAC_REG_IMR); 1157 1139 } 1158 1140 1159 1141 static irqreturn_t vnt_interrupt(int irq, void *arg) ··· 1162 1144 1163 1145 schedule_work(&priv->interrupt_work); 1164 1146 1165 - MACvIntDisable(priv->port_offset); 1147 + iowrite32(0, priv->port_offset + MAC_REG_IMR); 1166 1148 1167 1149 return IRQ_HANDLED; 1168 1150 } ··· 1271 1253 1272 1254 device_init_registers(priv); 1273 1255 1274 - dev_dbg(&priv->pcid->dev, "call MACvIntEnable\n"); 1275 - MACvIntEnable(priv->port_offset, IMR_MASK_VALUE); 1256 + dev_dbg(&priv->pcid->dev, "enable MAC interrupt\n"); 1257 + iowrite32(IMR_MASK_VALUE, priv->port_offset + MAC_REG_IMR); 1276 1258 1277 1259 ieee80211_wake_queues(hw); 1278 1260 ··· 1322 1304 case NL80211_IFTYPE_STATION: 1323 1305 break; 1324 1306 case NL80211_IFTYPE_ADHOC: 1325 - MACvRegBitsOff(priv->port_offset, MAC_REG_RCR, RCR_UNICAST); 1307 + vt6655_mac_reg_bits_off(priv->port_offset, MAC_REG_RCR, RCR_UNICAST); 1326 1308 1327 - MACvRegBitsOn(priv->port_offset, MAC_REG_HOSTCR, HOSTCR_ADHOC); 1309 + vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_HOSTCR, HOSTCR_ADHOC); 1328 1310 1329 1311 break; 1330 1312 case NL80211_IFTYPE_AP: 1331 - MACvRegBitsOff(priv->port_offset, MAC_REG_RCR, RCR_UNICAST); 1313 + vt6655_mac_reg_bits_off(priv->port_offset, MAC_REG_RCR, RCR_UNICAST); 1332 1314 1333 - MACvRegBitsOn(priv->port_offset, MAC_REG_HOSTCR, HOSTCR_AP); 1315 + vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_HOSTCR, HOSTCR_AP); 1334 1316 1335 1317 break; 1336 1318 default: ··· 1351 1333 case NL80211_IFTYPE_STATION: 1352 1334 break; 1353 1335 case NL80211_IFTYPE_ADHOC: 1354 - MACvRegBitsOff(priv->port_offset, MAC_REG_TCR, TCR_AUTOBCNTX); 1355 - MACvRegBitsOff(priv->port_offset, 1356 - MAC_REG_TFTCTL, TFTCTL_TSFCNTREN); 1357 - MACvRegBitsOff(priv->port_offset, MAC_REG_HOSTCR, HOSTCR_ADHOC); 1336 + vt6655_mac_reg_bits_off(priv->port_offset, MAC_REG_TCR, TCR_AUTOBCNTX); 1337 + vt6655_mac_reg_bits_off(priv->port_offset, 1338 + MAC_REG_TFTCTL, TFTCTL_TSFCNTREN); 1339 + vt6655_mac_reg_bits_off(priv->port_offset, MAC_REG_HOSTCR, HOSTCR_ADHOC); 1358 1340 break; 1359 1341 case NL80211_IFTYPE_AP: 1360 - MACvRegBitsOff(priv->port_offset, MAC_REG_TCR, TCR_AUTOBCNTX); 1361 - MACvRegBitsOff(priv->port_offset, 1362 - MAC_REG_TFTCTL, TFTCTL_TSFCNTREN); 1363 - MACvRegBitsOff(priv->port_offset, MAC_REG_HOSTCR, HOSTCR_AP); 1342 + vt6655_mac_reg_bits_off(priv->port_offset, MAC_REG_TCR, TCR_AUTOBCNTX); 1343 + vt6655_mac_reg_bits_off(priv->port_offset, 1344 + MAC_REG_TFTCTL, TFTCTL_TSFCNTREN); 1345 + vt6655_mac_reg_bits_off(priv->port_offset, MAC_REG_HOSTCR, HOSTCR_AP); 1364 1346 break; 1365 1347 default: 1366 1348 break; ··· 1424 1406 1425 1407 spin_lock_irqsave(&priv->lock, flags); 1426 1408 1427 - MACvWriteBSSIDAddress(priv->port_offset, conf->bssid); 1409 + vt6655_mac_write_bssid_addr(priv->port_offset, conf->bssid); 1428 1410 1429 1411 spin_unlock_irqrestore(&priv->lock, flags); 1430 1412 } ··· 1476 1458 if (conf->enable_beacon) { 1477 1459 vnt_beacon_enable(priv, vif, conf); 1478 1460 1479 - MACvRegBitsOn(priv->port_offset, MAC_REG_TCR, 1480 - TCR_AUTOBCNTX); 1461 + vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_TCR, TCR_AUTOBCNTX); 1481 1462 } else { 1482 - MACvRegBitsOff(priv->port_offset, MAC_REG_TCR, 1483 - TCR_AUTOBCNTX); 1463 + vt6655_mac_reg_bits_off(priv->port_offset, MAC_REG_TCR, 1464 + TCR_AUTOBCNTX); 1484 1465 } 1485 1466 } 1486 1467 ··· 1540 1523 if (priv->mc_list_count > 2) { 1541 1524 MACvSelectPage1(priv->port_offset); 1542 1525 1543 - VNSvOutPortD(priv->port_offset + 1544 - MAC_REG_MAR0, 0xffffffff); 1545 - VNSvOutPortD(priv->port_offset + 1546 - MAC_REG_MAR0 + 4, 0xffffffff); 1526 + iowrite32(0xffffffff, priv->port_offset + MAC_REG_MAR0); 1527 + iowrite32(0xffffffff, priv->port_offset + MAC_REG_MAR0 + 4); 1547 1528 1548 1529 MACvSelectPage0(priv->port_offset); 1549 1530 } else { 1550 1531 MACvSelectPage1(priv->port_offset); 1551 1532 1552 - VNSvOutPortD(priv->port_offset + 1553 - MAC_REG_MAR0, (u32)multicast); 1554 - VNSvOutPortD(priv->port_offset + 1555 - MAC_REG_MAR0 + 4, 1556 - (u32)(multicast >> 32)); 1533 + multicast = le64_to_cpu(multicast); 1534 + iowrite32((u32)multicast, priv->port_offset + MAC_REG_MAR0); 1535 + iowrite32((u32)(multicast >> 32), 1536 + priv->port_offset + MAC_REG_MAR0 + 4); 1557 1537 1558 1538 MACvSelectPage0(priv->port_offset); 1559 1539 } ··· 1740 1726 } 1741 1727 /* initial to reload eeprom */ 1742 1728 MACvInitialize(priv); 1743 - MACvReadEtherAddress(priv->port_offset, priv->abyCurrentNetAddr); 1729 + vt6655_mac_read_ether_addr(priv->port_offset, priv->abyCurrentNetAddr); 1744 1730 1745 1731 /* Get RFType */ 1746 1732 priv->byRFType = SROMbyReadEmbedded(priv->port_offset, EEP_OFS_RFTYPE);
+48 -7
drivers/staging/vt6655/mac.c
··· 38 38 39 39 #include "mac.h" 40 40 41 + void vt6655_mac_reg_bits_on(void __iomem *iobase, const u8 reg_offset, const u8 bit_mask) 42 + { 43 + unsigned char reg_value; 44 + 45 + reg_value = ioread8(iobase + reg_offset); 46 + iowrite8(reg_value | bit_mask, iobase + reg_offset); 47 + } 48 + 49 + void vt6655_mac_word_reg_bits_on(void __iomem *iobase, const u8 reg_offset, const u16 bit_mask) 50 + { 51 + unsigned short reg_value; 52 + 53 + reg_value = ioread16(iobase + reg_offset); 54 + iowrite16(reg_value | (bit_mask), iobase + reg_offset); 55 + } 56 + 57 + void vt6655_mac_reg_bits_off(void __iomem *iobase, const u8 reg_offset, const u8 bit_mask) 58 + { 59 + unsigned char reg_value; 60 + 61 + reg_value = ioread8(iobase + reg_offset); 62 + iowrite8(reg_value & ~(bit_mask), iobase + reg_offset); 63 + } 64 + 65 + void vt6655_mac_word_reg_bits_off(void __iomem *iobase, const u8 reg_offset, const u16 bit_mask) 66 + { 67 + unsigned short reg_value; 68 + 69 + reg_value = ioread16(iobase + reg_offset); 70 + iowrite16(reg_value & ~(bit_mask), iobase + reg_offset); 71 + } 72 + 73 + static void vt6655_mac_clear_stck_ds(void __iomem *iobase) 74 + { 75 + u8 reg_value; 76 + 77 + reg_value = ioread8(iobase + MAC_REG_STICKHW); 78 + reg_value = reg_value & 0xFC; 79 + iowrite8(reg_value, iobase + MAC_REG_STICKHW); 80 + } 81 + 41 82 /* 42 83 * Description: 43 84 * Test if all test bits off ··· 378 337 } 379 338 380 339 /* try to safe shutdown RX */ 381 - MACvRegBitsOff(io_base, MAC_REG_HOSTCR, HOSTCR_RXON); 340 + vt6655_mac_reg_bits_off(io_base, MAC_REG_HOSTCR, HOSTCR_RXON); 382 341 /* W_MAX_TIMEOUT is the timeout period */ 383 342 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) { 384 343 if (!(ioread8(io_base + MAC_REG_HOSTCR) & HOSTCR_RXONST)) ··· 433 392 } 434 393 435 394 /* try to safe shutdown TX */ 436 - MACvRegBitsOff(io_base, MAC_REG_HOSTCR, HOSTCR_TXON); 395 + vt6655_mac_reg_bits_off(io_base, MAC_REG_HOSTCR, HOSTCR_TXON); 437 396 438 397 /* W_MAX_TIMEOUT is the timeout period */ 439 398 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) { ··· 464 423 { 465 424 void __iomem *io_base = priv->port_offset; 466 425 467 - MACvRegBitsOff(io_base, MAC_REG_TCR, TCR_AUTOBCNTX); 426 + vt6655_mac_reg_bits_off(io_base, MAC_REG_TCR, TCR_AUTOBCNTX); 468 427 469 428 if (!MACbSafeRxOff(priv)) { 470 429 pr_debug(" MACbSafeRxOff == false)\n"); ··· 477 436 return false; 478 437 } 479 438 480 - MACvRegBitsOff(io_base, MAC_REG_HOSTCR, HOSTCR_MACEN); 439 + vt6655_mac_reg_bits_off(io_base, MAC_REG_HOSTCR, HOSTCR_MACEN); 481 440 482 441 return true; 483 442 } ··· 499 458 { 500 459 void __iomem *io_base = priv->port_offset; 501 460 /* disable MAC IMR */ 502 - MACvIntDisable(io_base); 461 + iowrite32(0, io_base + MAC_REG_IMR); 503 462 MACvSetLoopbackMode(priv, MAC_LB_INTERNAL); 504 463 /* stop the adapter */ 505 464 if (!MACbSafeStop(priv)) { ··· 527 486 { 528 487 void __iomem *io_base = priv->port_offset; 529 488 /* clear sticky bits */ 530 - MACvClearStckDS(io_base); 489 + vt6655_mac_clear_stck_ds(io_base); 531 490 /* disable force PME-enable */ 532 491 iowrite8(PME_OVR, io_base + MAC_REG_PMC1); 533 492 /* only 3253 A */ ··· 771 730 return true; 772 731 773 732 /* Disable PS */ 774 - MACvRegBitsOff(io_base, MAC_REG_PSCTL, PSCTL_PSEN); 733 + vt6655_mac_reg_bits_off(io_base, MAC_REG_PSCTL, PSCTL_PSEN); 775 734 776 735 /* Check if SyncFlushOK */ 777 736 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
+20 -100
drivers/staging/vt6655/mac.h
··· 18 18 #ifndef __MAC_H__ 19 19 #define __MAC_H__ 20 20 21 - #include "upc.h" 21 + #include "device.h" 22 22 23 23 /*--------------------- Export Definitions -------------------------*/ 24 24 /* Registers in the MAC */ ··· 537 537 538 538 /*--------------------- Export Macros ------------------------------*/ 539 539 540 - #define MACvRegBitsOn(iobase, byRegOfs, byBits) \ 541 - do { \ 542 - unsigned char byData; \ 543 - byData = ioread8(iobase + byRegOfs); \ 544 - iowrite8(byData | (byBits), iobase + byRegOfs); \ 545 - } while (0) 546 - 547 - #define MACvWordRegBitsOn(iobase, byRegOfs, wBits) \ 548 - do { \ 549 - unsigned short wData; \ 550 - wData = ioread16(iobase + byRegOfs); \ 551 - VNSvOutPortW(iobase + byRegOfs, wData | (wBits)); \ 552 - } while (0) 553 - 554 - #define MACvRegBitsOff(iobase, byRegOfs, byBits) \ 555 - do { \ 556 - unsigned char byData; \ 557 - byData = ioread8(iobase + byRegOfs); \ 558 - iowrite8(byData & ~(byBits), iobase + byRegOfs); \ 559 - } while (0) 560 - 561 - #define MACvWordRegBitsOff(iobase, byRegOfs, wBits) \ 562 - do { \ 563 - unsigned short wData; \ 564 - wData = ioread16(iobase + byRegOfs); \ 565 - VNSvOutPortW(iobase + byRegOfs, wData & ~(wBits)); \ 566 - } while (0) 567 - 568 - /* set the chip with current BCN tx descriptor address */ 569 - #define MACvSetCurrBCNTxDescAddr(iobase, dwCurrDescAddr) \ 570 - VNSvOutPortD(iobase + MAC_REG_BCNDMAPTR, \ 571 - dwCurrDescAddr) 572 - 573 - /* set the chip with current BCN length */ 574 - #define MACvSetCurrBCNLength(iobase, wCurrBCNLength) \ 575 - VNSvOutPortW(iobase + MAC_REG_BCNDMACTL + 2, \ 576 - wCurrBCNLength) 577 - 578 - #define MACvWriteBSSIDAddress(iobase, pbyEtherAddr) \ 579 - do { \ 580 - iowrite8(1, iobase + MAC_REG_PAGE1SEL); \ 581 - iowrite8(pbyEtherAddr[0], iobase + MAC_REG_BSSID0); \ 582 - iowrite8(pbyEtherAddr[1], iobase + MAC_REG_BSSID0 + 1); \ 583 - iowrite8(pbyEtherAddr[2], iobase + MAC_REG_BSSID0 + 2); \ 584 - iowrite8(pbyEtherAddr[3], iobase + MAC_REG_BSSID0 + 3); \ 585 - iowrite8(pbyEtherAddr[4], iobase + MAC_REG_BSSID0 + 4); \ 586 - iowrite8(pbyEtherAddr[5], iobase + MAC_REG_BSSID0 + 5); \ 587 - iowrite8(0, iobase + MAC_REG_PAGE1SEL); \ 588 - } while (0) 589 - 590 - #define MACvReadEtherAddress(iobase, pbyEtherAddr) \ 591 - do { \ 592 - iowrite8(1, iobase + MAC_REG_PAGE1SEL); \ 593 - pbyEtherAddr[0] = ioread8(iobase + MAC_REG_PAR0); \ 594 - pbyEtherAddr[1] = ioread8(iobase + MAC_REG_PAR0 + 1); \ 595 - pbyEtherAddr[2] = ioread8(iobase + MAC_REG_PAR0 + 2); \ 596 - pbyEtherAddr[3] = ioread8(iobase + MAC_REG_PAR0 + 3); \ 597 - pbyEtherAddr[4] = ioread8(iobase + MAC_REG_PAR0 + 4); \ 598 - pbyEtherAddr[5] = ioread8(iobase + MAC_REG_PAR0 + 5); \ 599 - iowrite8(0, iobase + MAC_REG_PAGE1SEL); \ 600 - } while (0) 601 - 602 - #define MACvRx0PerPktMode(iobase) \ 603 - VNSvOutPortD(iobase + MAC_REG_RXDMACTL0, RX_PERPKT) 604 - 605 - #define MACvRx1PerPktMode(iobase) \ 606 - VNSvOutPortD(iobase + MAC_REG_RXDMACTL1, RX_PERPKT) 607 - 608 540 #define MACvReceive0(iobase) \ 609 541 do { \ 610 542 unsigned long dwData; \ 611 543 dwData = ioread32(iobase + MAC_REG_RXDMACTL0); \ 612 544 if (dwData & DMACTL_RUN) \ 613 - VNSvOutPortD(iobase + MAC_REG_RXDMACTL0, DMACTL_WAKE); \ 545 + iowrite32(DMACTL_WAKE, iobase + MAC_REG_RXDMACTL0); \ 614 546 else \ 615 - VNSvOutPortD(iobase + MAC_REG_RXDMACTL0, DMACTL_RUN); \ 547 + iowrite32(DMACTL_RUN, iobase + MAC_REG_RXDMACTL0); \ 616 548 } while (0) 617 549 618 550 #define MACvReceive1(iobase) \ ··· 552 620 unsigned long dwData; \ 553 621 dwData = ioread32(iobase + MAC_REG_RXDMACTL1); \ 554 622 if (dwData & DMACTL_RUN) \ 555 - VNSvOutPortD(iobase + MAC_REG_RXDMACTL1, DMACTL_WAKE); \ 623 + iowrite32(DMACTL_WAKE, iobase + MAC_REG_RXDMACTL1); \ 556 624 else \ 557 - VNSvOutPortD(iobase + MAC_REG_RXDMACTL1, DMACTL_RUN); \ 625 + iowrite32(DMACTL_RUN, iobase + MAC_REG_RXDMACTL1); \ 558 626 } while (0) 559 627 560 628 #define MACvTransmit0(iobase) \ ··· 562 630 unsigned long dwData; \ 563 631 dwData = ioread32(iobase + MAC_REG_TXDMACTL0); \ 564 632 if (dwData & DMACTL_RUN) \ 565 - VNSvOutPortD(iobase + MAC_REG_TXDMACTL0, DMACTL_WAKE); \ 633 + iowrite32(DMACTL_WAKE, iobase + MAC_REG_TXDMACTL0); \ 566 634 else \ 567 - VNSvOutPortD(iobase + MAC_REG_TXDMACTL0, DMACTL_RUN); \ 635 + iowrite32(DMACTL_RUN, iobase + MAC_REG_TXDMACTL0); \ 568 636 } while (0) 569 637 570 638 #define MACvTransmitAC0(iobase) \ ··· 572 640 unsigned long dwData; \ 573 641 dwData = ioread32(iobase + MAC_REG_AC0DMACTL); \ 574 642 if (dwData & DMACTL_RUN) \ 575 - VNSvOutPortD(iobase + MAC_REG_AC0DMACTL, DMACTL_WAKE); \ 643 + iowrite32(DMACTL_WAKE, iobase + MAC_REG_AC0DMACTL); \ 576 644 else \ 577 - VNSvOutPortD(iobase + MAC_REG_AC0DMACTL, DMACTL_RUN); \ 645 + iowrite32(DMACTL_RUN, iobase + MAC_REG_AC0DMACTL); \ 578 646 } while (0) 579 - 580 - #define MACvClearStckDS(iobase) \ 581 - do { \ 582 - unsigned char byOrgValue; \ 583 - byOrgValue = ioread8(iobase + MAC_REG_STICKHW); \ 584 - byOrgValue = byOrgValue & 0xFC; \ 585 - iowrite8(byOrgValue, iobase + MAC_REG_STICKHW); \ 586 - } while (0) 587 - 588 - #define MACvWriteISR(iobase, dwValue) \ 589 - VNSvOutPortD(iobase + MAC_REG_ISR, dwValue) 590 - 591 - #define MACvIntEnable(iobase, dwMask) \ 592 - VNSvOutPortD(iobase + MAC_REG_IMR, dwMask) 593 - 594 - #define MACvIntDisable(iobase) \ 595 - VNSvOutPortD(iobase + MAC_REG_IMR, 0) 596 647 597 648 #define MACvSelectPage0(iobase) \ 598 649 iowrite8(0, iobase + MAC_REG_PAGE1SEL) ··· 588 673 unsigned long dwOrgValue; \ 589 674 dwOrgValue = ioread32(iobase + MAC_REG_ENCFG); \ 590 675 dwOrgValue = dwOrgValue | ENCFG_PROTECTMD; \ 591 - VNSvOutPortD(iobase + MAC_REG_ENCFG, dwOrgValue); \ 676 + iowrite32((u32)dwOrgValue, iobase + MAC_REG_ENCFG); \ 592 677 } while (0) 593 678 594 679 #define MACvDisableProtectMD(iobase) \ ··· 596 681 unsigned long dwOrgValue; \ 597 682 dwOrgValue = ioread32(iobase + MAC_REG_ENCFG); \ 598 683 dwOrgValue = dwOrgValue & ~ENCFG_PROTECTMD; \ 599 - VNSvOutPortD(iobase + MAC_REG_ENCFG, dwOrgValue); \ 684 + iowrite32((u32)dwOrgValue, iobase + MAC_REG_ENCFG); \ 600 685 } while (0) 601 686 602 687 #define MACvEnableBarkerPreambleMd(iobase) \ ··· 604 689 unsigned long dwOrgValue; \ 605 690 dwOrgValue = ioread32(iobase + MAC_REG_ENCFG); \ 606 691 dwOrgValue = dwOrgValue | ENCFG_BARKERPREAM; \ 607 - VNSvOutPortD(iobase + MAC_REG_ENCFG, dwOrgValue); \ 692 + iowrite32((u32)dwOrgValue, iobase + MAC_REG_ENCFG); \ 608 693 } while (0) 609 694 610 695 #define MACvDisableBarkerPreambleMd(iobase) \ ··· 612 697 unsigned long dwOrgValue; \ 613 698 dwOrgValue = ioread32(iobase + MAC_REG_ENCFG); \ 614 699 dwOrgValue = dwOrgValue & ~ENCFG_BARKERPREAM; \ 615 - VNSvOutPortD(iobase + MAC_REG_ENCFG, dwOrgValue); \ 700 + iowrite32((u32)dwOrgValue, iobase + MAC_REG_ENCFG); \ 616 701 } while (0) 617 702 618 703 #define MACvSetBBType(iobase, byTyp) \ ··· 621 706 dwOrgValue = ioread32(iobase + MAC_REG_ENCFG); \ 622 707 dwOrgValue = dwOrgValue & ~ENCFG_BBTYPE_MASK; \ 623 708 dwOrgValue = dwOrgValue | (unsigned long)byTyp; \ 624 - VNSvOutPortD(iobase + MAC_REG_ENCFG, dwOrgValue); \ 709 + iowrite32((u32)dwOrgValue, iobase + MAC_REG_ENCFG); \ 625 710 } while (0) 626 711 627 712 #define MACvSetRFLE_LatchBase(iobase) \ 628 - MACvWordRegBitsOn(iobase, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_RFLEOPT) 713 + vt6655_mac_word_reg_bits_on(iobase, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_RFLEOPT) 629 714 630 715 #define MAKEWORD(lb, hb) \ 631 716 ((unsigned short)(((unsigned char)(lb)) | (((unsigned short)((unsigned char)(hb))) << 8))) 717 + 718 + void vt6655_mac_reg_bits_on(void __iomem *iobase, const u8 reg_offset, const u8 bit_mask); 719 + void vt6655_mac_word_reg_bits_on(void __iomem *iobase, const u8 reg_offset, const u16 bit_mask); 720 + void vt6655_mac_reg_bits_off(void __iomem *iobase, const u8 reg_offset, const u8 bit_mask); 721 + void vt6655_mac_word_reg_bits_off(void __iomem *iobase, const u8 reg_offset, const u16 bit_mask); 632 722 633 723 bool MACbIsRegBitsOff(struct vnt_private *priv, unsigned char byRegOfs, 634 724 unsigned char byTestBits);
+12 -13
drivers/staging/vt6655/power.c
··· 52 52 u16 wAID = priv->current_aid | BIT(14) | BIT(15); 53 53 54 54 /* set period of power up before TBTT */ 55 - VNSvOutPortW(priv->port_offset + MAC_REG_PWBT, C_PWBT); 55 + iowrite16(C_PWBT, priv->port_offset + MAC_REG_PWBT); 56 56 if (priv->op_mode != NL80211_IFTYPE_ADHOC) { 57 57 /* set AID */ 58 - VNSvOutPortW(priv->port_offset + MAC_REG_AIDATIM, wAID); 58 + iowrite16(wAID, priv->port_offset + MAC_REG_AIDATIM); 59 59 } 60 60 61 61 /* Set AutoSleep */ 62 - MACvRegBitsOn(priv->port_offset, MAC_REG_PSCFG, PSCFG_AUTOSLEEP); 62 + vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_PSCFG, PSCFG_AUTOSLEEP); 63 63 64 64 /* Set HWUTSF */ 65 - MACvRegBitsOn(priv->port_offset, MAC_REG_TFTCTL, TFTCTL_HWUTSF); 65 + vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_TFTCTL, TFTCTL_HWUTSF); 66 66 67 67 if (wListenInterval >= 2) { 68 68 /* clear always listen beacon */ 69 - MACvRegBitsOff(priv->port_offset, MAC_REG_PSCTL, PSCTL_ALBCN); 69 + vt6655_mac_reg_bits_off(priv->port_offset, MAC_REG_PSCTL, PSCTL_ALBCN); 70 70 /* first time set listen next beacon */ 71 - MACvRegBitsOn(priv->port_offset, MAC_REG_PSCTL, PSCTL_LNBCN); 71 + vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_PSCTL, PSCTL_LNBCN); 72 72 } else { 73 73 /* always listen beacon */ 74 - MACvRegBitsOn(priv->port_offset, MAC_REG_PSCTL, PSCTL_ALBCN); 74 + vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_PSCTL, PSCTL_ALBCN); 75 75 } 76 76 77 77 /* enable power saving hw function */ 78 - MACvRegBitsOn(priv->port_offset, MAC_REG_PSCTL, PSCTL_PSEN); 78 + vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_PSCTL, PSCTL_PSEN); 79 79 priv->bEnablePSMode = true; 80 80 81 81 priv->bPWBitOn = true; ··· 98 98 MACbPSWakeup(priv); 99 99 100 100 /* clear AutoSleep */ 101 - MACvRegBitsOff(priv->port_offset, MAC_REG_PSCFG, PSCFG_AUTOSLEEP); 101 + vt6655_mac_reg_bits_off(priv->port_offset, MAC_REG_PSCFG, PSCFG_AUTOSLEEP); 102 102 103 103 /* clear HWUTSF */ 104 - MACvRegBitsOff(priv->port_offset, MAC_REG_TFTCTL, TFTCTL_HWUTSF); 104 + vt6655_mac_reg_bits_off(priv->port_offset, MAC_REG_TFTCTL, TFTCTL_HWUTSF); 105 105 106 106 /* set always listen beacon */ 107 - MACvRegBitsOn(priv->port_offset, MAC_REG_PSCTL, PSCTL_ALBCN); 107 + vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_PSCTL, PSCTL_ALBCN); 108 108 109 109 priv->bEnablePSMode = false; 110 110 ··· 135 135 136 136 if (priv->wake_up_count == 1) { 137 137 /* Turn on wake up to listen next beacon */ 138 - MACvRegBitsOn(priv->port_offset, 139 - MAC_REG_PSCTL, PSCTL_LNBCN); 138 + vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_PSCTL, PSCTL_LNBCN); 140 139 wake_up = true; 141 140 } 142 141 }
+10 -10
drivers/staging/vt6655/rf.c
··· 171 171 unsigned short ww; 172 172 unsigned long dwValue; 173 173 174 - VNSvOutPortD(iobase + MAC_REG_IFREGCTL, dwData); 174 + iowrite32((u32)dwData, iobase + MAC_REG_IFREGCTL); 175 175 176 176 /* W_MAX_TIMEOUT is the timeout period */ 177 177 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) { ··· 209 209 /* 3-wire control for normal mode */ 210 210 iowrite8(0, iobase + MAC_REG_SOFTPWRCTL); 211 211 212 - MACvWordRegBitsOn(iobase, MAC_REG_SOFTPWRCTL, (SOFTPWRCTL_SWPECTI | 213 - SOFTPWRCTL_TXPEINV)); 212 + vt6655_mac_word_reg_bits_on(iobase, MAC_REG_SOFTPWRCTL, 213 + (SOFTPWRCTL_SWPECTI | SOFTPWRCTL_TXPEINV)); 214 214 /* PLL Off */ 215 - MACvWordRegBitsOff(iobase, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPE3); 215 + vt6655_mac_word_reg_bits_off(iobase, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPE3); 216 216 217 217 /* patch abnormal AL2230 frequency output */ 218 218 IFRFbWriteEmbedded(priv, (0x07168700 + (BY_AL2230_REG_LEN << 3) + IFREGCTL_REGW)); ··· 222 222 MACvTimer0MicroSDelay(priv, 30); /* delay 30 us */ 223 223 224 224 /* PLL On */ 225 - MACvWordRegBitsOn(iobase, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPE3); 225 + vt6655_mac_word_reg_bits_on(iobase, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPE3); 226 226 227 227 MACvTimer0MicroSDelay(priv, 150);/* 150us */ 228 228 ret &= IFRFbWriteEmbedded(priv, (0x00d80f00 + (BY_AL2230_REG_LEN << 3) + IFREGCTL_REGW)); ··· 232 232 ret &= IFRFbWriteEmbedded(priv, 233 233 al2230_init_table[CB_AL2230_INIT_SEQ - 1]); 234 234 235 - MACvWordRegBitsOn(iobase, MAC_REG_SOFTPWRCTL, (SOFTPWRCTL_SWPE3 | 236 - SOFTPWRCTL_SWPE2 | 237 - SOFTPWRCTL_SWPECTI | 238 - SOFTPWRCTL_TXPEINV)); 235 + vt6655_mac_word_reg_bits_on(iobase, MAC_REG_SOFTPWRCTL, (SOFTPWRCTL_SWPE3 | 236 + SOFTPWRCTL_SWPE2 | 237 + SOFTPWRCTL_SWPECTI | 238 + SOFTPWRCTL_TXPEINV)); 239 239 240 240 /* 3-wire control for power saving mode */ 241 241 iowrite8(PSSIG_WPE3 | PSSIG_WPE2, iobase + MAC_REG_PSPWRSIG); ··· 350 350 unsigned char sleep_count = 0; 351 351 unsigned short idx = MISCFIFO_SYNDATA_IDX; 352 352 353 - VNSvOutPortW(iobase + MAC_REG_MISCFFNDEX, 0); 353 + iowrite16(0, iobase + MAC_REG_MISCFFNDEX); 354 354 switch (rf_type) { 355 355 case RF_AIROHA: 356 356 case RF_AL2230S:
+3 -3
drivers/staging/vt6655/rxtx.c
··· 1420 1420 1421 1421 priv->wBCNBufLen = sizeof(*short_head) + skb->len; 1422 1422 1423 - MACvSetCurrBCNTxDescAddr(priv->port_offset, priv->tx_beacon_dma); 1423 + iowrite32((u32)priv->tx_beacon_dma, priv->port_offset + MAC_REG_BCNDMAPTR); 1424 1424 1425 - MACvSetCurrBCNLength(priv->port_offset, priv->wBCNBufLen); 1425 + iowrite16(priv->wBCNBufLen, priv->port_offset + MAC_REG_BCNDMACTL + 2); 1426 1426 /* Set auto Transmit on */ 1427 - MACvRegBitsOn(priv->port_offset, MAC_REG_TCR, TCR_AUTOBCNTX); 1427 + vt6655_mac_reg_bits_on(priv->port_offset, MAC_REG_TCR, TCR_AUTOBCNTX); 1428 1428 /* Poll Transmit the adapter */ 1429 1429 iowrite8(BEACON_READY, priv->port_offset + MAC_REG_BCNDMACTL); 1430 1430
+1 -1
drivers/staging/vt6655/srom.c
··· 27 27 * 28 28 */ 29 29 30 - #include "upc.h" 30 + #include "device.h" 31 31 #include "mac.h" 32 32 #include "srom.h" 33 33
-35
drivers/staging/vt6655/upc.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0+ */ 2 - /* 3 - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. 4 - * All rights reserved. 5 - * 6 - * Purpose: Macros to access device 7 - * 8 - * Author: Tevin Chen 9 - * 10 - * Date: Mar 17, 1997 11 - * 12 - */ 13 - 14 - #ifndef __UPC_H__ 15 - #define __UPC_H__ 16 - 17 - #include "device.h" 18 - 19 - /*--------------------- Export Definitions -------------------------*/ 20 - 21 - /* For memory mapped IO */ 22 - 23 - #define VNSvOutPortW(dwIOAddress, wData) \ 24 - iowrite16((u16)(wData), dwIOAddress) 25 - 26 - #define VNSvOutPortD(dwIOAddress, dwData) \ 27 - iowrite32((u32)(dwData), dwIOAddress) 28 - 29 - /*--------------------- Export Classes ----------------------------*/ 30 - 31 - /*--------------------- Export Variables --------------------------*/ 32 - 33 - /*--------------------- Export Functions --------------------------*/ 34 - 35 - #endif /* __UPC_H__ */
-18
drivers/vme/Kconfig
··· 1 - # SPDX-License-Identifier: GPL-2.0-only 2 - # 3 - # VME configuration. 4 - # 5 - 6 - menuconfig VME_BUS 7 - bool "VME bridge support" 8 - depends on PCI 9 - help 10 - If you say Y here you get support for the VME bridge Framework. 11 - 12 - if VME_BUS 13 - 14 - source "drivers/vme/bridges/Kconfig" 15 - 16 - source "drivers/vme/boards/Kconfig" 17 - 18 - endif # VME
-8
drivers/vme/Makefile
··· 1 - # SPDX-License-Identifier: GPL-2.0-only 2 - # 3 - # Makefile for the VME bridge device drivers. 4 - # 5 - obj-$(CONFIG_VME_BUS) += vme.o 6 - 7 - obj-y += bridges/ 8 - obj-y += boards/
-10
drivers/vme/boards/Kconfig
··· 1 - # SPDX-License-Identifier: GPL-2.0-only 2 - comment "VME Board Drivers" 3 - 4 - config VMIVME_7805 5 - tristate "VMIVME-7805" 6 - help 7 - If you say Y here you get support for the VMIVME-7805 board. 8 - This board has an additional control interface to the Universe II 9 - chip. This driver has to be included if you want to access VME bus 10 - with VMIVME-7805 board.
-6
drivers/vme/boards/Makefile
··· 1 - # SPDX-License-Identifier: GPL-2.0-only 2 - # 3 - # Makefile for the VME board drivers. 4 - # 5 - 6 - obj-$(CONFIG_VMIVME_7805) += vme_vmivme7805.o
-106
drivers/vme/boards/vme_vmivme7805.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-or-later 2 - /* 3 - * Support for the VMIVME-7805 board access to the Universe II bridge. 4 - * 5 - * Author: Arthur Benilov <arthur.benilov@iba-group.com> 6 - * Copyright 2010 Ion Beam Application, Inc. 7 - */ 8 - 9 - #include <linux/module.h> 10 - #include <linux/types.h> 11 - #include <linux/errno.h> 12 - #include <linux/pci.h> 13 - #include <linux/poll.h> 14 - #include <linux/io.h> 15 - 16 - #include "vme_vmivme7805.h" 17 - 18 - static int vmic_probe(struct pci_dev *, const struct pci_device_id *); 19 - static void vmic_remove(struct pci_dev *); 20 - 21 - /** Base address to access FPGA register */ 22 - static void __iomem *vmic_base; 23 - 24 - static const char driver_name[] = "vmivme_7805"; 25 - 26 - static const struct pci_device_id vmic_ids[] = { 27 - { PCI_DEVICE(PCI_VENDOR_ID_VMIC, PCI_DEVICE_ID_VTIMR) }, 28 - { }, 29 - }; 30 - 31 - static struct pci_driver vmic_driver = { 32 - .name = driver_name, 33 - .id_table = vmic_ids, 34 - .probe = vmic_probe, 35 - .remove = vmic_remove, 36 - }; 37 - 38 - static int vmic_probe(struct pci_dev *pdev, const struct pci_device_id *id) 39 - { 40 - int retval; 41 - u32 data; 42 - 43 - /* Enable the device */ 44 - retval = pci_enable_device(pdev); 45 - if (retval) { 46 - dev_err(&pdev->dev, "Unable to enable device\n"); 47 - goto err; 48 - } 49 - 50 - /* Map Registers */ 51 - retval = pci_request_regions(pdev, driver_name); 52 - if (retval) { 53 - dev_err(&pdev->dev, "Unable to reserve resources\n"); 54 - goto err_resource; 55 - } 56 - 57 - /* Map registers in BAR 0 */ 58 - vmic_base = ioremap(pci_resource_start(pdev, 0), 16); 59 - if (!vmic_base) { 60 - dev_err(&pdev->dev, "Unable to remap CRG region\n"); 61 - retval = -EIO; 62 - goto err_remap; 63 - } 64 - 65 - /* Clear the FPGA VME IF contents */ 66 - iowrite32(0, vmic_base + VME_CONTROL); 67 - 68 - /* Clear any initial BERR */ 69 - data = ioread32(vmic_base + VME_CONTROL) & 0x00000FFF; 70 - data |= BM_VME_CONTROL_BERRST; 71 - iowrite32(data, vmic_base + VME_CONTROL); 72 - 73 - /* Enable the vme interface and byte swapping */ 74 - data = ioread32(vmic_base + VME_CONTROL) & 0x00000FFF; 75 - data = data | BM_VME_CONTROL_MASTER_ENDIAN | 76 - BM_VME_CONTROL_SLAVE_ENDIAN | 77 - BM_VME_CONTROL_ABLE | 78 - BM_VME_CONTROL_BERRI | 79 - BM_VME_CONTROL_BPENA | 80 - BM_VME_CONTROL_VBENA; 81 - iowrite32(data, vmic_base + VME_CONTROL); 82 - 83 - return 0; 84 - 85 - err_remap: 86 - pci_release_regions(pdev); 87 - err_resource: 88 - pci_disable_device(pdev); 89 - err: 90 - return retval; 91 - } 92 - 93 - static void vmic_remove(struct pci_dev *pdev) 94 - { 95 - iounmap(vmic_base); 96 - pci_release_regions(pdev); 97 - pci_disable_device(pdev); 98 - 99 - } 100 - 101 - module_pci_driver(vmic_driver); 102 - 103 - MODULE_DESCRIPTION("VMIVME-7805 board support driver"); 104 - MODULE_AUTHOR("Arthur Benilov <arthur.benilov@iba-group.com>"); 105 - MODULE_LICENSE("GPL"); 106 -
-33
drivers/vme/boards/vme_vmivme7805.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 - /* 3 - * vmivme_7805.h 4 - * 5 - * Support for the VMIVME-7805 board access to the Universe II bridge. 6 - * 7 - * Author: Arthur Benilov <arthur.benilov@iba-group.com> 8 - * Copyright 2010 Ion Beam Application, Inc. 9 - */ 10 - 11 - 12 - #ifndef _VMIVME_7805_H 13 - #define _VMIVME_7805_H 14 - 15 - #ifndef PCI_VENDOR_ID_VMIC 16 - #define PCI_VENDOR_ID_VMIC 0x114A 17 - #endif 18 - 19 - #ifndef PCI_DEVICE_ID_VTIMR 20 - #define PCI_DEVICE_ID_VTIMR 0x0004 21 - #endif 22 - 23 - #define VME_CONTROL 0x0000 24 - #define BM_VME_CONTROL_MASTER_ENDIAN 0x0001 25 - #define BM_VME_CONTROL_SLAVE_ENDIAN 0x0002 26 - #define BM_VME_CONTROL_ABLE 0x0004 27 - #define BM_VME_CONTROL_BERRI 0x0040 28 - #define BM_VME_CONTROL_BERRST 0x0080 29 - #define BM_VME_CONTROL_BPENA 0x0400 30 - #define BM_VME_CONTROL_VBENA 0x0800 31 - 32 - #endif /* _VMIVME_7805_H */ 33 -
-24
drivers/vme/bridges/Kconfig
··· 1 - # SPDX-License-Identifier: GPL-2.0-only 2 - comment "VME Bridge Drivers" 3 - 4 - config VME_CA91CX42 5 - tristate "Universe II" 6 - depends on VIRT_TO_BUS 7 - help 8 - If you say Y here you get support for the Tundra CA91C142 9 - (Universe II) VME bridge chip. 10 - 11 - config VME_TSI148 12 - tristate "Tempe" 13 - depends on HAS_DMA 14 - help 15 - If you say Y here you get support for the Tundra TSI148 VME bridge 16 - chip. 17 - 18 - config VME_FAKE 19 - tristate "Fake" 20 - help 21 - If you say Y here you get support for the fake VME bridge. This 22 - provides a virtualised VME Bus for devices with no VME bridge. This 23 - is mainly useful for VME development (in the absence of VME 24 - hardware).
-4
drivers/vme/bridges/Makefile
··· 1 - # SPDX-License-Identifier: GPL-2.0-only 2 - obj-$(CONFIG_VME_CA91CX42) += vme_ca91cx42.o 3 - obj-$(CONFIG_VME_TSI148) += vme_tsi148.o 4 - obj-$(CONFIG_VME_FAKE) += vme_fake.o
-1928
drivers/vme/bridges/vme_ca91cx42.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-or-later 2 - /* 3 - * Support for the Tundra Universe I/II VME-PCI Bridge Chips 4 - * 5 - * Author: Martyn Welch <martyn.welch@ge.com> 6 - * Copyright 2008 GE Intelligent Platforms Embedded Systems, Inc. 7 - * 8 - * Based on work by Tom Armistead and Ajit Prem 9 - * Copyright 2004 Motorola Inc. 10 - * 11 - * Derived from ca91c042.c by Michael Wyrick 12 - */ 13 - 14 - #include <linux/module.h> 15 - #include <linux/mm.h> 16 - #include <linux/types.h> 17 - #include <linux/errno.h> 18 - #include <linux/pci.h> 19 - #include <linux/dma-mapping.h> 20 - #include <linux/poll.h> 21 - #include <linux/interrupt.h> 22 - #include <linux/spinlock.h> 23 - #include <linux/sched.h> 24 - #include <linux/slab.h> 25 - #include <linux/time.h> 26 - #include <linux/io.h> 27 - #include <linux/uaccess.h> 28 - #include <linux/vme.h> 29 - 30 - #include "../vme_bridge.h" 31 - #include "vme_ca91cx42.h" 32 - 33 - static int ca91cx42_probe(struct pci_dev *, const struct pci_device_id *); 34 - static void ca91cx42_remove(struct pci_dev *); 35 - 36 - /* Module parameters */ 37 - static int geoid; 38 - 39 - static const char driver_name[] = "vme_ca91cx42"; 40 - 41 - static const struct pci_device_id ca91cx42_ids[] = { 42 - { PCI_DEVICE(PCI_VENDOR_ID_TUNDRA, PCI_DEVICE_ID_TUNDRA_CA91C142) }, 43 - { }, 44 - }; 45 - 46 - MODULE_DEVICE_TABLE(pci, ca91cx42_ids); 47 - 48 - static struct pci_driver ca91cx42_driver = { 49 - .name = driver_name, 50 - .id_table = ca91cx42_ids, 51 - .probe = ca91cx42_probe, 52 - .remove = ca91cx42_remove, 53 - }; 54 - 55 - static u32 ca91cx42_DMA_irqhandler(struct ca91cx42_driver *bridge) 56 - { 57 - wake_up(&bridge->dma_queue); 58 - 59 - return CA91CX42_LINT_DMA; 60 - } 61 - 62 - static u32 ca91cx42_LM_irqhandler(struct ca91cx42_driver *bridge, u32 stat) 63 - { 64 - int i; 65 - u32 serviced = 0; 66 - 67 - for (i = 0; i < 4; i++) { 68 - if (stat & CA91CX42_LINT_LM[i]) { 69 - /* We only enable interrupts if the callback is set */ 70 - bridge->lm_callback[i](bridge->lm_data[i]); 71 - serviced |= CA91CX42_LINT_LM[i]; 72 - } 73 - } 74 - 75 - return serviced; 76 - } 77 - 78 - /* XXX This needs to be split into 4 queues */ 79 - static u32 ca91cx42_MB_irqhandler(struct ca91cx42_driver *bridge, int mbox_mask) 80 - { 81 - wake_up(&bridge->mbox_queue); 82 - 83 - return CA91CX42_LINT_MBOX; 84 - } 85 - 86 - static u32 ca91cx42_IACK_irqhandler(struct ca91cx42_driver *bridge) 87 - { 88 - wake_up(&bridge->iack_queue); 89 - 90 - return CA91CX42_LINT_SW_IACK; 91 - } 92 - 93 - static u32 ca91cx42_VERR_irqhandler(struct vme_bridge *ca91cx42_bridge) 94 - { 95 - int val; 96 - struct ca91cx42_driver *bridge; 97 - 98 - bridge = ca91cx42_bridge->driver_priv; 99 - 100 - val = ioread32(bridge->base + DGCS); 101 - 102 - if (!(val & 0x00000800)) { 103 - dev_err(ca91cx42_bridge->parent, "ca91cx42_VERR_irqhandler DMA " 104 - "Read Error DGCS=%08X\n", val); 105 - } 106 - 107 - return CA91CX42_LINT_VERR; 108 - } 109 - 110 - static u32 ca91cx42_LERR_irqhandler(struct vme_bridge *ca91cx42_bridge) 111 - { 112 - int val; 113 - struct ca91cx42_driver *bridge; 114 - 115 - bridge = ca91cx42_bridge->driver_priv; 116 - 117 - val = ioread32(bridge->base + DGCS); 118 - 119 - if (!(val & 0x00000800)) 120 - dev_err(ca91cx42_bridge->parent, "ca91cx42_LERR_irqhandler DMA " 121 - "Read Error DGCS=%08X\n", val); 122 - 123 - return CA91CX42_LINT_LERR; 124 - } 125 - 126 - 127 - static u32 ca91cx42_VIRQ_irqhandler(struct vme_bridge *ca91cx42_bridge, 128 - int stat) 129 - { 130 - int vec, i, serviced = 0; 131 - struct ca91cx42_driver *bridge; 132 - 133 - bridge = ca91cx42_bridge->driver_priv; 134 - 135 - 136 - for (i = 7; i > 0; i--) { 137 - if (stat & (1 << i)) { 138 - vec = ioread32(bridge->base + 139 - CA91CX42_V_STATID[i]) & 0xff; 140 - 141 - vme_irq_handler(ca91cx42_bridge, i, vec); 142 - 143 - serviced |= (1 << i); 144 - } 145 - } 146 - 147 - return serviced; 148 - } 149 - 150 - static irqreturn_t ca91cx42_irqhandler(int irq, void *ptr) 151 - { 152 - u32 stat, enable, serviced = 0; 153 - struct vme_bridge *ca91cx42_bridge; 154 - struct ca91cx42_driver *bridge; 155 - 156 - ca91cx42_bridge = ptr; 157 - 158 - bridge = ca91cx42_bridge->driver_priv; 159 - 160 - enable = ioread32(bridge->base + LINT_EN); 161 - stat = ioread32(bridge->base + LINT_STAT); 162 - 163 - /* Only look at unmasked interrupts */ 164 - stat &= enable; 165 - 166 - if (unlikely(!stat)) 167 - return IRQ_NONE; 168 - 169 - if (stat & CA91CX42_LINT_DMA) 170 - serviced |= ca91cx42_DMA_irqhandler(bridge); 171 - if (stat & (CA91CX42_LINT_LM0 | CA91CX42_LINT_LM1 | CA91CX42_LINT_LM2 | 172 - CA91CX42_LINT_LM3)) 173 - serviced |= ca91cx42_LM_irqhandler(bridge, stat); 174 - if (stat & CA91CX42_LINT_MBOX) 175 - serviced |= ca91cx42_MB_irqhandler(bridge, stat); 176 - if (stat & CA91CX42_LINT_SW_IACK) 177 - serviced |= ca91cx42_IACK_irqhandler(bridge); 178 - if (stat & CA91CX42_LINT_VERR) 179 - serviced |= ca91cx42_VERR_irqhandler(ca91cx42_bridge); 180 - if (stat & CA91CX42_LINT_LERR) 181 - serviced |= ca91cx42_LERR_irqhandler(ca91cx42_bridge); 182 - if (stat & (CA91CX42_LINT_VIRQ1 | CA91CX42_LINT_VIRQ2 | 183 - CA91CX42_LINT_VIRQ3 | CA91CX42_LINT_VIRQ4 | 184 - CA91CX42_LINT_VIRQ5 | CA91CX42_LINT_VIRQ6 | 185 - CA91CX42_LINT_VIRQ7)) 186 - serviced |= ca91cx42_VIRQ_irqhandler(ca91cx42_bridge, stat); 187 - 188 - /* Clear serviced interrupts */ 189 - iowrite32(serviced, bridge->base + LINT_STAT); 190 - 191 - return IRQ_HANDLED; 192 - } 193 - 194 - static int ca91cx42_irq_init(struct vme_bridge *ca91cx42_bridge) 195 - { 196 - int result, tmp; 197 - struct pci_dev *pdev; 198 - struct ca91cx42_driver *bridge; 199 - 200 - bridge = ca91cx42_bridge->driver_priv; 201 - 202 - /* Need pdev */ 203 - pdev = to_pci_dev(ca91cx42_bridge->parent); 204 - 205 - /* Disable interrupts from PCI to VME */ 206 - iowrite32(0, bridge->base + VINT_EN); 207 - 208 - /* Disable PCI interrupts */ 209 - iowrite32(0, bridge->base + LINT_EN); 210 - /* Clear Any Pending PCI Interrupts */ 211 - iowrite32(0x00FFFFFF, bridge->base + LINT_STAT); 212 - 213 - result = request_irq(pdev->irq, ca91cx42_irqhandler, IRQF_SHARED, 214 - driver_name, ca91cx42_bridge); 215 - if (result) { 216 - dev_err(&pdev->dev, "Can't get assigned pci irq vector %02X\n", 217 - pdev->irq); 218 - return result; 219 - } 220 - 221 - /* Ensure all interrupts are mapped to PCI Interrupt 0 */ 222 - iowrite32(0, bridge->base + LINT_MAP0); 223 - iowrite32(0, bridge->base + LINT_MAP1); 224 - iowrite32(0, bridge->base + LINT_MAP2); 225 - 226 - /* Enable DMA, mailbox & LM Interrupts */ 227 - tmp = CA91CX42_LINT_MBOX3 | CA91CX42_LINT_MBOX2 | CA91CX42_LINT_MBOX1 | 228 - CA91CX42_LINT_MBOX0 | CA91CX42_LINT_SW_IACK | 229 - CA91CX42_LINT_VERR | CA91CX42_LINT_LERR | CA91CX42_LINT_DMA; 230 - 231 - iowrite32(tmp, bridge->base + LINT_EN); 232 - 233 - return 0; 234 - } 235 - 236 - static void ca91cx42_irq_exit(struct ca91cx42_driver *bridge, 237 - struct pci_dev *pdev) 238 - { 239 - struct vme_bridge *ca91cx42_bridge; 240 - 241 - /* Disable interrupts from PCI to VME */ 242 - iowrite32(0, bridge->base + VINT_EN); 243 - 244 - /* Disable PCI interrupts */ 245 - iowrite32(0, bridge->base + LINT_EN); 246 - /* Clear Any Pending PCI Interrupts */ 247 - iowrite32(0x00FFFFFF, bridge->base + LINT_STAT); 248 - 249 - ca91cx42_bridge = container_of((void *)bridge, struct vme_bridge, 250 - driver_priv); 251 - free_irq(pdev->irq, ca91cx42_bridge); 252 - } 253 - 254 - static int ca91cx42_iack_received(struct ca91cx42_driver *bridge, int level) 255 - { 256 - u32 tmp; 257 - 258 - tmp = ioread32(bridge->base + LINT_STAT); 259 - 260 - if (tmp & (1 << level)) 261 - return 0; 262 - else 263 - return 1; 264 - } 265 - 266 - /* 267 - * Set up an VME interrupt 268 - */ 269 - static void ca91cx42_irq_set(struct vme_bridge *ca91cx42_bridge, int level, 270 - int state, int sync) 271 - 272 - { 273 - struct pci_dev *pdev; 274 - u32 tmp; 275 - struct ca91cx42_driver *bridge; 276 - 277 - bridge = ca91cx42_bridge->driver_priv; 278 - 279 - /* Enable IRQ level */ 280 - tmp = ioread32(bridge->base + LINT_EN); 281 - 282 - if (state == 0) 283 - tmp &= ~CA91CX42_LINT_VIRQ[level]; 284 - else 285 - tmp |= CA91CX42_LINT_VIRQ[level]; 286 - 287 - iowrite32(tmp, bridge->base + LINT_EN); 288 - 289 - if ((state == 0) && (sync != 0)) { 290 - pdev = to_pci_dev(ca91cx42_bridge->parent); 291 - 292 - synchronize_irq(pdev->irq); 293 - } 294 - } 295 - 296 - static int ca91cx42_irq_generate(struct vme_bridge *ca91cx42_bridge, int level, 297 - int statid) 298 - { 299 - u32 tmp; 300 - struct ca91cx42_driver *bridge; 301 - 302 - bridge = ca91cx42_bridge->driver_priv; 303 - 304 - /* Universe can only generate even vectors */ 305 - if (statid & 1) 306 - return -EINVAL; 307 - 308 - mutex_lock(&bridge->vme_int); 309 - 310 - tmp = ioread32(bridge->base + VINT_EN); 311 - 312 - /* Set Status/ID */ 313 - iowrite32(statid << 24, bridge->base + STATID); 314 - 315 - /* Assert VMEbus IRQ */ 316 - tmp = tmp | (1 << (level + 24)); 317 - iowrite32(tmp, bridge->base + VINT_EN); 318 - 319 - /* Wait for IACK */ 320 - wait_event_interruptible(bridge->iack_queue, 321 - ca91cx42_iack_received(bridge, level)); 322 - 323 - /* Return interrupt to low state */ 324 - tmp = ioread32(bridge->base + VINT_EN); 325 - tmp = tmp & ~(1 << (level + 24)); 326 - iowrite32(tmp, bridge->base + VINT_EN); 327 - 328 - mutex_unlock(&bridge->vme_int); 329 - 330 - return 0; 331 - } 332 - 333 - static int ca91cx42_slave_set(struct vme_slave_resource *image, int enabled, 334 - unsigned long long vme_base, unsigned long long size, 335 - dma_addr_t pci_base, u32 aspace, u32 cycle) 336 - { 337 - unsigned int i, addr = 0, granularity; 338 - unsigned int temp_ctl = 0; 339 - unsigned int vme_bound, pci_offset; 340 - struct vme_bridge *ca91cx42_bridge; 341 - struct ca91cx42_driver *bridge; 342 - 343 - ca91cx42_bridge = image->parent; 344 - 345 - bridge = ca91cx42_bridge->driver_priv; 346 - 347 - i = image->number; 348 - 349 - switch (aspace) { 350 - case VME_A16: 351 - addr |= CA91CX42_VSI_CTL_VAS_A16; 352 - break; 353 - case VME_A24: 354 - addr |= CA91CX42_VSI_CTL_VAS_A24; 355 - break; 356 - case VME_A32: 357 - addr |= CA91CX42_VSI_CTL_VAS_A32; 358 - break; 359 - case VME_USER1: 360 - addr |= CA91CX42_VSI_CTL_VAS_USER1; 361 - break; 362 - case VME_USER2: 363 - addr |= CA91CX42_VSI_CTL_VAS_USER2; 364 - break; 365 - case VME_A64: 366 - case VME_CRCSR: 367 - case VME_USER3: 368 - case VME_USER4: 369 - default: 370 - dev_err(ca91cx42_bridge->parent, "Invalid address space\n"); 371 - return -EINVAL; 372 - break; 373 - } 374 - 375 - /* 376 - * Bound address is a valid address for the window, adjust 377 - * accordingly 378 - */ 379 - vme_bound = vme_base + size; 380 - pci_offset = pci_base - vme_base; 381 - 382 - if ((i == 0) || (i == 4)) 383 - granularity = 0x1000; 384 - else 385 - granularity = 0x10000; 386 - 387 - if (vme_base & (granularity - 1)) { 388 - dev_err(ca91cx42_bridge->parent, "Invalid VME base " 389 - "alignment\n"); 390 - return -EINVAL; 391 - } 392 - if (vme_bound & (granularity - 1)) { 393 - dev_err(ca91cx42_bridge->parent, "Invalid VME bound " 394 - "alignment\n"); 395 - return -EINVAL; 396 - } 397 - if (pci_offset & (granularity - 1)) { 398 - dev_err(ca91cx42_bridge->parent, "Invalid PCI Offset " 399 - "alignment\n"); 400 - return -EINVAL; 401 - } 402 - 403 - /* Disable while we are mucking around */ 404 - temp_ctl = ioread32(bridge->base + CA91CX42_VSI_CTL[i]); 405 - temp_ctl &= ~CA91CX42_VSI_CTL_EN; 406 - iowrite32(temp_ctl, bridge->base + CA91CX42_VSI_CTL[i]); 407 - 408 - /* Setup mapping */ 409 - iowrite32(vme_base, bridge->base + CA91CX42_VSI_BS[i]); 410 - iowrite32(vme_bound, bridge->base + CA91CX42_VSI_BD[i]); 411 - iowrite32(pci_offset, bridge->base + CA91CX42_VSI_TO[i]); 412 - 413 - /* Setup address space */ 414 - temp_ctl &= ~CA91CX42_VSI_CTL_VAS_M; 415 - temp_ctl |= addr; 416 - 417 - /* Setup cycle types */ 418 - temp_ctl &= ~(CA91CX42_VSI_CTL_PGM_M | CA91CX42_VSI_CTL_SUPER_M); 419 - if (cycle & VME_SUPER) 420 - temp_ctl |= CA91CX42_VSI_CTL_SUPER_SUPR; 421 - if (cycle & VME_USER) 422 - temp_ctl |= CA91CX42_VSI_CTL_SUPER_NPRIV; 423 - if (cycle & VME_PROG) 424 - temp_ctl |= CA91CX42_VSI_CTL_PGM_PGM; 425 - if (cycle & VME_DATA) 426 - temp_ctl |= CA91CX42_VSI_CTL_PGM_DATA; 427 - 428 - /* Write ctl reg without enable */ 429 - iowrite32(temp_ctl, bridge->base + CA91CX42_VSI_CTL[i]); 430 - 431 - if (enabled) 432 - temp_ctl |= CA91CX42_VSI_CTL_EN; 433 - 434 - iowrite32(temp_ctl, bridge->base + CA91CX42_VSI_CTL[i]); 435 - 436 - return 0; 437 - } 438 - 439 - static int ca91cx42_slave_get(struct vme_slave_resource *image, int *enabled, 440 - unsigned long long *vme_base, unsigned long long *size, 441 - dma_addr_t *pci_base, u32 *aspace, u32 *cycle) 442 - { 443 - unsigned int i, granularity = 0, ctl = 0; 444 - unsigned long long vme_bound, pci_offset; 445 - struct ca91cx42_driver *bridge; 446 - 447 - bridge = image->parent->driver_priv; 448 - 449 - i = image->number; 450 - 451 - if ((i == 0) || (i == 4)) 452 - granularity = 0x1000; 453 - else 454 - granularity = 0x10000; 455 - 456 - /* Read Registers */ 457 - ctl = ioread32(bridge->base + CA91CX42_VSI_CTL[i]); 458 - 459 - *vme_base = ioread32(bridge->base + CA91CX42_VSI_BS[i]); 460 - vme_bound = ioread32(bridge->base + CA91CX42_VSI_BD[i]); 461 - pci_offset = ioread32(bridge->base + CA91CX42_VSI_TO[i]); 462 - 463 - *pci_base = (dma_addr_t)*vme_base + pci_offset; 464 - *size = (unsigned long long)((vme_bound - *vme_base) + granularity); 465 - 466 - *enabled = 0; 467 - *aspace = 0; 468 - *cycle = 0; 469 - 470 - if (ctl & CA91CX42_VSI_CTL_EN) 471 - *enabled = 1; 472 - 473 - if ((ctl & CA91CX42_VSI_CTL_VAS_M) == CA91CX42_VSI_CTL_VAS_A16) 474 - *aspace = VME_A16; 475 - if ((ctl & CA91CX42_VSI_CTL_VAS_M) == CA91CX42_VSI_CTL_VAS_A24) 476 - *aspace = VME_A24; 477 - if ((ctl & CA91CX42_VSI_CTL_VAS_M) == CA91CX42_VSI_CTL_VAS_A32) 478 - *aspace = VME_A32; 479 - if ((ctl & CA91CX42_VSI_CTL_VAS_M) == CA91CX42_VSI_CTL_VAS_USER1) 480 - *aspace = VME_USER1; 481 - if ((ctl & CA91CX42_VSI_CTL_VAS_M) == CA91CX42_VSI_CTL_VAS_USER2) 482 - *aspace = VME_USER2; 483 - 484 - if (ctl & CA91CX42_VSI_CTL_SUPER_SUPR) 485 - *cycle |= VME_SUPER; 486 - if (ctl & CA91CX42_VSI_CTL_SUPER_NPRIV) 487 - *cycle |= VME_USER; 488 - if (ctl & CA91CX42_VSI_CTL_PGM_PGM) 489 - *cycle |= VME_PROG; 490 - if (ctl & CA91CX42_VSI_CTL_PGM_DATA) 491 - *cycle |= VME_DATA; 492 - 493 - return 0; 494 - } 495 - 496 - /* 497 - * Allocate and map PCI Resource 498 - */ 499 - static int ca91cx42_alloc_resource(struct vme_master_resource *image, 500 - unsigned long long size) 501 - { 502 - unsigned long long existing_size; 503 - int retval = 0; 504 - struct pci_dev *pdev; 505 - struct vme_bridge *ca91cx42_bridge; 506 - 507 - ca91cx42_bridge = image->parent; 508 - 509 - /* Find pci_dev container of dev */ 510 - if (!ca91cx42_bridge->parent) { 511 - dev_err(ca91cx42_bridge->parent, "Dev entry NULL\n"); 512 - return -EINVAL; 513 - } 514 - pdev = to_pci_dev(ca91cx42_bridge->parent); 515 - 516 - existing_size = (unsigned long long)(image->bus_resource.end - 517 - image->bus_resource.start); 518 - 519 - /* If the existing size is OK, return */ 520 - if (existing_size == (size - 1)) 521 - return 0; 522 - 523 - if (existing_size != 0) { 524 - iounmap(image->kern_base); 525 - image->kern_base = NULL; 526 - kfree(image->bus_resource.name); 527 - release_resource(&image->bus_resource); 528 - memset(&image->bus_resource, 0, sizeof(image->bus_resource)); 529 - } 530 - 531 - if (!image->bus_resource.name) { 532 - image->bus_resource.name = kmalloc(VMENAMSIZ+3, GFP_ATOMIC); 533 - if (!image->bus_resource.name) { 534 - retval = -ENOMEM; 535 - goto err_name; 536 - } 537 - } 538 - 539 - sprintf((char *)image->bus_resource.name, "%s.%d", 540 - ca91cx42_bridge->name, image->number); 541 - 542 - image->bus_resource.start = 0; 543 - image->bus_resource.end = (unsigned long)size; 544 - image->bus_resource.flags = IORESOURCE_MEM; 545 - 546 - retval = pci_bus_alloc_resource(pdev->bus, 547 - &image->bus_resource, size, 0x10000, PCIBIOS_MIN_MEM, 548 - 0, NULL, NULL); 549 - if (retval) { 550 - dev_err(ca91cx42_bridge->parent, "Failed to allocate mem " 551 - "resource for window %d size 0x%lx start 0x%lx\n", 552 - image->number, (unsigned long)size, 553 - (unsigned long)image->bus_resource.start); 554 - goto err_resource; 555 - } 556 - 557 - image->kern_base = ioremap( 558 - image->bus_resource.start, size); 559 - if (!image->kern_base) { 560 - dev_err(ca91cx42_bridge->parent, "Failed to remap resource\n"); 561 - retval = -ENOMEM; 562 - goto err_remap; 563 - } 564 - 565 - return 0; 566 - 567 - err_remap: 568 - release_resource(&image->bus_resource); 569 - err_resource: 570 - kfree(image->bus_resource.name); 571 - memset(&image->bus_resource, 0, sizeof(image->bus_resource)); 572 - err_name: 573 - return retval; 574 - } 575 - 576 - /* 577 - * Free and unmap PCI Resource 578 - */ 579 - static void ca91cx42_free_resource(struct vme_master_resource *image) 580 - { 581 - iounmap(image->kern_base); 582 - image->kern_base = NULL; 583 - release_resource(&image->bus_resource); 584 - kfree(image->bus_resource.name); 585 - memset(&image->bus_resource, 0, sizeof(image->bus_resource)); 586 - } 587 - 588 - 589 - static int ca91cx42_master_set(struct vme_master_resource *image, int enabled, 590 - unsigned long long vme_base, unsigned long long size, u32 aspace, 591 - u32 cycle, u32 dwidth) 592 - { 593 - int retval = 0; 594 - unsigned int i, granularity = 0; 595 - unsigned int temp_ctl = 0; 596 - unsigned long long pci_bound, vme_offset, pci_base; 597 - struct vme_bridge *ca91cx42_bridge; 598 - struct ca91cx42_driver *bridge; 599 - 600 - ca91cx42_bridge = image->parent; 601 - 602 - bridge = ca91cx42_bridge->driver_priv; 603 - 604 - i = image->number; 605 - 606 - if ((i == 0) || (i == 4)) 607 - granularity = 0x1000; 608 - else 609 - granularity = 0x10000; 610 - 611 - /* Verify input data */ 612 - if (vme_base & (granularity - 1)) { 613 - dev_err(ca91cx42_bridge->parent, "Invalid VME Window " 614 - "alignment\n"); 615 - retval = -EINVAL; 616 - goto err_window; 617 - } 618 - if (size & (granularity - 1)) { 619 - dev_err(ca91cx42_bridge->parent, "Invalid VME Window " 620 - "alignment\n"); 621 - retval = -EINVAL; 622 - goto err_window; 623 - } 624 - 625 - spin_lock(&image->lock); 626 - 627 - /* 628 - * Let's allocate the resource here rather than further up the stack as 629 - * it avoids pushing loads of bus dependent stuff up the stack 630 - */ 631 - retval = ca91cx42_alloc_resource(image, size); 632 - if (retval) { 633 - spin_unlock(&image->lock); 634 - dev_err(ca91cx42_bridge->parent, "Unable to allocate memory " 635 - "for resource name\n"); 636 - retval = -ENOMEM; 637 - goto err_res; 638 - } 639 - 640 - pci_base = (unsigned long long)image->bus_resource.start; 641 - 642 - /* 643 - * Bound address is a valid address for the window, adjust 644 - * according to window granularity. 645 - */ 646 - pci_bound = pci_base + size; 647 - vme_offset = vme_base - pci_base; 648 - 649 - /* Disable while we are mucking around */ 650 - temp_ctl = ioread32(bridge->base + CA91CX42_LSI_CTL[i]); 651 - temp_ctl &= ~CA91CX42_LSI_CTL_EN; 652 - iowrite32(temp_ctl, bridge->base + CA91CX42_LSI_CTL[i]); 653 - 654 - /* Setup cycle types */ 655 - temp_ctl &= ~CA91CX42_LSI_CTL_VCT_M; 656 - if (cycle & VME_BLT) 657 - temp_ctl |= CA91CX42_LSI_CTL_VCT_BLT; 658 - if (cycle & VME_MBLT) 659 - temp_ctl |= CA91CX42_LSI_CTL_VCT_MBLT; 660 - 661 - /* Setup data width */ 662 - temp_ctl &= ~CA91CX42_LSI_CTL_VDW_M; 663 - switch (dwidth) { 664 - case VME_D8: 665 - temp_ctl |= CA91CX42_LSI_CTL_VDW_D8; 666 - break; 667 - case VME_D16: 668 - temp_ctl |= CA91CX42_LSI_CTL_VDW_D16; 669 - break; 670 - case VME_D32: 671 - temp_ctl |= CA91CX42_LSI_CTL_VDW_D32; 672 - break; 673 - case VME_D64: 674 - temp_ctl |= CA91CX42_LSI_CTL_VDW_D64; 675 - break; 676 - default: 677 - spin_unlock(&image->lock); 678 - dev_err(ca91cx42_bridge->parent, "Invalid data width\n"); 679 - retval = -EINVAL; 680 - goto err_dwidth; 681 - break; 682 - } 683 - 684 - /* Setup address space */ 685 - temp_ctl &= ~CA91CX42_LSI_CTL_VAS_M; 686 - switch (aspace) { 687 - case VME_A16: 688 - temp_ctl |= CA91CX42_LSI_CTL_VAS_A16; 689 - break; 690 - case VME_A24: 691 - temp_ctl |= CA91CX42_LSI_CTL_VAS_A24; 692 - break; 693 - case VME_A32: 694 - temp_ctl |= CA91CX42_LSI_CTL_VAS_A32; 695 - break; 696 - case VME_CRCSR: 697 - temp_ctl |= CA91CX42_LSI_CTL_VAS_CRCSR; 698 - break; 699 - case VME_USER1: 700 - temp_ctl |= CA91CX42_LSI_CTL_VAS_USER1; 701 - break; 702 - case VME_USER2: 703 - temp_ctl |= CA91CX42_LSI_CTL_VAS_USER2; 704 - break; 705 - case VME_A64: 706 - case VME_USER3: 707 - case VME_USER4: 708 - default: 709 - spin_unlock(&image->lock); 710 - dev_err(ca91cx42_bridge->parent, "Invalid address space\n"); 711 - retval = -EINVAL; 712 - goto err_aspace; 713 - break; 714 - } 715 - 716 - temp_ctl &= ~(CA91CX42_LSI_CTL_PGM_M | CA91CX42_LSI_CTL_SUPER_M); 717 - if (cycle & VME_SUPER) 718 - temp_ctl |= CA91CX42_LSI_CTL_SUPER_SUPR; 719 - if (cycle & VME_PROG) 720 - temp_ctl |= CA91CX42_LSI_CTL_PGM_PGM; 721 - 722 - /* Setup mapping */ 723 - iowrite32(pci_base, bridge->base + CA91CX42_LSI_BS[i]); 724 - iowrite32(pci_bound, bridge->base + CA91CX42_LSI_BD[i]); 725 - iowrite32(vme_offset, bridge->base + CA91CX42_LSI_TO[i]); 726 - 727 - /* Write ctl reg without enable */ 728 - iowrite32(temp_ctl, bridge->base + CA91CX42_LSI_CTL[i]); 729 - 730 - if (enabled) 731 - temp_ctl |= CA91CX42_LSI_CTL_EN; 732 - 733 - iowrite32(temp_ctl, bridge->base + CA91CX42_LSI_CTL[i]); 734 - 735 - spin_unlock(&image->lock); 736 - return 0; 737 - 738 - err_aspace: 739 - err_dwidth: 740 - ca91cx42_free_resource(image); 741 - err_res: 742 - err_window: 743 - return retval; 744 - } 745 - 746 - static int __ca91cx42_master_get(struct vme_master_resource *image, 747 - int *enabled, unsigned long long *vme_base, unsigned long long *size, 748 - u32 *aspace, u32 *cycle, u32 *dwidth) 749 - { 750 - unsigned int i, ctl; 751 - unsigned long long pci_base, pci_bound, vme_offset; 752 - struct ca91cx42_driver *bridge; 753 - 754 - bridge = image->parent->driver_priv; 755 - 756 - i = image->number; 757 - 758 - ctl = ioread32(bridge->base + CA91CX42_LSI_CTL[i]); 759 - 760 - pci_base = ioread32(bridge->base + CA91CX42_LSI_BS[i]); 761 - vme_offset = ioread32(bridge->base + CA91CX42_LSI_TO[i]); 762 - pci_bound = ioread32(bridge->base + CA91CX42_LSI_BD[i]); 763 - 764 - *vme_base = pci_base + vme_offset; 765 - *size = (unsigned long long)(pci_bound - pci_base); 766 - 767 - *enabled = 0; 768 - *aspace = 0; 769 - *cycle = 0; 770 - *dwidth = 0; 771 - 772 - if (ctl & CA91CX42_LSI_CTL_EN) 773 - *enabled = 1; 774 - 775 - /* Setup address space */ 776 - switch (ctl & CA91CX42_LSI_CTL_VAS_M) { 777 - case CA91CX42_LSI_CTL_VAS_A16: 778 - *aspace = VME_A16; 779 - break; 780 - case CA91CX42_LSI_CTL_VAS_A24: 781 - *aspace = VME_A24; 782 - break; 783 - case CA91CX42_LSI_CTL_VAS_A32: 784 - *aspace = VME_A32; 785 - break; 786 - case CA91CX42_LSI_CTL_VAS_CRCSR: 787 - *aspace = VME_CRCSR; 788 - break; 789 - case CA91CX42_LSI_CTL_VAS_USER1: 790 - *aspace = VME_USER1; 791 - break; 792 - case CA91CX42_LSI_CTL_VAS_USER2: 793 - *aspace = VME_USER2; 794 - break; 795 - } 796 - 797 - /* XXX Not sure howto check for MBLT */ 798 - /* Setup cycle types */ 799 - if (ctl & CA91CX42_LSI_CTL_VCT_BLT) 800 - *cycle |= VME_BLT; 801 - else 802 - *cycle |= VME_SCT; 803 - 804 - if (ctl & CA91CX42_LSI_CTL_SUPER_SUPR) 805 - *cycle |= VME_SUPER; 806 - else 807 - *cycle |= VME_USER; 808 - 809 - if (ctl & CA91CX42_LSI_CTL_PGM_PGM) 810 - *cycle = VME_PROG; 811 - else 812 - *cycle = VME_DATA; 813 - 814 - /* Setup data width */ 815 - switch (ctl & CA91CX42_LSI_CTL_VDW_M) { 816 - case CA91CX42_LSI_CTL_VDW_D8: 817 - *dwidth = VME_D8; 818 - break; 819 - case CA91CX42_LSI_CTL_VDW_D16: 820 - *dwidth = VME_D16; 821 - break; 822 - case CA91CX42_LSI_CTL_VDW_D32: 823 - *dwidth = VME_D32; 824 - break; 825 - case CA91CX42_LSI_CTL_VDW_D64: 826 - *dwidth = VME_D64; 827 - break; 828 - } 829 - 830 - return 0; 831 - } 832 - 833 - static int ca91cx42_master_get(struct vme_master_resource *image, int *enabled, 834 - unsigned long long *vme_base, unsigned long long *size, u32 *aspace, 835 - u32 *cycle, u32 *dwidth) 836 - { 837 - int retval; 838 - 839 - spin_lock(&image->lock); 840 - 841 - retval = __ca91cx42_master_get(image, enabled, vme_base, size, aspace, 842 - cycle, dwidth); 843 - 844 - spin_unlock(&image->lock); 845 - 846 - return retval; 847 - } 848 - 849 - static ssize_t ca91cx42_master_read(struct vme_master_resource *image, 850 - void *buf, size_t count, loff_t offset) 851 - { 852 - ssize_t retval; 853 - void __iomem *addr = image->kern_base + offset; 854 - unsigned int done = 0; 855 - unsigned int count32; 856 - 857 - if (count == 0) 858 - return 0; 859 - 860 - spin_lock(&image->lock); 861 - 862 - /* The following code handles VME address alignment. We cannot use 863 - * memcpy_xxx here because it may cut data transfers in to 8-bit 864 - * cycles when D16 or D32 cycles are required on the VME bus. 865 - * On the other hand, the bridge itself assures that the maximum data 866 - * cycle configured for the transfer is used and splits it 867 - * automatically for non-aligned addresses, so we don't want the 868 - * overhead of needlessly forcing small transfers for the entire cycle. 869 - */ 870 - if ((uintptr_t)addr & 0x1) { 871 - *(u8 *)buf = ioread8(addr); 872 - done += 1; 873 - if (done == count) 874 - goto out; 875 - } 876 - if ((uintptr_t)(addr + done) & 0x2) { 877 - if ((count - done) < 2) { 878 - *(u8 *)(buf + done) = ioread8(addr + done); 879 - done += 1; 880 - goto out; 881 - } else { 882 - *(u16 *)(buf + done) = ioread16(addr + done); 883 - done += 2; 884 - } 885 - } 886 - 887 - count32 = (count - done) & ~0x3; 888 - while (done < count32) { 889 - *(u32 *)(buf + done) = ioread32(addr + done); 890 - done += 4; 891 - } 892 - 893 - if ((count - done) & 0x2) { 894 - *(u16 *)(buf + done) = ioread16(addr + done); 895 - done += 2; 896 - } 897 - if ((count - done) & 0x1) { 898 - *(u8 *)(buf + done) = ioread8(addr + done); 899 - done += 1; 900 - } 901 - out: 902 - retval = count; 903 - spin_unlock(&image->lock); 904 - 905 - return retval; 906 - } 907 - 908 - static ssize_t ca91cx42_master_write(struct vme_master_resource *image, 909 - void *buf, size_t count, loff_t offset) 910 - { 911 - ssize_t retval; 912 - void __iomem *addr = image->kern_base + offset; 913 - unsigned int done = 0; 914 - unsigned int count32; 915 - 916 - if (count == 0) 917 - return 0; 918 - 919 - spin_lock(&image->lock); 920 - 921 - /* Here we apply for the same strategy we do in master_read 922 - * function in order to assure the correct cycles. 923 - */ 924 - if ((uintptr_t)addr & 0x1) { 925 - iowrite8(*(u8 *)buf, addr); 926 - done += 1; 927 - if (done == count) 928 - goto out; 929 - } 930 - if ((uintptr_t)(addr + done) & 0x2) { 931 - if ((count - done) < 2) { 932 - iowrite8(*(u8 *)(buf + done), addr + done); 933 - done += 1; 934 - goto out; 935 - } else { 936 - iowrite16(*(u16 *)(buf + done), addr + done); 937 - done += 2; 938 - } 939 - } 940 - 941 - count32 = (count - done) & ~0x3; 942 - while (done < count32) { 943 - iowrite32(*(u32 *)(buf + done), addr + done); 944 - done += 4; 945 - } 946 - 947 - if ((count - done) & 0x2) { 948 - iowrite16(*(u16 *)(buf + done), addr + done); 949 - done += 2; 950 - } 951 - if ((count - done) & 0x1) { 952 - iowrite8(*(u8 *)(buf + done), addr + done); 953 - done += 1; 954 - } 955 - out: 956 - retval = count; 957 - 958 - spin_unlock(&image->lock); 959 - 960 - return retval; 961 - } 962 - 963 - static unsigned int ca91cx42_master_rmw(struct vme_master_resource *image, 964 - unsigned int mask, unsigned int compare, unsigned int swap, 965 - loff_t offset) 966 - { 967 - u32 result; 968 - uintptr_t pci_addr; 969 - struct ca91cx42_driver *bridge; 970 - struct device *dev; 971 - 972 - bridge = image->parent->driver_priv; 973 - dev = image->parent->parent; 974 - 975 - /* Find the PCI address that maps to the desired VME address */ 976 - 977 - /* Locking as we can only do one of these at a time */ 978 - mutex_lock(&bridge->vme_rmw); 979 - 980 - /* Lock image */ 981 - spin_lock(&image->lock); 982 - 983 - pci_addr = (uintptr_t)image->kern_base + offset; 984 - 985 - /* Address must be 4-byte aligned */ 986 - if (pci_addr & 0x3) { 987 - dev_err(dev, "RMW Address not 4-byte aligned\n"); 988 - result = -EINVAL; 989 - goto out; 990 - } 991 - 992 - /* Ensure RMW Disabled whilst configuring */ 993 - iowrite32(0, bridge->base + SCYC_CTL); 994 - 995 - /* Configure registers */ 996 - iowrite32(mask, bridge->base + SCYC_EN); 997 - iowrite32(compare, bridge->base + SCYC_CMP); 998 - iowrite32(swap, bridge->base + SCYC_SWP); 999 - iowrite32(pci_addr, bridge->base + SCYC_ADDR); 1000 - 1001 - /* Enable RMW */ 1002 - iowrite32(CA91CX42_SCYC_CTL_CYC_RMW, bridge->base + SCYC_CTL); 1003 - 1004 - /* Kick process off with a read to the required address. */ 1005 - result = ioread32(image->kern_base + offset); 1006 - 1007 - /* Disable RMW */ 1008 - iowrite32(0, bridge->base + SCYC_CTL); 1009 - 1010 - out: 1011 - spin_unlock(&image->lock); 1012 - 1013 - mutex_unlock(&bridge->vme_rmw); 1014 - 1015 - return result; 1016 - } 1017 - 1018 - static int ca91cx42_dma_list_add(struct vme_dma_list *list, 1019 - struct vme_dma_attr *src, struct vme_dma_attr *dest, size_t count) 1020 - { 1021 - struct ca91cx42_dma_entry *entry, *prev; 1022 - struct vme_dma_pci *pci_attr; 1023 - struct vme_dma_vme *vme_attr; 1024 - dma_addr_t desc_ptr; 1025 - int retval = 0; 1026 - struct device *dev; 1027 - 1028 - dev = list->parent->parent->parent; 1029 - 1030 - /* XXX descriptor must be aligned on 64-bit boundaries */ 1031 - entry = kmalloc(sizeof(*entry), GFP_KERNEL); 1032 - if (!entry) { 1033 - retval = -ENOMEM; 1034 - goto err_mem; 1035 - } 1036 - 1037 - /* Test descriptor alignment */ 1038 - if ((unsigned long)&entry->descriptor & CA91CX42_DCPP_M) { 1039 - dev_err(dev, "Descriptor not aligned to 16 byte boundary as " 1040 - "required: %p\n", &entry->descriptor); 1041 - retval = -EINVAL; 1042 - goto err_align; 1043 - } 1044 - 1045 - memset(&entry->descriptor, 0, sizeof(entry->descriptor)); 1046 - 1047 - if (dest->type == VME_DMA_VME) { 1048 - entry->descriptor.dctl |= CA91CX42_DCTL_L2V; 1049 - vme_attr = dest->private; 1050 - pci_attr = src->private; 1051 - } else { 1052 - vme_attr = src->private; 1053 - pci_attr = dest->private; 1054 - } 1055 - 1056 - /* Check we can do fulfill required attributes */ 1057 - if ((vme_attr->aspace & ~(VME_A16 | VME_A24 | VME_A32 | VME_USER1 | 1058 - VME_USER2)) != 0) { 1059 - 1060 - dev_err(dev, "Unsupported cycle type\n"); 1061 - retval = -EINVAL; 1062 - goto err_aspace; 1063 - } 1064 - 1065 - if ((vme_attr->cycle & ~(VME_SCT | VME_BLT | VME_SUPER | VME_USER | 1066 - VME_PROG | VME_DATA)) != 0) { 1067 - 1068 - dev_err(dev, "Unsupported cycle type\n"); 1069 - retval = -EINVAL; 1070 - goto err_cycle; 1071 - } 1072 - 1073 - /* Check to see if we can fulfill source and destination */ 1074 - if (!(((src->type == VME_DMA_PCI) && (dest->type == VME_DMA_VME)) || 1075 - ((src->type == VME_DMA_VME) && (dest->type == VME_DMA_PCI)))) { 1076 - 1077 - dev_err(dev, "Cannot perform transfer with this " 1078 - "source-destination combination\n"); 1079 - retval = -EINVAL; 1080 - goto err_direct; 1081 - } 1082 - 1083 - /* Setup cycle types */ 1084 - if (vme_attr->cycle & VME_BLT) 1085 - entry->descriptor.dctl |= CA91CX42_DCTL_VCT_BLT; 1086 - 1087 - /* Setup data width */ 1088 - switch (vme_attr->dwidth) { 1089 - case VME_D8: 1090 - entry->descriptor.dctl |= CA91CX42_DCTL_VDW_D8; 1091 - break; 1092 - case VME_D16: 1093 - entry->descriptor.dctl |= CA91CX42_DCTL_VDW_D16; 1094 - break; 1095 - case VME_D32: 1096 - entry->descriptor.dctl |= CA91CX42_DCTL_VDW_D32; 1097 - break; 1098 - case VME_D64: 1099 - entry->descriptor.dctl |= CA91CX42_DCTL_VDW_D64; 1100 - break; 1101 - default: 1102 - dev_err(dev, "Invalid data width\n"); 1103 - return -EINVAL; 1104 - } 1105 - 1106 - /* Setup address space */ 1107 - switch (vme_attr->aspace) { 1108 - case VME_A16: 1109 - entry->descriptor.dctl |= CA91CX42_DCTL_VAS_A16; 1110 - break; 1111 - case VME_A24: 1112 - entry->descriptor.dctl |= CA91CX42_DCTL_VAS_A24; 1113 - break; 1114 - case VME_A32: 1115 - entry->descriptor.dctl |= CA91CX42_DCTL_VAS_A32; 1116 - break; 1117 - case VME_USER1: 1118 - entry->descriptor.dctl |= CA91CX42_DCTL_VAS_USER1; 1119 - break; 1120 - case VME_USER2: 1121 - entry->descriptor.dctl |= CA91CX42_DCTL_VAS_USER2; 1122 - break; 1123 - default: 1124 - dev_err(dev, "Invalid address space\n"); 1125 - return -EINVAL; 1126 - break; 1127 - } 1128 - 1129 - if (vme_attr->cycle & VME_SUPER) 1130 - entry->descriptor.dctl |= CA91CX42_DCTL_SUPER_SUPR; 1131 - if (vme_attr->cycle & VME_PROG) 1132 - entry->descriptor.dctl |= CA91CX42_DCTL_PGM_PGM; 1133 - 1134 - entry->descriptor.dtbc = count; 1135 - entry->descriptor.dla = pci_attr->address; 1136 - entry->descriptor.dva = vme_attr->address; 1137 - entry->descriptor.dcpp = CA91CX42_DCPP_NULL; 1138 - 1139 - /* Add to list */ 1140 - list_add_tail(&entry->list, &list->entries); 1141 - 1142 - /* Fill out previous descriptors "Next Address" */ 1143 - if (entry->list.prev != &list->entries) { 1144 - prev = list_entry(entry->list.prev, struct ca91cx42_dma_entry, 1145 - list); 1146 - /* We need the bus address for the pointer */ 1147 - desc_ptr = virt_to_bus(&entry->descriptor); 1148 - prev->descriptor.dcpp = desc_ptr & ~CA91CX42_DCPP_M; 1149 - } 1150 - 1151 - return 0; 1152 - 1153 - err_cycle: 1154 - err_aspace: 1155 - err_direct: 1156 - err_align: 1157 - kfree(entry); 1158 - err_mem: 1159 - return retval; 1160 - } 1161 - 1162 - static int ca91cx42_dma_busy(struct vme_bridge *ca91cx42_bridge) 1163 - { 1164 - u32 tmp; 1165 - struct ca91cx42_driver *bridge; 1166 - 1167 - bridge = ca91cx42_bridge->driver_priv; 1168 - 1169 - tmp = ioread32(bridge->base + DGCS); 1170 - 1171 - if (tmp & CA91CX42_DGCS_ACT) 1172 - return 0; 1173 - else 1174 - return 1; 1175 - } 1176 - 1177 - static int ca91cx42_dma_list_exec(struct vme_dma_list *list) 1178 - { 1179 - struct vme_dma_resource *ctrlr; 1180 - struct ca91cx42_dma_entry *entry; 1181 - int retval; 1182 - dma_addr_t bus_addr; 1183 - u32 val; 1184 - struct device *dev; 1185 - struct ca91cx42_driver *bridge; 1186 - 1187 - ctrlr = list->parent; 1188 - 1189 - bridge = ctrlr->parent->driver_priv; 1190 - dev = ctrlr->parent->parent; 1191 - 1192 - mutex_lock(&ctrlr->mtx); 1193 - 1194 - if (!(list_empty(&ctrlr->running))) { 1195 - /* 1196 - * XXX We have an active DMA transfer and currently haven't 1197 - * sorted out the mechanism for "pending" DMA transfers. 1198 - * Return busy. 1199 - */ 1200 - /* Need to add to pending here */ 1201 - mutex_unlock(&ctrlr->mtx); 1202 - return -EBUSY; 1203 - } else { 1204 - list_add(&list->list, &ctrlr->running); 1205 - } 1206 - 1207 - /* Get first bus address and write into registers */ 1208 - entry = list_first_entry(&list->entries, struct ca91cx42_dma_entry, 1209 - list); 1210 - 1211 - bus_addr = virt_to_bus(&entry->descriptor); 1212 - 1213 - mutex_unlock(&ctrlr->mtx); 1214 - 1215 - iowrite32(0, bridge->base + DTBC); 1216 - iowrite32(bus_addr & ~CA91CX42_DCPP_M, bridge->base + DCPP); 1217 - 1218 - /* Start the operation */ 1219 - val = ioread32(bridge->base + DGCS); 1220 - 1221 - /* XXX Could set VMEbus On and Off Counters here */ 1222 - val &= (CA91CX42_DGCS_VON_M | CA91CX42_DGCS_VOFF_M); 1223 - 1224 - val |= (CA91CX42_DGCS_CHAIN | CA91CX42_DGCS_STOP | CA91CX42_DGCS_HALT | 1225 - CA91CX42_DGCS_DONE | CA91CX42_DGCS_LERR | CA91CX42_DGCS_VERR | 1226 - CA91CX42_DGCS_PERR); 1227 - 1228 - iowrite32(val, bridge->base + DGCS); 1229 - 1230 - val |= CA91CX42_DGCS_GO; 1231 - 1232 - iowrite32(val, bridge->base + DGCS); 1233 - 1234 - retval = wait_event_interruptible(bridge->dma_queue, 1235 - ca91cx42_dma_busy(ctrlr->parent)); 1236 - 1237 - if (retval) { 1238 - val = ioread32(bridge->base + DGCS); 1239 - iowrite32(val | CA91CX42_DGCS_STOP_REQ, bridge->base + DGCS); 1240 - /* Wait for the operation to abort */ 1241 - wait_event(bridge->dma_queue, 1242 - ca91cx42_dma_busy(ctrlr->parent)); 1243 - retval = -EINTR; 1244 - goto exit; 1245 - } 1246 - 1247 - /* 1248 - * Read status register, this register is valid until we kick off a 1249 - * new transfer. 1250 - */ 1251 - val = ioread32(bridge->base + DGCS); 1252 - 1253 - if (val & (CA91CX42_DGCS_LERR | CA91CX42_DGCS_VERR | 1254 - CA91CX42_DGCS_PERR)) { 1255 - 1256 - dev_err(dev, "ca91c042: DMA Error. DGCS=%08X\n", val); 1257 - val = ioread32(bridge->base + DCTL); 1258 - retval = -EIO; 1259 - } 1260 - 1261 - exit: 1262 - /* Remove list from running list */ 1263 - mutex_lock(&ctrlr->mtx); 1264 - list_del(&list->list); 1265 - mutex_unlock(&ctrlr->mtx); 1266 - 1267 - return retval; 1268 - 1269 - } 1270 - 1271 - static int ca91cx42_dma_list_empty(struct vme_dma_list *list) 1272 - { 1273 - struct list_head *pos, *temp; 1274 - struct ca91cx42_dma_entry *entry; 1275 - 1276 - /* detach and free each entry */ 1277 - list_for_each_safe(pos, temp, &list->entries) { 1278 - list_del(pos); 1279 - entry = list_entry(pos, struct ca91cx42_dma_entry, list); 1280 - kfree(entry); 1281 - } 1282 - 1283 - return 0; 1284 - } 1285 - 1286 - /* 1287 - * All 4 location monitors reside at the same base - this is therefore a 1288 - * system wide configuration. 1289 - * 1290 - * This does not enable the LM monitor - that should be done when the first 1291 - * callback is attached and disabled when the last callback is removed. 1292 - */ 1293 - static int ca91cx42_lm_set(struct vme_lm_resource *lm, 1294 - unsigned long long lm_base, u32 aspace, u32 cycle) 1295 - { 1296 - u32 temp_base, lm_ctl = 0; 1297 - int i; 1298 - struct ca91cx42_driver *bridge; 1299 - struct device *dev; 1300 - 1301 - bridge = lm->parent->driver_priv; 1302 - dev = lm->parent->parent; 1303 - 1304 - /* Check the alignment of the location monitor */ 1305 - temp_base = (u32)lm_base; 1306 - if (temp_base & 0xffff) { 1307 - dev_err(dev, "Location monitor must be aligned to 64KB " 1308 - "boundary"); 1309 - return -EINVAL; 1310 - } 1311 - 1312 - mutex_lock(&lm->mtx); 1313 - 1314 - /* If we already have a callback attached, we can't move it! */ 1315 - for (i = 0; i < lm->monitors; i++) { 1316 - if (bridge->lm_callback[i]) { 1317 - mutex_unlock(&lm->mtx); 1318 - dev_err(dev, "Location monitor callback attached, " 1319 - "can't reset\n"); 1320 - return -EBUSY; 1321 - } 1322 - } 1323 - 1324 - switch (aspace) { 1325 - case VME_A16: 1326 - lm_ctl |= CA91CX42_LM_CTL_AS_A16; 1327 - break; 1328 - case VME_A24: 1329 - lm_ctl |= CA91CX42_LM_CTL_AS_A24; 1330 - break; 1331 - case VME_A32: 1332 - lm_ctl |= CA91CX42_LM_CTL_AS_A32; 1333 - break; 1334 - default: 1335 - mutex_unlock(&lm->mtx); 1336 - dev_err(dev, "Invalid address space\n"); 1337 - return -EINVAL; 1338 - break; 1339 - } 1340 - 1341 - if (cycle & VME_SUPER) 1342 - lm_ctl |= CA91CX42_LM_CTL_SUPR; 1343 - if (cycle & VME_USER) 1344 - lm_ctl |= CA91CX42_LM_CTL_NPRIV; 1345 - if (cycle & VME_PROG) 1346 - lm_ctl |= CA91CX42_LM_CTL_PGM; 1347 - if (cycle & VME_DATA) 1348 - lm_ctl |= CA91CX42_LM_CTL_DATA; 1349 - 1350 - iowrite32(lm_base, bridge->base + LM_BS); 1351 - iowrite32(lm_ctl, bridge->base + LM_CTL); 1352 - 1353 - mutex_unlock(&lm->mtx); 1354 - 1355 - return 0; 1356 - } 1357 - 1358 - /* Get configuration of the callback monitor and return whether it is enabled 1359 - * or disabled. 1360 - */ 1361 - static int ca91cx42_lm_get(struct vme_lm_resource *lm, 1362 - unsigned long long *lm_base, u32 *aspace, u32 *cycle) 1363 - { 1364 - u32 lm_ctl, enabled = 0; 1365 - struct ca91cx42_driver *bridge; 1366 - 1367 - bridge = lm->parent->driver_priv; 1368 - 1369 - mutex_lock(&lm->mtx); 1370 - 1371 - *lm_base = (unsigned long long)ioread32(bridge->base + LM_BS); 1372 - lm_ctl = ioread32(bridge->base + LM_CTL); 1373 - 1374 - if (lm_ctl & CA91CX42_LM_CTL_EN) 1375 - enabled = 1; 1376 - 1377 - if ((lm_ctl & CA91CX42_LM_CTL_AS_M) == CA91CX42_LM_CTL_AS_A16) 1378 - *aspace = VME_A16; 1379 - if ((lm_ctl & CA91CX42_LM_CTL_AS_M) == CA91CX42_LM_CTL_AS_A24) 1380 - *aspace = VME_A24; 1381 - if ((lm_ctl & CA91CX42_LM_CTL_AS_M) == CA91CX42_LM_CTL_AS_A32) 1382 - *aspace = VME_A32; 1383 - 1384 - *cycle = 0; 1385 - if (lm_ctl & CA91CX42_LM_CTL_SUPR) 1386 - *cycle |= VME_SUPER; 1387 - if (lm_ctl & CA91CX42_LM_CTL_NPRIV) 1388 - *cycle |= VME_USER; 1389 - if (lm_ctl & CA91CX42_LM_CTL_PGM) 1390 - *cycle |= VME_PROG; 1391 - if (lm_ctl & CA91CX42_LM_CTL_DATA) 1392 - *cycle |= VME_DATA; 1393 - 1394 - mutex_unlock(&lm->mtx); 1395 - 1396 - return enabled; 1397 - } 1398 - 1399 - /* 1400 - * Attach a callback to a specific location monitor. 1401 - * 1402 - * Callback will be passed the monitor triggered. 1403 - */ 1404 - static int ca91cx42_lm_attach(struct vme_lm_resource *lm, int monitor, 1405 - void (*callback)(void *), void *data) 1406 - { 1407 - u32 lm_ctl, tmp; 1408 - struct ca91cx42_driver *bridge; 1409 - struct device *dev; 1410 - 1411 - bridge = lm->parent->driver_priv; 1412 - dev = lm->parent->parent; 1413 - 1414 - mutex_lock(&lm->mtx); 1415 - 1416 - /* Ensure that the location monitor is configured - need PGM or DATA */ 1417 - lm_ctl = ioread32(bridge->base + LM_CTL); 1418 - if ((lm_ctl & (CA91CX42_LM_CTL_PGM | CA91CX42_LM_CTL_DATA)) == 0) { 1419 - mutex_unlock(&lm->mtx); 1420 - dev_err(dev, "Location monitor not properly configured\n"); 1421 - return -EINVAL; 1422 - } 1423 - 1424 - /* Check that a callback isn't already attached */ 1425 - if (bridge->lm_callback[monitor]) { 1426 - mutex_unlock(&lm->mtx); 1427 - dev_err(dev, "Existing callback attached\n"); 1428 - return -EBUSY; 1429 - } 1430 - 1431 - /* Attach callback */ 1432 - bridge->lm_callback[monitor] = callback; 1433 - bridge->lm_data[monitor] = data; 1434 - 1435 - /* Enable Location Monitor interrupt */ 1436 - tmp = ioread32(bridge->base + LINT_EN); 1437 - tmp |= CA91CX42_LINT_LM[monitor]; 1438 - iowrite32(tmp, bridge->base + LINT_EN); 1439 - 1440 - /* Ensure that global Location Monitor Enable set */ 1441 - if ((lm_ctl & CA91CX42_LM_CTL_EN) == 0) { 1442 - lm_ctl |= CA91CX42_LM_CTL_EN; 1443 - iowrite32(lm_ctl, bridge->base + LM_CTL); 1444 - } 1445 - 1446 - mutex_unlock(&lm->mtx); 1447 - 1448 - return 0; 1449 - } 1450 - 1451 - /* 1452 - * Detach a callback function forn a specific location monitor. 1453 - */ 1454 - static int ca91cx42_lm_detach(struct vme_lm_resource *lm, int monitor) 1455 - { 1456 - u32 tmp; 1457 - struct ca91cx42_driver *bridge; 1458 - 1459 - bridge = lm->parent->driver_priv; 1460 - 1461 - mutex_lock(&lm->mtx); 1462 - 1463 - /* Disable Location Monitor and ensure previous interrupts are clear */ 1464 - tmp = ioread32(bridge->base + LINT_EN); 1465 - tmp &= ~CA91CX42_LINT_LM[monitor]; 1466 - iowrite32(tmp, bridge->base + LINT_EN); 1467 - 1468 - iowrite32(CA91CX42_LINT_LM[monitor], 1469 - bridge->base + LINT_STAT); 1470 - 1471 - /* Detach callback */ 1472 - bridge->lm_callback[monitor] = NULL; 1473 - bridge->lm_data[monitor] = NULL; 1474 - 1475 - /* If all location monitors disabled, disable global Location Monitor */ 1476 - if ((tmp & (CA91CX42_LINT_LM0 | CA91CX42_LINT_LM1 | CA91CX42_LINT_LM2 | 1477 - CA91CX42_LINT_LM3)) == 0) { 1478 - tmp = ioread32(bridge->base + LM_CTL); 1479 - tmp &= ~CA91CX42_LM_CTL_EN; 1480 - iowrite32(tmp, bridge->base + LM_CTL); 1481 - } 1482 - 1483 - mutex_unlock(&lm->mtx); 1484 - 1485 - return 0; 1486 - } 1487 - 1488 - static int ca91cx42_slot_get(struct vme_bridge *ca91cx42_bridge) 1489 - { 1490 - u32 slot = 0; 1491 - struct ca91cx42_driver *bridge; 1492 - 1493 - bridge = ca91cx42_bridge->driver_priv; 1494 - 1495 - if (!geoid) { 1496 - slot = ioread32(bridge->base + VCSR_BS); 1497 - slot = ((slot & CA91CX42_VCSR_BS_SLOT_M) >> 27); 1498 - } else 1499 - slot = geoid; 1500 - 1501 - return (int)slot; 1502 - 1503 - } 1504 - 1505 - static void *ca91cx42_alloc_consistent(struct device *parent, size_t size, 1506 - dma_addr_t *dma) 1507 - { 1508 - struct pci_dev *pdev; 1509 - 1510 - /* Find pci_dev container of dev */ 1511 - pdev = to_pci_dev(parent); 1512 - 1513 - return dma_alloc_coherent(&pdev->dev, size, dma, GFP_KERNEL); 1514 - } 1515 - 1516 - static void ca91cx42_free_consistent(struct device *parent, size_t size, 1517 - void *vaddr, dma_addr_t dma) 1518 - { 1519 - struct pci_dev *pdev; 1520 - 1521 - /* Find pci_dev container of dev */ 1522 - pdev = to_pci_dev(parent); 1523 - 1524 - dma_free_coherent(&pdev->dev, size, vaddr, dma); 1525 - } 1526 - 1527 - /* 1528 - * Configure CR/CSR space 1529 - * 1530 - * Access to the CR/CSR can be configured at power-up. The location of the 1531 - * CR/CSR registers in the CR/CSR address space is determined by the boards 1532 - * Auto-ID or Geographic address. This function ensures that the window is 1533 - * enabled at an offset consistent with the boards geopgraphic address. 1534 - */ 1535 - static int ca91cx42_crcsr_init(struct vme_bridge *ca91cx42_bridge, 1536 - struct pci_dev *pdev) 1537 - { 1538 - unsigned int crcsr_addr; 1539 - int tmp, slot; 1540 - struct ca91cx42_driver *bridge; 1541 - 1542 - bridge = ca91cx42_bridge->driver_priv; 1543 - 1544 - slot = ca91cx42_slot_get(ca91cx42_bridge); 1545 - 1546 - /* Write CSR Base Address if slot ID is supplied as a module param */ 1547 - if (geoid) 1548 - iowrite32(geoid << 27, bridge->base + VCSR_BS); 1549 - 1550 - dev_info(&pdev->dev, "CR/CSR Offset: %d\n", slot); 1551 - if (slot == 0) { 1552 - dev_err(&pdev->dev, "Slot number is unset, not configuring " 1553 - "CR/CSR space\n"); 1554 - return -EINVAL; 1555 - } 1556 - 1557 - /* Allocate mem for CR/CSR image */ 1558 - bridge->crcsr_kernel = dma_alloc_coherent(&pdev->dev, 1559 - VME_CRCSR_BUF_SIZE, 1560 - &bridge->crcsr_bus, GFP_KERNEL); 1561 - if (!bridge->crcsr_kernel) { 1562 - dev_err(&pdev->dev, "Failed to allocate memory for CR/CSR " 1563 - "image\n"); 1564 - return -ENOMEM; 1565 - } 1566 - 1567 - crcsr_addr = slot * (512 * 1024); 1568 - iowrite32(bridge->crcsr_bus - crcsr_addr, bridge->base + VCSR_TO); 1569 - 1570 - tmp = ioread32(bridge->base + VCSR_CTL); 1571 - tmp |= CA91CX42_VCSR_CTL_EN; 1572 - iowrite32(tmp, bridge->base + VCSR_CTL); 1573 - 1574 - return 0; 1575 - } 1576 - 1577 - static void ca91cx42_crcsr_exit(struct vme_bridge *ca91cx42_bridge, 1578 - struct pci_dev *pdev) 1579 - { 1580 - u32 tmp; 1581 - struct ca91cx42_driver *bridge; 1582 - 1583 - bridge = ca91cx42_bridge->driver_priv; 1584 - 1585 - /* Turn off CR/CSR space */ 1586 - tmp = ioread32(bridge->base + VCSR_CTL); 1587 - tmp &= ~CA91CX42_VCSR_CTL_EN; 1588 - iowrite32(tmp, bridge->base + VCSR_CTL); 1589 - 1590 - /* Free image */ 1591 - iowrite32(0, bridge->base + VCSR_TO); 1592 - 1593 - dma_free_coherent(&pdev->dev, VME_CRCSR_BUF_SIZE, 1594 - bridge->crcsr_kernel, bridge->crcsr_bus); 1595 - } 1596 - 1597 - static int ca91cx42_probe(struct pci_dev *pdev, const struct pci_device_id *id) 1598 - { 1599 - int retval, i; 1600 - u32 data; 1601 - struct list_head *pos = NULL, *n; 1602 - struct vme_bridge *ca91cx42_bridge; 1603 - struct ca91cx42_driver *ca91cx42_device; 1604 - struct vme_master_resource *master_image; 1605 - struct vme_slave_resource *slave_image; 1606 - struct vme_dma_resource *dma_ctrlr; 1607 - struct vme_lm_resource *lm; 1608 - 1609 - /* We want to support more than one of each bridge so we need to 1610 - * dynamically allocate the bridge structure 1611 - */ 1612 - ca91cx42_bridge = kzalloc(sizeof(*ca91cx42_bridge), GFP_KERNEL); 1613 - if (!ca91cx42_bridge) { 1614 - retval = -ENOMEM; 1615 - goto err_struct; 1616 - } 1617 - vme_init_bridge(ca91cx42_bridge); 1618 - 1619 - ca91cx42_device = kzalloc(sizeof(*ca91cx42_device), GFP_KERNEL); 1620 - if (!ca91cx42_device) { 1621 - retval = -ENOMEM; 1622 - goto err_driver; 1623 - } 1624 - 1625 - ca91cx42_bridge->driver_priv = ca91cx42_device; 1626 - 1627 - /* Enable the device */ 1628 - retval = pci_enable_device(pdev); 1629 - if (retval) { 1630 - dev_err(&pdev->dev, "Unable to enable device\n"); 1631 - goto err_enable; 1632 - } 1633 - 1634 - /* Map Registers */ 1635 - retval = pci_request_regions(pdev, driver_name); 1636 - if (retval) { 1637 - dev_err(&pdev->dev, "Unable to reserve resources\n"); 1638 - goto err_resource; 1639 - } 1640 - 1641 - /* map registers in BAR 0 */ 1642 - ca91cx42_device->base = ioremap(pci_resource_start(pdev, 0), 1643 - 4096); 1644 - if (!ca91cx42_device->base) { 1645 - dev_err(&pdev->dev, "Unable to remap CRG region\n"); 1646 - retval = -EIO; 1647 - goto err_remap; 1648 - } 1649 - 1650 - /* Check to see if the mapping worked out */ 1651 - data = ioread32(ca91cx42_device->base + CA91CX42_PCI_ID) & 0x0000FFFF; 1652 - if (data != PCI_VENDOR_ID_TUNDRA) { 1653 - dev_err(&pdev->dev, "PCI_ID check failed\n"); 1654 - retval = -EIO; 1655 - goto err_test; 1656 - } 1657 - 1658 - /* Initialize wait queues & mutual exclusion flags */ 1659 - init_waitqueue_head(&ca91cx42_device->dma_queue); 1660 - init_waitqueue_head(&ca91cx42_device->iack_queue); 1661 - mutex_init(&ca91cx42_device->vme_int); 1662 - mutex_init(&ca91cx42_device->vme_rmw); 1663 - 1664 - ca91cx42_bridge->parent = &pdev->dev; 1665 - strcpy(ca91cx42_bridge->name, driver_name); 1666 - 1667 - /* Setup IRQ */ 1668 - retval = ca91cx42_irq_init(ca91cx42_bridge); 1669 - if (retval != 0) { 1670 - dev_err(&pdev->dev, "Chip Initialization failed.\n"); 1671 - goto err_irq; 1672 - } 1673 - 1674 - /* Add master windows to list */ 1675 - for (i = 0; i < CA91C142_MAX_MASTER; i++) { 1676 - master_image = kmalloc(sizeof(*master_image), GFP_KERNEL); 1677 - if (!master_image) { 1678 - retval = -ENOMEM; 1679 - goto err_master; 1680 - } 1681 - master_image->parent = ca91cx42_bridge; 1682 - spin_lock_init(&master_image->lock); 1683 - master_image->locked = 0; 1684 - master_image->number = i; 1685 - master_image->address_attr = VME_A16 | VME_A24 | VME_A32 | 1686 - VME_CRCSR | VME_USER1 | VME_USER2; 1687 - master_image->cycle_attr = VME_SCT | VME_BLT | VME_MBLT | 1688 - VME_SUPER | VME_USER | VME_PROG | VME_DATA; 1689 - master_image->width_attr = VME_D8 | VME_D16 | VME_D32 | VME_D64; 1690 - memset(&master_image->bus_resource, 0, 1691 - sizeof(master_image->bus_resource)); 1692 - master_image->kern_base = NULL; 1693 - list_add_tail(&master_image->list, 1694 - &ca91cx42_bridge->master_resources); 1695 - } 1696 - 1697 - /* Add slave windows to list */ 1698 - for (i = 0; i < CA91C142_MAX_SLAVE; i++) { 1699 - slave_image = kmalloc(sizeof(*slave_image), GFP_KERNEL); 1700 - if (!slave_image) { 1701 - retval = -ENOMEM; 1702 - goto err_slave; 1703 - } 1704 - slave_image->parent = ca91cx42_bridge; 1705 - mutex_init(&slave_image->mtx); 1706 - slave_image->locked = 0; 1707 - slave_image->number = i; 1708 - slave_image->address_attr = VME_A24 | VME_A32 | VME_USER1 | 1709 - VME_USER2; 1710 - 1711 - /* Only windows 0 and 4 support A16 */ 1712 - if (i == 0 || i == 4) 1713 - slave_image->address_attr |= VME_A16; 1714 - 1715 - slave_image->cycle_attr = VME_SCT | VME_BLT | VME_MBLT | 1716 - VME_SUPER | VME_USER | VME_PROG | VME_DATA; 1717 - list_add_tail(&slave_image->list, 1718 - &ca91cx42_bridge->slave_resources); 1719 - } 1720 - 1721 - /* Add dma engines to list */ 1722 - for (i = 0; i < CA91C142_MAX_DMA; i++) { 1723 - dma_ctrlr = kmalloc(sizeof(*dma_ctrlr), GFP_KERNEL); 1724 - if (!dma_ctrlr) { 1725 - retval = -ENOMEM; 1726 - goto err_dma; 1727 - } 1728 - dma_ctrlr->parent = ca91cx42_bridge; 1729 - mutex_init(&dma_ctrlr->mtx); 1730 - dma_ctrlr->locked = 0; 1731 - dma_ctrlr->number = i; 1732 - dma_ctrlr->route_attr = VME_DMA_VME_TO_MEM | 1733 - VME_DMA_MEM_TO_VME; 1734 - INIT_LIST_HEAD(&dma_ctrlr->pending); 1735 - INIT_LIST_HEAD(&dma_ctrlr->running); 1736 - list_add_tail(&dma_ctrlr->list, 1737 - &ca91cx42_bridge->dma_resources); 1738 - } 1739 - 1740 - /* Add location monitor to list */ 1741 - lm = kmalloc(sizeof(*lm), GFP_KERNEL); 1742 - if (!lm) { 1743 - retval = -ENOMEM; 1744 - goto err_lm; 1745 - } 1746 - lm->parent = ca91cx42_bridge; 1747 - mutex_init(&lm->mtx); 1748 - lm->locked = 0; 1749 - lm->number = 1; 1750 - lm->monitors = 4; 1751 - list_add_tail(&lm->list, &ca91cx42_bridge->lm_resources); 1752 - 1753 - ca91cx42_bridge->slave_get = ca91cx42_slave_get; 1754 - ca91cx42_bridge->slave_set = ca91cx42_slave_set; 1755 - ca91cx42_bridge->master_get = ca91cx42_master_get; 1756 - ca91cx42_bridge->master_set = ca91cx42_master_set; 1757 - ca91cx42_bridge->master_read = ca91cx42_master_read; 1758 - ca91cx42_bridge->master_write = ca91cx42_master_write; 1759 - ca91cx42_bridge->master_rmw = ca91cx42_master_rmw; 1760 - ca91cx42_bridge->dma_list_add = ca91cx42_dma_list_add; 1761 - ca91cx42_bridge->dma_list_exec = ca91cx42_dma_list_exec; 1762 - ca91cx42_bridge->dma_list_empty = ca91cx42_dma_list_empty; 1763 - ca91cx42_bridge->irq_set = ca91cx42_irq_set; 1764 - ca91cx42_bridge->irq_generate = ca91cx42_irq_generate; 1765 - ca91cx42_bridge->lm_set = ca91cx42_lm_set; 1766 - ca91cx42_bridge->lm_get = ca91cx42_lm_get; 1767 - ca91cx42_bridge->lm_attach = ca91cx42_lm_attach; 1768 - ca91cx42_bridge->lm_detach = ca91cx42_lm_detach; 1769 - ca91cx42_bridge->slot_get = ca91cx42_slot_get; 1770 - ca91cx42_bridge->alloc_consistent = ca91cx42_alloc_consistent; 1771 - ca91cx42_bridge->free_consistent = ca91cx42_free_consistent; 1772 - 1773 - data = ioread32(ca91cx42_device->base + MISC_CTL); 1774 - dev_info(&pdev->dev, "Board is%s the VME system controller\n", 1775 - (data & CA91CX42_MISC_CTL_SYSCON) ? "" : " not"); 1776 - dev_info(&pdev->dev, "Slot ID is %d\n", 1777 - ca91cx42_slot_get(ca91cx42_bridge)); 1778 - 1779 - if (ca91cx42_crcsr_init(ca91cx42_bridge, pdev)) 1780 - dev_err(&pdev->dev, "CR/CSR configuration failed.\n"); 1781 - 1782 - /* Need to save ca91cx42_bridge pointer locally in link list for use in 1783 - * ca91cx42_remove() 1784 - */ 1785 - retval = vme_register_bridge(ca91cx42_bridge); 1786 - if (retval != 0) { 1787 - dev_err(&pdev->dev, "Chip Registration failed.\n"); 1788 - goto err_reg; 1789 - } 1790 - 1791 - pci_set_drvdata(pdev, ca91cx42_bridge); 1792 - 1793 - return 0; 1794 - 1795 - err_reg: 1796 - ca91cx42_crcsr_exit(ca91cx42_bridge, pdev); 1797 - err_lm: 1798 - /* resources are stored in link list */ 1799 - list_for_each_safe(pos, n, &ca91cx42_bridge->lm_resources) { 1800 - lm = list_entry(pos, struct vme_lm_resource, list); 1801 - list_del(pos); 1802 - kfree(lm); 1803 - } 1804 - err_dma: 1805 - /* resources are stored in link list */ 1806 - list_for_each_safe(pos, n, &ca91cx42_bridge->dma_resources) { 1807 - dma_ctrlr = list_entry(pos, struct vme_dma_resource, list); 1808 - list_del(pos); 1809 - kfree(dma_ctrlr); 1810 - } 1811 - err_slave: 1812 - /* resources are stored in link list */ 1813 - list_for_each_safe(pos, n, &ca91cx42_bridge->slave_resources) { 1814 - slave_image = list_entry(pos, struct vme_slave_resource, list); 1815 - list_del(pos); 1816 - kfree(slave_image); 1817 - } 1818 - err_master: 1819 - /* resources are stored in link list */ 1820 - list_for_each_safe(pos, n, &ca91cx42_bridge->master_resources) { 1821 - master_image = list_entry(pos, struct vme_master_resource, 1822 - list); 1823 - list_del(pos); 1824 - kfree(master_image); 1825 - } 1826 - 1827 - ca91cx42_irq_exit(ca91cx42_device, pdev); 1828 - err_irq: 1829 - err_test: 1830 - iounmap(ca91cx42_device->base); 1831 - err_remap: 1832 - pci_release_regions(pdev); 1833 - err_resource: 1834 - pci_disable_device(pdev); 1835 - err_enable: 1836 - kfree(ca91cx42_device); 1837 - err_driver: 1838 - kfree(ca91cx42_bridge); 1839 - err_struct: 1840 - return retval; 1841 - 1842 - } 1843 - 1844 - static void ca91cx42_remove(struct pci_dev *pdev) 1845 - { 1846 - struct list_head *pos = NULL, *n; 1847 - struct vme_master_resource *master_image; 1848 - struct vme_slave_resource *slave_image; 1849 - struct vme_dma_resource *dma_ctrlr; 1850 - struct vme_lm_resource *lm; 1851 - struct ca91cx42_driver *bridge; 1852 - struct vme_bridge *ca91cx42_bridge = pci_get_drvdata(pdev); 1853 - 1854 - bridge = ca91cx42_bridge->driver_priv; 1855 - 1856 - 1857 - /* Turn off Ints */ 1858 - iowrite32(0, bridge->base + LINT_EN); 1859 - 1860 - /* Turn off the windows */ 1861 - iowrite32(0x00800000, bridge->base + LSI0_CTL); 1862 - iowrite32(0x00800000, bridge->base + LSI1_CTL); 1863 - iowrite32(0x00800000, bridge->base + LSI2_CTL); 1864 - iowrite32(0x00800000, bridge->base + LSI3_CTL); 1865 - iowrite32(0x00800000, bridge->base + LSI4_CTL); 1866 - iowrite32(0x00800000, bridge->base + LSI5_CTL); 1867 - iowrite32(0x00800000, bridge->base + LSI6_CTL); 1868 - iowrite32(0x00800000, bridge->base + LSI7_CTL); 1869 - iowrite32(0x00F00000, bridge->base + VSI0_CTL); 1870 - iowrite32(0x00F00000, bridge->base + VSI1_CTL); 1871 - iowrite32(0x00F00000, bridge->base + VSI2_CTL); 1872 - iowrite32(0x00F00000, bridge->base + VSI3_CTL); 1873 - iowrite32(0x00F00000, bridge->base + VSI4_CTL); 1874 - iowrite32(0x00F00000, bridge->base + VSI5_CTL); 1875 - iowrite32(0x00F00000, bridge->base + VSI6_CTL); 1876 - iowrite32(0x00F00000, bridge->base + VSI7_CTL); 1877 - 1878 - vme_unregister_bridge(ca91cx42_bridge); 1879 - 1880 - ca91cx42_crcsr_exit(ca91cx42_bridge, pdev); 1881 - 1882 - /* resources are stored in link list */ 1883 - list_for_each_safe(pos, n, &ca91cx42_bridge->lm_resources) { 1884 - lm = list_entry(pos, struct vme_lm_resource, list); 1885 - list_del(pos); 1886 - kfree(lm); 1887 - } 1888 - 1889 - /* resources are stored in link list */ 1890 - list_for_each_safe(pos, n, &ca91cx42_bridge->dma_resources) { 1891 - dma_ctrlr = list_entry(pos, struct vme_dma_resource, list); 1892 - list_del(pos); 1893 - kfree(dma_ctrlr); 1894 - } 1895 - 1896 - /* resources are stored in link list */ 1897 - list_for_each_safe(pos, n, &ca91cx42_bridge->slave_resources) { 1898 - slave_image = list_entry(pos, struct vme_slave_resource, list); 1899 - list_del(pos); 1900 - kfree(slave_image); 1901 - } 1902 - 1903 - /* resources are stored in link list */ 1904 - list_for_each_safe(pos, n, &ca91cx42_bridge->master_resources) { 1905 - master_image = list_entry(pos, struct vme_master_resource, 1906 - list); 1907 - list_del(pos); 1908 - kfree(master_image); 1909 - } 1910 - 1911 - ca91cx42_irq_exit(bridge, pdev); 1912 - 1913 - iounmap(bridge->base); 1914 - 1915 - pci_release_regions(pdev); 1916 - 1917 - pci_disable_device(pdev); 1918 - 1919 - kfree(ca91cx42_bridge); 1920 - } 1921 - 1922 - module_pci_driver(ca91cx42_driver); 1923 - 1924 - MODULE_PARM_DESC(geoid, "Override geographical addressing"); 1925 - module_param(geoid, int, 0); 1926 - 1927 - MODULE_DESCRIPTION("VME driver for the Tundra Universe II VME bridge"); 1928 - MODULE_LICENSE("GPL");
-579
drivers/vme/bridges/vme_ca91cx42.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 - /* 3 - * ca91c042.h 4 - * 5 - * Support for the Tundra Universe 1 and Universe II VME bridge chips 6 - * 7 - * Author: Tom Armistead 8 - * Updated by Ajit Prem 9 - * Copyright 2004 Motorola Inc. 10 - * 11 - * Further updated by Martyn Welch <martyn.welch@ge.com> 12 - * Copyright 2009 GE Intelligent Platforms Embedded Systems, Inc. 13 - * 14 - * Derived from ca91c042.h by Michael Wyrick 15 - */ 16 - 17 - #ifndef _CA91CX42_H 18 - #define _CA91CX42_H 19 - 20 - #ifndef PCI_VENDOR_ID_TUNDRA 21 - #define PCI_VENDOR_ID_TUNDRA 0x10e3 22 - #endif 23 - 24 - #ifndef PCI_DEVICE_ID_TUNDRA_CA91C142 25 - #define PCI_DEVICE_ID_TUNDRA_CA91C142 0x0000 26 - #endif 27 - 28 - /* 29 - * Define the number of each that the CA91C142 supports. 30 - */ 31 - #define CA91C142_MAX_MASTER 8 /* Max Master Windows */ 32 - #define CA91C142_MAX_SLAVE 8 /* Max Slave Windows */ 33 - #define CA91C142_MAX_DMA 1 /* Max DMA Controllers */ 34 - #define CA91C142_MAX_MAILBOX 4 /* Max Mail Box registers */ 35 - 36 - /* Structure used to hold driver specific information */ 37 - struct ca91cx42_driver { 38 - void __iomem *base; /* Base Address of device registers */ 39 - wait_queue_head_t dma_queue; 40 - wait_queue_head_t iack_queue; 41 - wait_queue_head_t mbox_queue; 42 - void (*lm_callback[4])(void *); /* Called in interrupt handler */ 43 - void *lm_data[4]; 44 - void *crcsr_kernel; 45 - dma_addr_t crcsr_bus; 46 - struct mutex vme_rmw; /* Only one RMW cycle at a time */ 47 - struct mutex vme_int; /* 48 - * Only one VME interrupt can be 49 - * generated at a time, provide locking 50 - */ 51 - }; 52 - 53 - /* See Page 2-77 in the Universe User Manual */ 54 - struct ca91cx42_dma_descriptor { 55 - unsigned int dctl; /* DMA Control */ 56 - unsigned int dtbc; /* Transfer Byte Count */ 57 - unsigned int dla; /* PCI Address */ 58 - unsigned int res1; /* Reserved */ 59 - unsigned int dva; /* Vme Address */ 60 - unsigned int res2; /* Reserved */ 61 - unsigned int dcpp; /* Pointer to Numed Cmd Packet with rPN */ 62 - unsigned int res3; /* Reserved */ 63 - }; 64 - 65 - struct ca91cx42_dma_entry { 66 - struct ca91cx42_dma_descriptor descriptor; 67 - struct list_head list; 68 - }; 69 - 70 - /* Universe Register Offsets */ 71 - /* general PCI configuration registers */ 72 - #define CA91CX42_PCI_ID 0x000 73 - #define CA91CX42_PCI_CSR 0x004 74 - #define CA91CX42_PCI_CLASS 0x008 75 - #define CA91CX42_PCI_MISC0 0x00C 76 - #define CA91CX42_PCI_BS 0x010 77 - #define CA91CX42_PCI_MISC1 0x03C 78 - 79 - #define LSI0_CTL 0x0100 80 - #define LSI0_BS 0x0104 81 - #define LSI0_BD 0x0108 82 - #define LSI0_TO 0x010C 83 - 84 - #define LSI1_CTL 0x0114 85 - #define LSI1_BS 0x0118 86 - #define LSI1_BD 0x011C 87 - #define LSI1_TO 0x0120 88 - 89 - #define LSI2_CTL 0x0128 90 - #define LSI2_BS 0x012C 91 - #define LSI2_BD 0x0130 92 - #define LSI2_TO 0x0134 93 - 94 - #define LSI3_CTL 0x013C 95 - #define LSI3_BS 0x0140 96 - #define LSI3_BD 0x0144 97 - #define LSI3_TO 0x0148 98 - 99 - #define LSI4_CTL 0x01A0 100 - #define LSI4_BS 0x01A4 101 - #define LSI4_BD 0x01A8 102 - #define LSI4_TO 0x01AC 103 - 104 - #define LSI5_CTL 0x01B4 105 - #define LSI5_BS 0x01B8 106 - #define LSI5_BD 0x01BC 107 - #define LSI5_TO 0x01C0 108 - 109 - #define LSI6_CTL 0x01C8 110 - #define LSI6_BS 0x01CC 111 - #define LSI6_BD 0x01D0 112 - #define LSI6_TO 0x01D4 113 - 114 - #define LSI7_CTL 0x01DC 115 - #define LSI7_BS 0x01E0 116 - #define LSI7_BD 0x01E4 117 - #define LSI7_TO 0x01E8 118 - 119 - static const int CA91CX42_LSI_CTL[] = { LSI0_CTL, LSI1_CTL, LSI2_CTL, LSI3_CTL, 120 - LSI4_CTL, LSI5_CTL, LSI6_CTL, LSI7_CTL }; 121 - 122 - static const int CA91CX42_LSI_BS[] = { LSI0_BS, LSI1_BS, LSI2_BS, LSI3_BS, 123 - LSI4_BS, LSI5_BS, LSI6_BS, LSI7_BS }; 124 - 125 - static const int CA91CX42_LSI_BD[] = { LSI0_BD, LSI1_BD, LSI2_BD, LSI3_BD, 126 - LSI4_BD, LSI5_BD, LSI6_BD, LSI7_BD }; 127 - 128 - static const int CA91CX42_LSI_TO[] = { LSI0_TO, LSI1_TO, LSI2_TO, LSI3_TO, 129 - LSI4_TO, LSI5_TO, LSI6_TO, LSI7_TO }; 130 - 131 - #define SCYC_CTL 0x0170 132 - #define SCYC_ADDR 0x0174 133 - #define SCYC_EN 0x0178 134 - #define SCYC_CMP 0x017C 135 - #define SCYC_SWP 0x0180 136 - #define LMISC 0x0184 137 - #define SLSI 0x0188 138 - #define L_CMDERR 0x018C 139 - #define LAERR 0x0190 140 - 141 - #define DCTL 0x0200 142 - #define DTBC 0x0204 143 - #define DLA 0x0208 144 - #define DVA 0x0210 145 - #define DCPP 0x0218 146 - #define DGCS 0x0220 147 - #define D_LLUE 0x0224 148 - 149 - #define LINT_EN 0x0300 150 - #define LINT_STAT 0x0304 151 - #define LINT_MAP0 0x0308 152 - #define LINT_MAP1 0x030C 153 - #define VINT_EN 0x0310 154 - #define VINT_STAT 0x0314 155 - #define VINT_MAP0 0x0318 156 - #define VINT_MAP1 0x031C 157 - #define STATID 0x0320 158 - 159 - #define V1_STATID 0x0324 160 - #define V2_STATID 0x0328 161 - #define V3_STATID 0x032C 162 - #define V4_STATID 0x0330 163 - #define V5_STATID 0x0334 164 - #define V6_STATID 0x0338 165 - #define V7_STATID 0x033C 166 - 167 - static const int CA91CX42_V_STATID[8] = { 0, V1_STATID, V2_STATID, V3_STATID, 168 - V4_STATID, V5_STATID, V6_STATID, 169 - V7_STATID }; 170 - 171 - #define LINT_MAP2 0x0340 172 - #define VINT_MAP2 0x0344 173 - 174 - #define MBOX0 0x0348 175 - #define MBOX1 0x034C 176 - #define MBOX2 0x0350 177 - #define MBOX3 0x0354 178 - #define SEMA0 0x0358 179 - #define SEMA1 0x035C 180 - 181 - #define MAST_CTL 0x0400 182 - #define MISC_CTL 0x0404 183 - #define MISC_STAT 0x0408 184 - #define USER_AM 0x040C 185 - 186 - #define VSI0_CTL 0x0F00 187 - #define VSI0_BS 0x0F04 188 - #define VSI0_BD 0x0F08 189 - #define VSI0_TO 0x0F0C 190 - 191 - #define VSI1_CTL 0x0F14 192 - #define VSI1_BS 0x0F18 193 - #define VSI1_BD 0x0F1C 194 - #define VSI1_TO 0x0F20 195 - 196 - #define VSI2_CTL 0x0F28 197 - #define VSI2_BS 0x0F2C 198 - #define VSI2_BD 0x0F30 199 - #define VSI2_TO 0x0F34 200 - 201 - #define VSI3_CTL 0x0F3C 202 - #define VSI3_BS 0x0F40 203 - #define VSI3_BD 0x0F44 204 - #define VSI3_TO 0x0F48 205 - 206 - #define LM_CTL 0x0F64 207 - #define LM_BS 0x0F68 208 - 209 - #define VRAI_CTL 0x0F70 210 - 211 - #define VRAI_BS 0x0F74 212 - #define VCSR_CTL 0x0F80 213 - #define VCSR_TO 0x0F84 214 - #define V_AMERR 0x0F88 215 - #define VAERR 0x0F8C 216 - 217 - #define VSI4_CTL 0x0F90 218 - #define VSI4_BS 0x0F94 219 - #define VSI4_BD 0x0F98 220 - #define VSI4_TO 0x0F9C 221 - 222 - #define VSI5_CTL 0x0FA4 223 - #define VSI5_BS 0x0FA8 224 - #define VSI5_BD 0x0FAC 225 - #define VSI5_TO 0x0FB0 226 - 227 - #define VSI6_CTL 0x0FB8 228 - #define VSI6_BS 0x0FBC 229 - #define VSI6_BD 0x0FC0 230 - #define VSI6_TO 0x0FC4 231 - 232 - #define VSI7_CTL 0x0FCC 233 - #define VSI7_BS 0x0FD0 234 - #define VSI7_BD 0x0FD4 235 - #define VSI7_TO 0x0FD8 236 - 237 - static const int CA91CX42_VSI_CTL[] = { VSI0_CTL, VSI1_CTL, VSI2_CTL, VSI3_CTL, 238 - VSI4_CTL, VSI5_CTL, VSI6_CTL, VSI7_CTL }; 239 - 240 - static const int CA91CX42_VSI_BS[] = { VSI0_BS, VSI1_BS, VSI2_BS, VSI3_BS, 241 - VSI4_BS, VSI5_BS, VSI6_BS, VSI7_BS }; 242 - 243 - static const int CA91CX42_VSI_BD[] = { VSI0_BD, VSI1_BD, VSI2_BD, VSI3_BD, 244 - VSI4_BD, VSI5_BD, VSI6_BD, VSI7_BD }; 245 - 246 - static const int CA91CX42_VSI_TO[] = { VSI0_TO, VSI1_TO, VSI2_TO, VSI3_TO, 247 - VSI4_TO, VSI5_TO, VSI6_TO, VSI7_TO }; 248 - 249 - #define VCSR_CLR 0x0FF4 250 - #define VCSR_SET 0x0FF8 251 - #define VCSR_BS 0x0FFC 252 - 253 - /* 254 - * PCI Class Register 255 - * offset 008 256 - */ 257 - #define CA91CX42_BM_PCI_CLASS_BASE 0xFF000000 258 - #define CA91CX42_OF_PCI_CLASS_BASE 24 259 - #define CA91CX42_BM_PCI_CLASS_SUB 0x00FF0000 260 - #define CA91CX42_OF_PCI_CLASS_SUB 16 261 - #define CA91CX42_BM_PCI_CLASS_PROG 0x0000FF00 262 - #define CA91CX42_OF_PCI_CLASS_PROG 8 263 - #define CA91CX42_BM_PCI_CLASS_RID 0x000000FF 264 - #define CA91CX42_OF_PCI_CLASS_RID 0 265 - 266 - #define CA91CX42_OF_PCI_CLASS_RID_UNIVERSE_I 0 267 - #define CA91CX42_OF_PCI_CLASS_RID_UNIVERSE_II 1 268 - 269 - /* 270 - * PCI Misc Register 271 - * offset 00C 272 - */ 273 - #define CA91CX42_BM_PCI_MISC0_BISTC 0x80000000 274 - #define CA91CX42_BM_PCI_MISC0_SBIST 0x60000000 275 - #define CA91CX42_BM_PCI_MISC0_CCODE 0x0F000000 276 - #define CA91CX42_BM_PCI_MISC0_MFUNCT 0x00800000 277 - #define CA91CX42_BM_PCI_MISC0_LAYOUT 0x007F0000 278 - #define CA91CX42_BM_PCI_MISC0_LTIMER 0x0000FF00 279 - #define CA91CX42_OF_PCI_MISC0_LTIMER 8 280 - 281 - 282 - /* 283 - * LSI Control Register 284 - * offset 100 285 - */ 286 - #define CA91CX42_LSI_CTL_EN (1<<31) 287 - #define CA91CX42_LSI_CTL_PWEN (1<<30) 288 - 289 - #define CA91CX42_LSI_CTL_VDW_M (3<<22) 290 - #define CA91CX42_LSI_CTL_VDW_D8 0 291 - #define CA91CX42_LSI_CTL_VDW_D16 (1<<22) 292 - #define CA91CX42_LSI_CTL_VDW_D32 (1<<23) 293 - #define CA91CX42_LSI_CTL_VDW_D64 (3<<22) 294 - 295 - #define CA91CX42_LSI_CTL_VAS_M (7<<16) 296 - #define CA91CX42_LSI_CTL_VAS_A16 0 297 - #define CA91CX42_LSI_CTL_VAS_A24 (1<<16) 298 - #define CA91CX42_LSI_CTL_VAS_A32 (1<<17) 299 - #define CA91CX42_LSI_CTL_VAS_CRCSR (5<<16) 300 - #define CA91CX42_LSI_CTL_VAS_USER1 (3<<17) 301 - #define CA91CX42_LSI_CTL_VAS_USER2 (7<<16) 302 - 303 - #define CA91CX42_LSI_CTL_PGM_M (1<<14) 304 - #define CA91CX42_LSI_CTL_PGM_DATA 0 305 - #define CA91CX42_LSI_CTL_PGM_PGM (1<<14) 306 - 307 - #define CA91CX42_LSI_CTL_SUPER_M (1<<12) 308 - #define CA91CX42_LSI_CTL_SUPER_NPRIV 0 309 - #define CA91CX42_LSI_CTL_SUPER_SUPR (1<<12) 310 - 311 - #define CA91CX42_LSI_CTL_VCT_M (1<<8) 312 - #define CA91CX42_LSI_CTL_VCT_BLT (1<<8) 313 - #define CA91CX42_LSI_CTL_VCT_MBLT (1<<8) 314 - #define CA91CX42_LSI_CTL_LAS (1<<0) 315 - 316 - /* 317 - * SCYC_CTL Register 318 - * offset 178 319 - */ 320 - #define CA91CX42_SCYC_CTL_LAS_PCIMEM 0 321 - #define CA91CX42_SCYC_CTL_LAS_PCIIO (1<<2) 322 - 323 - #define CA91CX42_SCYC_CTL_CYC_M (3<<0) 324 - #define CA91CX42_SCYC_CTL_CYC_RMW (1<<0) 325 - #define CA91CX42_SCYC_CTL_CYC_ADOH (1<<1) 326 - 327 - /* 328 - * LMISC Register 329 - * offset 184 330 - */ 331 - #define CA91CX42_BM_LMISC_CRT 0xF0000000 332 - #define CA91CX42_OF_LMISC_CRT 28 333 - #define CA91CX42_BM_LMISC_CWT 0x0F000000 334 - #define CA91CX42_OF_LMISC_CWT 24 335 - 336 - /* 337 - * SLSI Register 338 - * offset 188 339 - */ 340 - #define CA91CX42_BM_SLSI_EN 0x80000000 341 - #define CA91CX42_BM_SLSI_PWEN 0x40000000 342 - #define CA91CX42_BM_SLSI_VDW 0x00F00000 343 - #define CA91CX42_OF_SLSI_VDW 20 344 - #define CA91CX42_BM_SLSI_PGM 0x0000F000 345 - #define CA91CX42_OF_SLSI_PGM 12 346 - #define CA91CX42_BM_SLSI_SUPER 0x00000F00 347 - #define CA91CX42_OF_SLSI_SUPER 8 348 - #define CA91CX42_BM_SLSI_BS 0x000000F6 349 - #define CA91CX42_OF_SLSI_BS 2 350 - #define CA91CX42_BM_SLSI_LAS 0x00000003 351 - #define CA91CX42_OF_SLSI_LAS 0 352 - #define CA91CX42_BM_SLSI_RESERVED 0x3F0F0000 353 - 354 - /* 355 - * DCTL Register 356 - * offset 200 357 - */ 358 - #define CA91CX42_DCTL_L2V (1<<31) 359 - #define CA91CX42_DCTL_VDW_M (3<<22) 360 - #define CA91CX42_DCTL_VDW_D8 0 361 - #define CA91CX42_DCTL_VDW_D16 (1<<22) 362 - #define CA91CX42_DCTL_VDW_D32 (1<<23) 363 - #define CA91CX42_DCTL_VDW_D64 (3<<22) 364 - 365 - #define CA91CX42_DCTL_VAS_M (7<<16) 366 - #define CA91CX42_DCTL_VAS_A16 0 367 - #define CA91CX42_DCTL_VAS_A24 (1<<16) 368 - #define CA91CX42_DCTL_VAS_A32 (1<<17) 369 - #define CA91CX42_DCTL_VAS_USER1 (3<<17) 370 - #define CA91CX42_DCTL_VAS_USER2 (7<<16) 371 - 372 - #define CA91CX42_DCTL_PGM_M (1<<14) 373 - #define CA91CX42_DCTL_PGM_DATA 0 374 - #define CA91CX42_DCTL_PGM_PGM (1<<14) 375 - 376 - #define CA91CX42_DCTL_SUPER_M (1<<12) 377 - #define CA91CX42_DCTL_SUPER_NPRIV 0 378 - #define CA91CX42_DCTL_SUPER_SUPR (1<<12) 379 - 380 - #define CA91CX42_DCTL_VCT_M (1<<8) 381 - #define CA91CX42_DCTL_VCT_BLT (1<<8) 382 - #define CA91CX42_DCTL_LD64EN (1<<7) 383 - 384 - /* 385 - * DCPP Register 386 - * offset 218 387 - */ 388 - #define CA91CX42_DCPP_M 0xf 389 - #define CA91CX42_DCPP_NULL (1<<0) 390 - 391 - /* 392 - * DMA General Control/Status Register (DGCS) 393 - * offset 220 394 - */ 395 - #define CA91CX42_DGCS_GO (1<<31) 396 - #define CA91CX42_DGCS_STOP_REQ (1<<30) 397 - #define CA91CX42_DGCS_HALT_REQ (1<<29) 398 - #define CA91CX42_DGCS_CHAIN (1<<27) 399 - 400 - #define CA91CX42_DGCS_VON_M (7<<20) 401 - 402 - #define CA91CX42_DGCS_VOFF_M (0xf<<16) 403 - 404 - #define CA91CX42_DGCS_ACT (1<<15) 405 - #define CA91CX42_DGCS_STOP (1<<14) 406 - #define CA91CX42_DGCS_HALT (1<<13) 407 - #define CA91CX42_DGCS_DONE (1<<11) 408 - #define CA91CX42_DGCS_LERR (1<<10) 409 - #define CA91CX42_DGCS_VERR (1<<9) 410 - #define CA91CX42_DGCS_PERR (1<<8) 411 - #define CA91CX42_DGCS_INT_STOP (1<<6) 412 - #define CA91CX42_DGCS_INT_HALT (1<<5) 413 - #define CA91CX42_DGCS_INT_DONE (1<<3) 414 - #define CA91CX42_DGCS_INT_LERR (1<<2) 415 - #define CA91CX42_DGCS_INT_VERR (1<<1) 416 - #define CA91CX42_DGCS_INT_PERR (1<<0) 417 - 418 - /* 419 - * PCI Interrupt Enable Register 420 - * offset 300 421 - */ 422 - #define CA91CX42_LINT_LM3 0x00800000 423 - #define CA91CX42_LINT_LM2 0x00400000 424 - #define CA91CX42_LINT_LM1 0x00200000 425 - #define CA91CX42_LINT_LM0 0x00100000 426 - #define CA91CX42_LINT_MBOX3 0x00080000 427 - #define CA91CX42_LINT_MBOX2 0x00040000 428 - #define CA91CX42_LINT_MBOX1 0x00020000 429 - #define CA91CX42_LINT_MBOX0 0x00010000 430 - #define CA91CX42_LINT_ACFAIL 0x00008000 431 - #define CA91CX42_LINT_SYSFAIL 0x00004000 432 - #define CA91CX42_LINT_SW_INT 0x00002000 433 - #define CA91CX42_LINT_SW_IACK 0x00001000 434 - 435 - #define CA91CX42_LINT_VERR 0x00000400 436 - #define CA91CX42_LINT_LERR 0x00000200 437 - #define CA91CX42_LINT_DMA 0x00000100 438 - #define CA91CX42_LINT_VIRQ7 0x00000080 439 - #define CA91CX42_LINT_VIRQ6 0x00000040 440 - #define CA91CX42_LINT_VIRQ5 0x00000020 441 - #define CA91CX42_LINT_VIRQ4 0x00000010 442 - #define CA91CX42_LINT_VIRQ3 0x00000008 443 - #define CA91CX42_LINT_VIRQ2 0x00000004 444 - #define CA91CX42_LINT_VIRQ1 0x00000002 445 - #define CA91CX42_LINT_VOWN 0x00000001 446 - 447 - static const int CA91CX42_LINT_VIRQ[] = { 0, CA91CX42_LINT_VIRQ1, 448 - CA91CX42_LINT_VIRQ2, CA91CX42_LINT_VIRQ3, 449 - CA91CX42_LINT_VIRQ4, CA91CX42_LINT_VIRQ5, 450 - CA91CX42_LINT_VIRQ6, CA91CX42_LINT_VIRQ7 }; 451 - 452 - #define CA91CX42_LINT_MBOX 0x000F0000 453 - 454 - static const int CA91CX42_LINT_LM[] = { CA91CX42_LINT_LM0, CA91CX42_LINT_LM1, 455 - CA91CX42_LINT_LM2, CA91CX42_LINT_LM3 }; 456 - 457 - /* 458 - * MAST_CTL Register 459 - * offset 400 460 - */ 461 - #define CA91CX42_BM_MAST_CTL_MAXRTRY 0xF0000000 462 - #define CA91CX42_OF_MAST_CTL_MAXRTRY 28 463 - #define CA91CX42_BM_MAST_CTL_PWON 0x0F000000 464 - #define CA91CX42_OF_MAST_CTL_PWON 24 465 - #define CA91CX42_BM_MAST_CTL_VRL 0x00C00000 466 - #define CA91CX42_OF_MAST_CTL_VRL 22 467 - #define CA91CX42_BM_MAST_CTL_VRM 0x00200000 468 - #define CA91CX42_BM_MAST_CTL_VREL 0x00100000 469 - #define CA91CX42_BM_MAST_CTL_VOWN 0x00080000 470 - #define CA91CX42_BM_MAST_CTL_VOWN_ACK 0x00040000 471 - #define CA91CX42_BM_MAST_CTL_PABS 0x00001000 472 - #define CA91CX42_BM_MAST_CTL_BUS_NO 0x0000000F 473 - #define CA91CX42_OF_MAST_CTL_BUS_NO 0 474 - 475 - /* 476 - * MISC_CTL Register 477 - * offset 404 478 - */ 479 - #define CA91CX42_MISC_CTL_VBTO 0xF0000000 480 - #define CA91CX42_MISC_CTL_VARB 0x04000000 481 - #define CA91CX42_MISC_CTL_VARBTO 0x03000000 482 - #define CA91CX42_MISC_CTL_SW_LRST 0x00800000 483 - #define CA91CX42_MISC_CTL_SW_SRST 0x00400000 484 - #define CA91CX42_MISC_CTL_BI 0x00100000 485 - #define CA91CX42_MISC_CTL_ENGBI 0x00080000 486 - #define CA91CX42_MISC_CTL_RESCIND 0x00040000 487 - #define CA91CX42_MISC_CTL_SYSCON 0x00020000 488 - #define CA91CX42_MISC_CTL_V64AUTO 0x00010000 489 - #define CA91CX42_MISC_CTL_RESERVED 0x0820FFFF 490 - 491 - #define CA91CX42_OF_MISC_CTL_VARBTO 24 492 - #define CA91CX42_OF_MISC_CTL_VBTO 28 493 - 494 - /* 495 - * MISC_STAT Register 496 - * offset 408 497 - */ 498 - #define CA91CX42_BM_MISC_STAT_ENDIAN 0x80000000 499 - #define CA91CX42_BM_MISC_STAT_LCLSIZE 0x40000000 500 - #define CA91CX42_BM_MISC_STAT_DY4AUTO 0x08000000 501 - #define CA91CX42_BM_MISC_STAT_MYBBSY 0x00200000 502 - #define CA91CX42_BM_MISC_STAT_DY4DONE 0x00080000 503 - #define CA91CX42_BM_MISC_STAT_TXFE 0x00040000 504 - #define CA91CX42_BM_MISC_STAT_RXFE 0x00020000 505 - #define CA91CX42_BM_MISC_STAT_DY4AUTOID 0x0000FF00 506 - #define CA91CX42_OF_MISC_STAT_DY4AUTOID 8 507 - 508 - /* 509 - * VSI Control Register 510 - * offset F00 511 - */ 512 - #define CA91CX42_VSI_CTL_EN (1<<31) 513 - #define CA91CX42_VSI_CTL_PWEN (1<<30) 514 - #define CA91CX42_VSI_CTL_PREN (1<<29) 515 - 516 - #define CA91CX42_VSI_CTL_PGM_M (3<<22) 517 - #define CA91CX42_VSI_CTL_PGM_DATA (1<<22) 518 - #define CA91CX42_VSI_CTL_PGM_PGM (1<<23) 519 - 520 - #define CA91CX42_VSI_CTL_SUPER_M (3<<20) 521 - #define CA91CX42_VSI_CTL_SUPER_NPRIV (1<<20) 522 - #define CA91CX42_VSI_CTL_SUPER_SUPR (1<<21) 523 - 524 - #define CA91CX42_VSI_CTL_VAS_M (7<<16) 525 - #define CA91CX42_VSI_CTL_VAS_A16 0 526 - #define CA91CX42_VSI_CTL_VAS_A24 (1<<16) 527 - #define CA91CX42_VSI_CTL_VAS_A32 (1<<17) 528 - #define CA91CX42_VSI_CTL_VAS_USER1 (3<<17) 529 - #define CA91CX42_VSI_CTL_VAS_USER2 (7<<16) 530 - 531 - #define CA91CX42_VSI_CTL_LD64EN (1<<7) 532 - #define CA91CX42_VSI_CTL_LLRMW (1<<6) 533 - 534 - #define CA91CX42_VSI_CTL_LAS_M (3<<0) 535 - #define CA91CX42_VSI_CTL_LAS_PCI_MS 0 536 - #define CA91CX42_VSI_CTL_LAS_PCI_IO (1<<0) 537 - #define CA91CX42_VSI_CTL_LAS_PCI_CONF (1<<1) 538 - 539 - /* LM_CTL Register 540 - * offset F64 541 - */ 542 - #define CA91CX42_LM_CTL_EN (1<<31) 543 - #define CA91CX42_LM_CTL_PGM (1<<23) 544 - #define CA91CX42_LM_CTL_DATA (1<<22) 545 - #define CA91CX42_LM_CTL_SUPR (1<<21) 546 - #define CA91CX42_LM_CTL_NPRIV (1<<20) 547 - #define CA91CX42_LM_CTL_AS_M (7<<16) 548 - #define CA91CX42_LM_CTL_AS_A16 0 549 - #define CA91CX42_LM_CTL_AS_A24 (1<<16) 550 - #define CA91CX42_LM_CTL_AS_A32 (1<<17) 551 - 552 - /* 553 - * VRAI_CTL Register 554 - * offset F70 555 - */ 556 - #define CA91CX42_BM_VRAI_CTL_EN 0x80000000 557 - #define CA91CX42_BM_VRAI_CTL_PGM 0x00C00000 558 - #define CA91CX42_OF_VRAI_CTL_PGM 22 559 - #define CA91CX42_BM_VRAI_CTL_SUPER 0x00300000 560 - #define CA91CX42_OF_VRAI_CTL_SUPER 20 561 - #define CA91CX42_BM_VRAI_CTL_VAS 0x00030000 562 - #define CA91CX42_OF_VRAI_CTL_VAS 16 563 - 564 - /* VCSR_CTL Register 565 - * offset F80 566 - */ 567 - #define CA91CX42_VCSR_CTL_EN (1<<31) 568 - 569 - #define CA91CX42_VCSR_CTL_LAS_M (3<<0) 570 - #define CA91CX42_VCSR_CTL_LAS_PCI_MS 0 571 - #define CA91CX42_VCSR_CTL_LAS_PCI_IO (1<<0) 572 - #define CA91CX42_VCSR_CTL_LAS_PCI_CONF (1<<1) 573 - 574 - /* VCSR_BS Register 575 - * offset FFC 576 - */ 577 - #define CA91CX42_VCSR_BS_SLOT_M (0x1F<<27) 578 - 579 - #endif /* _CA91CX42_H */
+2 -2
drivers/vme/bridges/vme_fake.c drivers/staging/vme_user/vme_fake.c
··· 29 29 #include <linux/slab.h> 30 30 #include <linux/spinlock.h> 31 31 #include <linux/types.h> 32 - #include <linux/vme.h> 33 32 34 - #include "../vme_bridge.h" 33 + #include "vme.h" 34 + #include "vme_bridge.h" 35 35 36 36 /* 37 37 * Define the number of each that the fake driver supports.
+2 -2
drivers/vme/bridges/vme_tsi148.c drivers/staging/vme_user/vme_tsi148.c
··· 26 26 #include <linux/io.h> 27 27 #include <linux/uaccess.h> 28 28 #include <linux/byteorder/generic.h> 29 - #include <linux/vme.h> 30 29 31 - #include "../vme_bridge.h" 30 + #include "vme.h" 31 + #include "vme_bridge.h" 32 32 #include "vme_tsi148.h" 33 33 34 34 static int tsi148_probe(struct pci_dev *, const struct pci_device_id *);
drivers/vme/bridges/vme_tsi148.h drivers/staging/vme_user/vme_tsi148.h
+1 -1
drivers/vme/vme.c drivers/staging/vme_user/vme.c
··· 26 26 #include <linux/mutex.h> 27 27 #include <linux/spinlock.h> 28 28 #include <linux/slab.h> 29 - #include <linux/vme.h> 30 29 30 + #include "vme.h" 31 31 #include "vme_bridge.h" 32 32 33 33 /* Bitmask and list of registered buses both protected by common mutex */
+1 -1
drivers/vme/vme_bridge.h drivers/staging/vme_user/vme_bridge.h
··· 2 2 #ifndef _VME_BRIDGE_H_ 3 3 #define _VME_BRIDGE_H_ 4 4 5 - #include <linux/vme.h> 5 + #include "vme.h" 6 6 7 7 #define VME_CRCSR_BUF_SIZE (508*1024) 8 8 /*
include/linux/vme.h drivers/staging/vme_user/vme.h