211 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Definitions for RTL8187 hardware4 *5 * Copyright 2007 Michael Wu <flamingice@sourmilk.net>6 * Copyright 2007 Andrea Merello <andrea.merello@gmail.com>7 *8 * Based on the r8187 driver, which is:9 * Copyright 2005 Andrea Merello <andrea.merello@gmail.com>, et al.10 */11 12#ifndef RTL8187_H13#define RTL8187_H14 15#include <linux/cache.h>16 17#include "rtl818x.h"18#include "leds.h"19 20#define RTL8187_EEPROM_TXPWR_BASE 0x0521#define RTL8187_EEPROM_MAC_ADDR 0x0722#define RTL8187_EEPROM_TXPWR_CHAN_1 0x16 /* 3 channels */23#define RTL8187_EEPROM_TXPWR_CHAN_6 0x1B /* 2 channels */24#define RTL8187_EEPROM_TXPWR_CHAN_4 0x3D /* 2 channels */25#define RTL8187_EEPROM_SELECT_GPIO 0x3B26 27#define RTL8187_REQT_READ 0xC028#define RTL8187_REQT_WRITE 0x4029#define RTL8187_REQ_GET_REG 0x0530#define RTL8187_REQ_SET_REG 0x0531 32#define RTL8187_MAX_RX 0x9C433 34#define RFKILL_MASK_8187_89_97 0x235#define RFKILL_MASK_8198 0x436 37#define RETRY_COUNT 738 39struct rtl8187_rx_info {40 struct urb *urb;41 struct ieee80211_hw *dev;42};43 44struct rtl8187_rx_hdr {45 __le32 flags;46 u8 noise;47 u8 signal;48 u8 agc;49 u8 reserved;50 __le64 mac_time;51} __packed;52 53struct rtl8187b_rx_hdr {54 __le32 flags;55 __le64 mac_time;56 u8 sq;57 u8 rssi;58 u8 agc;59 u8 flags2;60 __le16 snr_long2end;61 s8 pwdb_g12;62 u8 fot;63} __packed;64 65/* {rtl8187,rtl8187b}_tx_info is in skb */66 67struct rtl8187_tx_hdr {68 __le32 flags;69 __le16 rts_duration;70 __le16 len;71 __le32 retry;72} __packed;73 74struct rtl8187b_tx_hdr {75 __le32 flags;76 __le16 rts_duration;77 __le16 len;78 __le32 unused_1;79 __le16 unused_2;80 __le16 tx_duration;81 __le32 unused_3;82 __le32 retry;83 __le32 unused_4[2];84} __packed;85 86enum {87 DEVICE_RTL8187,88 DEVICE_RTL8187B89};90 91struct rtl8187_vif {92 struct ieee80211_hw *dev;93 94 /* beaconing */95 struct delayed_work beacon_work;96 bool enable_beacon;97};98 99struct rtl8187_priv {100 /* common between rtl818x drivers */101 struct rtl818x_csr *map;102 const struct rtl818x_rf_ops *rf;103 struct ieee80211_vif *vif;104 105 /* The mutex protects the TX loopback state.106 * Any attempt to set channels concurrently locks the device.107 */108 struct mutex conf_mutex;109 110 /* rtl8187 specific */111 struct ieee80211_channel channels[14];112 struct ieee80211_rate rates[12];113 struct ieee80211_supported_band band;114 struct usb_device *udev;115 u32 rx_conf;116 struct usb_anchor anchored;117 struct delayed_work work;118 struct ieee80211_hw *dev;119#ifdef CONFIG_RTL8187_LEDS120 struct rtl8187_led led_radio;121 struct rtl8187_led led_tx;122 struct rtl8187_led led_rx;123 struct delayed_work led_on;124 struct delayed_work led_off;125#endif126 u16 txpwr_base;127 u8 asic_rev;128 u8 is_rtl8187b;129 enum {130 RTL8187BvB,131 RTL8187BvD,132 RTL8187BvE133 } hw_rev;134 struct sk_buff_head rx_queue;135 u8 signal;136 u8 noise;137 u8 slot_time;138 u8 aifsn[4];139 u8 rfkill_mask;140 struct {141 union {142 __le64 buf;143 u8 dummy1[L1_CACHE_BYTES];144 } ____cacheline_aligned;145 struct sk_buff_head queue;146 } b_tx_status; /* This queue is used by both -b and non-b devices */147 struct mutex io_mutex;148 union {149 u8 bits8;150 __le16 bits16;151 __le32 bits32;152 u8 dummy2[L1_CACHE_BYTES];153 } *io_dmabuf ____cacheline_aligned;154 bool rfkill_off;155 u16 seqno;156};157 158void rtl8187_write_phy(struct ieee80211_hw *dev, u8 addr, u32 data);159 160u8 rtl818x_ioread8_idx(struct rtl8187_priv *priv,161 u8 *addr, u8 idx);162 163static inline u8 rtl818x_ioread8(struct rtl8187_priv *priv, u8 *addr)164{165 return rtl818x_ioread8_idx(priv, addr, 0);166}167 168u16 rtl818x_ioread16_idx(struct rtl8187_priv *priv,169 __le16 *addr, u8 idx);170 171static inline u16 rtl818x_ioread16(struct rtl8187_priv *priv, __le16 *addr)172{173 return rtl818x_ioread16_idx(priv, addr, 0);174}175 176u32 rtl818x_ioread32_idx(struct rtl8187_priv *priv,177 __le32 *addr, u8 idx);178 179static inline u32 rtl818x_ioread32(struct rtl8187_priv *priv, __le32 *addr)180{181 return rtl818x_ioread32_idx(priv, addr, 0);182}183 184void rtl818x_iowrite8_idx(struct rtl8187_priv *priv,185 u8 *addr, u8 val, u8 idx);186 187static inline void rtl818x_iowrite8(struct rtl8187_priv *priv, u8 *addr, u8 val)188{189 rtl818x_iowrite8_idx(priv, addr, val, 0);190}191 192void rtl818x_iowrite16_idx(struct rtl8187_priv *priv,193 __le16 *addr, u16 val, u8 idx);194 195static inline void rtl818x_iowrite16(struct rtl8187_priv *priv, __le16 *addr,196 u16 val)197{198 rtl818x_iowrite16_idx(priv, addr, val, 0);199}200 201void rtl818x_iowrite32_idx(struct rtl8187_priv *priv,202 __le32 *addr, u32 val, u8 idx);203 204static inline void rtl818x_iowrite32(struct rtl8187_priv *priv, __le32 *addr,205 u32 val)206{207 rtl818x_iowrite32_idx(priv, addr, val, 0);208}209 210#endif /* RTL8187_H */211