diff options
| author | John W. Linville <linville@tuxdriver.com> | 2012-12-07 13:03:50 -0500 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2012-12-07 13:03:50 -0500 |
| commit | 8024dc191025d6b981563236df02da5c0db0854d (patch) | |
| tree | f42cd84995c804c3590c56616527f5399155060b /include | |
| parent | fd3065b25b69ce345073bbd294a73343a608fd8b (diff) | |
| parent | 9e2ff36beae4bedbad2a69d458f9404f35fcb528 (diff) | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next into for-davem
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/bcm47xx_wdt.h | 19 | ||||
| -rw-r--r-- | include/linux/bcma/bcma_driver_chipcommon.h | 7 | ||||
| -rw-r--r-- | include/linux/ieee80211.h | 15 | ||||
| -rw-r--r-- | include/linux/ssb/ssb.h | 2 | ||||
| -rw-r--r-- | include/linux/ssb/ssb_driver_chipcommon.h | 5 | ||||
| -rw-r--r-- | include/linux/ssb/ssb_driver_extif.h | 52 | ||||
| -rw-r--r-- | include/net/bluetooth/hci_core.h | 31 | ||||
| -rw-r--r-- | include/net/bluetooth/l2cap.h | 2 | ||||
| -rw-r--r-- | include/net/cfg80211.h | 69 | ||||
| -rw-r--r-- | include/net/ieee80211_radiotap.h | 24 | ||||
| -rw-r--r-- | include/net/mac80211.h | 12 | ||||
| -rw-r--r-- | include/uapi/linux/nl80211.h | 16 |
12 files changed, 218 insertions, 36 deletions
diff --git a/include/linux/bcm47xx_wdt.h b/include/linux/bcm47xx_wdt.h new file mode 100644 index 000000000000..e5dfc256485b --- /dev/null +++ b/include/linux/bcm47xx_wdt.h | |||
| @@ -0,0 +1,19 @@ | |||
| 1 | #ifndef LINUX_BCM47XX_WDT_H_ | ||
| 2 | #define LINUX_BCM47XX_WDT_H_ | ||
| 3 | |||
| 4 | #include <linux/types.h> | ||
| 5 | |||
| 6 | |||
| 7 | struct bcm47xx_wdt { | ||
| 8 | u32 (*timer_set)(struct bcm47xx_wdt *, u32); | ||
| 9 | u32 (*timer_set_ms)(struct bcm47xx_wdt *, u32); | ||
| 10 | u32 max_timer_ms; | ||
| 11 | |||
| 12 | void *driver_data; | ||
| 13 | }; | ||
| 14 | |||
| 15 | static inline void *bcm47xx_wdt_get_drvdata(struct bcm47xx_wdt *wdt) | ||
| 16 | { | ||
| 17 | return wdt->driver_data; | ||
| 18 | } | ||
| 19 | #endif /* LINUX_BCM47XX_WDT_H_ */ | ||
diff --git a/include/linux/bcma/bcma_driver_chipcommon.h b/include/linux/bcma/bcma_driver_chipcommon.h index 145f3c56227f..e51359180b6f 100644 --- a/include/linux/bcma/bcma_driver_chipcommon.h +++ b/include/linux/bcma/bcma_driver_chipcommon.h | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | #ifndef LINUX_BCMA_DRIVER_CC_H_ | 1 | #ifndef LINUX_BCMA_DRIVER_CC_H_ |
| 2 | #define LINUX_BCMA_DRIVER_CC_H_ | 2 | #define LINUX_BCMA_DRIVER_CC_H_ |
| 3 | 3 | ||
| 4 | #include <linux/platform_device.h> | ||
| 5 | |||
| 4 | /** ChipCommon core registers. **/ | 6 | /** ChipCommon core registers. **/ |
| 5 | #define BCMA_CC_ID 0x0000 | 7 | #define BCMA_CC_ID 0x0000 |
| 6 | #define BCMA_CC_ID_ID 0x0000FFFF | 8 | #define BCMA_CC_ID_ID 0x0000FFFF |
| @@ -570,6 +572,8 @@ struct bcma_drv_cc { | |||
| 570 | int nr_serial_ports; | 572 | int nr_serial_ports; |
| 571 | struct bcma_serial_port serial_ports[4]; | 573 | struct bcma_serial_port serial_ports[4]; |
| 572 | #endif /* CONFIG_BCMA_DRIVER_MIPS */ | 574 | #endif /* CONFIG_BCMA_DRIVER_MIPS */ |
| 575 | u32 ticks_per_ms; | ||
| 576 | struct platform_device *watchdog; | ||
| 573 | }; | 577 | }; |
| 574 | 578 | ||
| 575 | /* Register access */ | 579 | /* Register access */ |
| @@ -593,8 +597,7 @@ extern void bcma_chipco_resume(struct bcma_drv_cc *cc); | |||
| 593 | 597 | ||
| 594 | void bcma_chipco_bcm4331_ext_pa_lines_ctl(struct bcma_drv_cc *cc, bool enable); | 598 | void bcma_chipco_bcm4331_ext_pa_lines_ctl(struct bcma_drv_cc *cc, bool enable); |
| 595 | 599 | ||
| 596 | extern void bcma_chipco_watchdog_timer_set(struct bcma_drv_cc *cc, | 600 | extern u32 bcma_chipco_watchdog_timer_set(struct bcma_drv_cc *cc, u32 ticks); |
| 597 | u32 ticks); | ||
| 598 | 601 | ||
| 599 | void bcma_chipco_irq_mask(struct bcma_drv_cc *cc, u32 mask, u32 value); | 602 | void bcma_chipco_irq_mask(struct bcma_drv_cc *cc, u32 mask, u32 value); |
| 600 | 603 | ||
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index f9c5a787d350..8f690e53dd89 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h | |||
| @@ -1213,6 +1213,21 @@ struct ieee80211_vht_cap { | |||
| 1213 | } __packed; | 1213 | } __packed; |
| 1214 | 1214 | ||
| 1215 | /** | 1215 | /** |
| 1216 | * enum ieee80211_vht_chanwidth - VHT channel width | ||
| 1217 | * @IEEE80211_VHT_CHANWIDTH_USE_HT: use the HT operation IE to | ||
| 1218 | * determine the channel width (20 or 40 MHz) | ||
| 1219 | * @IEEE80211_VHT_CHANWIDTH_80MHZ: 80 MHz bandwidth | ||
| 1220 | * @IEEE80211_VHT_CHANWIDTH_160MHZ: 160 MHz bandwidth | ||
| 1221 | * @IEEE80211_VHT_CHANWIDTH_80P80MHZ: 80+80 MHz bandwidth | ||
| 1222 | */ | ||
| 1223 | enum ieee80211_vht_chanwidth { | ||
| 1224 | IEEE80211_VHT_CHANWIDTH_USE_HT = 0, | ||
| 1225 | IEEE80211_VHT_CHANWIDTH_80MHZ = 1, | ||
| 1226 | IEEE80211_VHT_CHANWIDTH_160MHZ = 2, | ||
| 1227 | IEEE80211_VHT_CHANWIDTH_80P80MHZ = 3, | ||
| 1228 | }; | ||
| 1229 | |||
| 1230 | /** | ||
| 1216 | * struct ieee80211_vht_operation - VHT operation IE | 1231 | * struct ieee80211_vht_operation - VHT operation IE |
| 1217 | * | 1232 | * |
| 1218 | * This structure is the "VHT operation element" as | 1233 | * This structure is the "VHT operation element" as |
diff --git a/include/linux/ssb/ssb.h b/include/linux/ssb/ssb.h index bb674c02f306..1f64e3f1f22b 100644 --- a/include/linux/ssb/ssb.h +++ b/include/linux/ssb/ssb.h | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | #include <linux/pci.h> | 8 | #include <linux/pci.h> |
| 9 | #include <linux/mod_devicetable.h> | 9 | #include <linux/mod_devicetable.h> |
| 10 | #include <linux/dma-mapping.h> | 10 | #include <linux/dma-mapping.h> |
| 11 | #include <linux/platform_device.h> | ||
| 11 | 12 | ||
| 12 | #include <linux/ssb/ssb_regs.h> | 13 | #include <linux/ssb/ssb_regs.h> |
| 13 | 14 | ||
| @@ -432,6 +433,7 @@ struct ssb_bus { | |||
| 432 | #ifdef CONFIG_SSB_EMBEDDED | 433 | #ifdef CONFIG_SSB_EMBEDDED |
| 433 | /* Lock for GPIO register access. */ | 434 | /* Lock for GPIO register access. */ |
| 434 | spinlock_t gpio_lock; | 435 | spinlock_t gpio_lock; |
| 436 | struct platform_device *watchdog; | ||
| 435 | #endif /* EMBEDDED */ | 437 | #endif /* EMBEDDED */ |
| 436 | 438 | ||
| 437 | /* Internal-only stuff follows. Do not touch. */ | 439 | /* Internal-only stuff follows. Do not touch. */ |
diff --git a/include/linux/ssb/ssb_driver_chipcommon.h b/include/linux/ssb/ssb_driver_chipcommon.h index c2b02a5c86ae..38339fd68a5f 100644 --- a/include/linux/ssb/ssb_driver_chipcommon.h +++ b/include/linux/ssb/ssb_driver_chipcommon.h | |||
| @@ -591,6 +591,8 @@ struct ssb_chipcommon { | |||
| 591 | /* Fast Powerup Delay constant */ | 591 | /* Fast Powerup Delay constant */ |
| 592 | u16 fast_pwrup_delay; | 592 | u16 fast_pwrup_delay; |
| 593 | struct ssb_chipcommon_pmu pmu; | 593 | struct ssb_chipcommon_pmu pmu; |
| 594 | u32 ticks_per_ms; | ||
| 595 | u32 max_timer_ms; | ||
| 594 | }; | 596 | }; |
| 595 | 597 | ||
| 596 | static inline bool ssb_chipco_available(struct ssb_chipcommon *cc) | 598 | static inline bool ssb_chipco_available(struct ssb_chipcommon *cc) |
| @@ -630,8 +632,7 @@ enum ssb_clkmode { | |||
| 630 | extern void ssb_chipco_set_clockmode(struct ssb_chipcommon *cc, | 632 | extern void ssb_chipco_set_clockmode(struct ssb_chipcommon *cc, |
| 631 | enum ssb_clkmode mode); | 633 | enum ssb_clkmode mode); |
| 632 | 634 | ||
| 633 | extern void ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc, | 635 | extern u32 ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc, u32 ticks); |
| 634 | u32 ticks); | ||
| 635 | 636 | ||
| 636 | void ssb_chipco_irq_mask(struct ssb_chipcommon *cc, u32 mask, u32 value); | 637 | void ssb_chipco_irq_mask(struct ssb_chipcommon *cc, u32 mask, u32 value); |
| 637 | 638 | ||
diff --git a/include/linux/ssb/ssb_driver_extif.h b/include/linux/ssb/ssb_driver_extif.h index 91161f0aa22b..99511d0e931d 100644 --- a/include/linux/ssb/ssb_driver_extif.h +++ b/include/linux/ssb/ssb_driver_extif.h | |||
| @@ -152,6 +152,9 @@ | |||
| 152 | /* watchdog */ | 152 | /* watchdog */ |
| 153 | #define SSB_EXTIF_WATCHDOG_CLK 48000000 /* Hz */ | 153 | #define SSB_EXTIF_WATCHDOG_CLK 48000000 /* Hz */ |
| 154 | 154 | ||
| 155 | #define SSB_EXTIF_WATCHDOG_MAX_TIMER ((1 << 28) - 1) | ||
| 156 | #define SSB_EXTIF_WATCHDOG_MAX_TIMER_MS (SSB_EXTIF_WATCHDOG_MAX_TIMER \ | ||
| 157 | / (SSB_EXTIF_WATCHDOG_CLK / 1000)) | ||
| 155 | 158 | ||
| 156 | 159 | ||
| 157 | #ifdef CONFIG_SSB_DRIVER_EXTIF | 160 | #ifdef CONFIG_SSB_DRIVER_EXTIF |
| @@ -171,8 +174,7 @@ extern void ssb_extif_get_clockcontrol(struct ssb_extif *extif, | |||
| 171 | extern void ssb_extif_timing_init(struct ssb_extif *extif, | 174 | extern void ssb_extif_timing_init(struct ssb_extif *extif, |
| 172 | unsigned long ns); | 175 | unsigned long ns); |
| 173 | 176 | ||
| 174 | extern void ssb_extif_watchdog_timer_set(struct ssb_extif *extif, | 177 | extern u32 ssb_extif_watchdog_timer_set(struct ssb_extif *extif, u32 ticks); |
| 175 | u32 ticks); | ||
| 176 | 178 | ||
| 177 | /* Extif GPIO pin access */ | 179 | /* Extif GPIO pin access */ |
| 178 | u32 ssb_extif_gpio_in(struct ssb_extif *extif, u32 mask); | 180 | u32 ssb_extif_gpio_in(struct ssb_extif *extif, u32 mask); |
| @@ -205,10 +207,52 @@ void ssb_extif_get_clockcontrol(struct ssb_extif *extif, | |||
| 205 | } | 207 | } |
| 206 | 208 | ||
| 207 | static inline | 209 | static inline |
| 208 | void ssb_extif_watchdog_timer_set(struct ssb_extif *extif, | 210 | void ssb_extif_timing_init(struct ssb_extif *extif, unsigned long ns) |
| 209 | u32 ticks) | ||
| 210 | { | 211 | { |
| 211 | } | 212 | } |
| 212 | 213 | ||
| 214 | static inline | ||
| 215 | u32 ssb_extif_watchdog_timer_set(struct ssb_extif *extif, u32 ticks) | ||
| 216 | { | ||
| 217 | return 0; | ||
| 218 | } | ||
| 219 | |||
| 220 | static inline u32 ssb_extif_gpio_in(struct ssb_extif *extif, u32 mask) | ||
| 221 | { | ||
| 222 | return 0; | ||
| 223 | } | ||
| 224 | |||
| 225 | static inline u32 ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, | ||
| 226 | u32 value) | ||
| 227 | { | ||
| 228 | return 0; | ||
| 229 | } | ||
| 230 | |||
| 231 | static inline u32 ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, | ||
| 232 | u32 value) | ||
| 233 | { | ||
| 234 | return 0; | ||
| 235 | } | ||
| 236 | |||
| 237 | static inline u32 ssb_extif_gpio_polarity(struct ssb_extif *extif, u32 mask, | ||
| 238 | u32 value) | ||
| 239 | { | ||
| 240 | return 0; | ||
| 241 | } | ||
| 242 | |||
| 243 | static inline u32 ssb_extif_gpio_intmask(struct ssb_extif *extif, u32 mask, | ||
| 244 | u32 value) | ||
| 245 | { | ||
| 246 | return 0; | ||
| 247 | } | ||
| 248 | |||
| 249 | #ifdef CONFIG_SSB_SERIAL | ||
| 250 | static inline int ssb_extif_serial_init(struct ssb_extif *extif, | ||
| 251 | struct ssb_serial_port *ports) | ||
| 252 | { | ||
| 253 | return 0; | ||
| 254 | } | ||
| 255 | #endif /* CONFIG_SSB_SERIAL */ | ||
| 256 | |||
| 213 | #endif /* CONFIG_SSB_DRIVER_EXTIF */ | 257 | #endif /* CONFIG_SSB_DRIVER_EXTIF */ |
| 214 | #endif /* LINUX_SSB_EXTIFCORE_H_ */ | 258 | #endif /* LINUX_SSB_EXTIFCORE_H_ */ |
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index ef5b85dac3f7..014a2eaa5389 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h | |||
| @@ -376,7 +376,7 @@ extern int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt); | |||
| 376 | extern int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, | 376 | extern int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, |
| 377 | u16 flags); | 377 | u16 flags); |
| 378 | 378 | ||
| 379 | extern int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr); | 379 | extern int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags); |
| 380 | extern void sco_connect_cfm(struct hci_conn *hcon, __u8 status); | 380 | extern void sco_connect_cfm(struct hci_conn *hcon, __u8 status); |
| 381 | extern void sco_disconn_cfm(struct hci_conn *hcon, __u8 reason); | 381 | extern void sco_disconn_cfm(struct hci_conn *hcon, __u8 reason); |
| 382 | extern int sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb); | 382 | extern int sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb); |
| @@ -577,6 +577,7 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst); | |||
| 577 | int hci_conn_del(struct hci_conn *conn); | 577 | int hci_conn_del(struct hci_conn *conn); |
| 578 | void hci_conn_hash_flush(struct hci_dev *hdev); | 578 | void hci_conn_hash_flush(struct hci_dev *hdev); |
| 579 | void hci_conn_check_pending(struct hci_dev *hdev); | 579 | void hci_conn_check_pending(struct hci_dev *hdev); |
| 580 | void hci_conn_accept(struct hci_conn *conn, int mask); | ||
| 580 | 581 | ||
| 581 | struct hci_chan *hci_chan_create(struct hci_conn *conn); | 582 | struct hci_chan *hci_chan_create(struct hci_conn *conn); |
| 582 | void hci_chan_del(struct hci_chan *chan); | 583 | void hci_chan_del(struct hci_chan *chan); |
| @@ -766,7 +767,7 @@ void hci_conn_del_sysfs(struct hci_conn *conn); | |||
| 766 | #define lmp_sniffsubr_capable(dev) ((dev)->features[5] & LMP_SNIFF_SUBR) | 767 | #define lmp_sniffsubr_capable(dev) ((dev)->features[5] & LMP_SNIFF_SUBR) |
| 767 | #define lmp_pause_enc_capable(dev) ((dev)->features[5] & LMP_PAUSE_ENC) | 768 | #define lmp_pause_enc_capable(dev) ((dev)->features[5] & LMP_PAUSE_ENC) |
| 768 | #define lmp_ext_inq_capable(dev) ((dev)->features[6] & LMP_EXT_INQ) | 769 | #define lmp_ext_inq_capable(dev) ((dev)->features[6] & LMP_EXT_INQ) |
| 769 | #define lmp_le_br_capable(dev) ((dev)->features[6] & LMP_SIMUL_LE_BR) | 770 | #define lmp_le_br_capable(dev) !!((dev)->features[6] & LMP_SIMUL_LE_BR) |
| 770 | #define lmp_ssp_capable(dev) ((dev)->features[6] & LMP_SIMPLE_PAIR) | 771 | #define lmp_ssp_capable(dev) ((dev)->features[6] & LMP_SIMPLE_PAIR) |
| 771 | #define lmp_no_flush_capable(dev) ((dev)->features[6] & LMP_NO_FLUSH) | 772 | #define lmp_no_flush_capable(dev) ((dev)->features[6] & LMP_NO_FLUSH) |
| 772 | #define lmp_lsto_capable(dev) ((dev)->features[7] & LMP_LSTO) | 773 | #define lmp_lsto_capable(dev) ((dev)->features[7] & LMP_LSTO) |
| @@ -775,12 +776,30 @@ void hci_conn_del_sysfs(struct hci_conn *conn); | |||
| 775 | 776 | ||
| 776 | /* ----- Extended LMP capabilities ----- */ | 777 | /* ----- Extended LMP capabilities ----- */ |
| 777 | #define lmp_host_ssp_capable(dev) ((dev)->host_features[0] & LMP_HOST_SSP) | 778 | #define lmp_host_ssp_capable(dev) ((dev)->host_features[0] & LMP_HOST_SSP) |
| 778 | #define lmp_host_le_capable(dev) ((dev)->host_features[0] & LMP_HOST_LE) | 779 | #define lmp_host_le_capable(dev) !!((dev)->host_features[0] & LMP_HOST_LE) |
| 779 | #define lmp_host_le_br_capable(dev) ((dev)->host_features[0] & LMP_HOST_LE_BREDR) | 780 | #define lmp_host_le_br_capable(dev) !!((dev)->host_features[0] & LMP_HOST_LE_BREDR) |
| 781 | |||
| 782 | /* returns true if at least one AMP active */ | ||
| 783 | static inline bool hci_amp_capable(void) | ||
| 784 | { | ||
| 785 | struct hci_dev *hdev; | ||
| 786 | bool ret = false; | ||
| 787 | |||
| 788 | read_lock(&hci_dev_list_lock); | ||
| 789 | list_for_each_entry(hdev, &hci_dev_list, list) | ||
| 790 | if (hdev->amp_type == HCI_AMP && | ||
| 791 | test_bit(HCI_UP, &hdev->flags)) | ||
| 792 | ret = true; | ||
| 793 | read_unlock(&hci_dev_list_lock); | ||
| 794 | |||
| 795 | return ret; | ||
| 796 | } | ||
| 780 | 797 | ||
| 781 | /* ----- HCI protocols ----- */ | 798 | /* ----- HCI protocols ----- */ |
| 799 | #define HCI_PROTO_DEFER 0x01 | ||
| 800 | |||
| 782 | static inline int hci_proto_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, | 801 | static inline int hci_proto_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, |
| 783 | __u8 type) | 802 | __u8 type, __u8 *flags) |
| 784 | { | 803 | { |
| 785 | switch (type) { | 804 | switch (type) { |
| 786 | case ACL_LINK: | 805 | case ACL_LINK: |
| @@ -788,7 +807,7 @@ static inline int hci_proto_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, | |||
| 788 | 807 | ||
| 789 | case SCO_LINK: | 808 | case SCO_LINK: |
| 790 | case ESCO_LINK: | 809 | case ESCO_LINK: |
| 791 | return sco_connect_ind(hdev, bdaddr); | 810 | return sco_connect_ind(hdev, bdaddr, flags); |
| 792 | 811 | ||
| 793 | default: | 812 | default: |
| 794 | BT_ERR("unknown link type %d", type); | 813 | BT_ERR("unknown link type %d", type); |
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index f57fab04e7c5..7588ef44ebaf 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h | |||
| @@ -611,7 +611,7 @@ enum { | |||
| 611 | CONF_MTU_DONE, | 611 | CONF_MTU_DONE, |
| 612 | CONF_MODE_DONE, | 612 | CONF_MODE_DONE, |
| 613 | CONF_CONNECT_PEND, | 613 | CONF_CONNECT_PEND, |
| 614 | CONF_NO_FCS_RECV, | 614 | CONF_RECV_NO_FCS, |
| 615 | CONF_STATE2_DEVICE, | 615 | CONF_STATE2_DEVICE, |
| 616 | CONF_EWS_RECV, | 616 | CONF_EWS_RECV, |
| 617 | CONF_LOC_CONF_PEND, | 617 | CONF_LOC_CONF_PEND, |
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index e78db2cf3d1b..8e6a6b73b9c9 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
| @@ -58,6 +58,8 @@ | |||
| 58 | * structures here describe these capabilities in detail. | 58 | * structures here describe these capabilities in detail. |
| 59 | */ | 59 | */ |
| 60 | 60 | ||
| 61 | struct wiphy; | ||
| 62 | |||
| 61 | /* | 63 | /* |
| 62 | * wireless hardware capability structures | 64 | * wireless hardware capability structures |
| 63 | */ | 65 | */ |
| @@ -388,6 +390,22 @@ cfg80211_chandef_compatible(const struct cfg80211_chan_def *chandef1, | |||
| 388 | const struct cfg80211_chan_def *chandef2); | 390 | const struct cfg80211_chan_def *chandef2); |
| 389 | 391 | ||
| 390 | /** | 392 | /** |
| 393 | * cfg80211_chandef_valid - check if a channel definition is valid | ||
| 394 | * @chandef: the channel definition to check | ||
| 395 | */ | ||
| 396 | bool cfg80211_chandef_valid(const struct cfg80211_chan_def *chandef); | ||
| 397 | |||
| 398 | /** | ||
| 399 | * cfg80211_chandef_usable - check if secondary channels can be used | ||
| 400 | * @wiphy: the wiphy to validate against | ||
| 401 | * @chandef: the channel definition to check | ||
| 402 | * @prohibited_flags: the regulatory chanenl flags that must not be set | ||
| 403 | */ | ||
| 404 | bool cfg80211_chandef_usable(struct wiphy *wiphy, | ||
| 405 | const struct cfg80211_chan_def *chandef, | ||
| 406 | u32 prohibited_flags); | ||
| 407 | |||
| 408 | /** | ||
| 391 | * enum survey_info_flags - survey information flags | 409 | * enum survey_info_flags - survey information flags |
| 392 | * | 410 | * |
| 393 | * @SURVEY_INFO_NOISE_DBM: noise (in dBm) was filled in | 411 | * @SURVEY_INFO_NOISE_DBM: noise (in dBm) was filled in |
| @@ -520,6 +538,8 @@ struct cfg80211_beacon_data { | |||
| 520 | * @privacy: the BSS uses privacy | 538 | * @privacy: the BSS uses privacy |
| 521 | * @auth_type: Authentication type (algorithm) | 539 | * @auth_type: Authentication type (algorithm) |
| 522 | * @inactivity_timeout: time in seconds to determine station's inactivity. | 540 | * @inactivity_timeout: time in seconds to determine station's inactivity. |
| 541 | * @p2p_ctwindow: P2P CT Window | ||
| 542 | * @p2p_opp_ps: P2P opportunistic PS | ||
| 523 | */ | 543 | */ |
| 524 | struct cfg80211_ap_settings { | 544 | struct cfg80211_ap_settings { |
| 525 | struct cfg80211_chan_def chandef; | 545 | struct cfg80211_chan_def chandef; |
| @@ -534,6 +554,8 @@ struct cfg80211_ap_settings { | |||
| 534 | bool privacy; | 554 | bool privacy; |
| 535 | enum nl80211_auth_type auth_type; | 555 | enum nl80211_auth_type auth_type; |
| 536 | int inactivity_timeout; | 556 | int inactivity_timeout; |
| 557 | u8 p2p_ctwindow; | ||
| 558 | bool p2p_opp_ps; | ||
| 537 | }; | 559 | }; |
| 538 | 560 | ||
| 539 | /** | 561 | /** |
| @@ -895,6 +917,8 @@ struct mpath_info { | |||
| 895 | * @ap_isolate: do not forward packets between connected stations | 917 | * @ap_isolate: do not forward packets between connected stations |
| 896 | * @ht_opmode: HT Operation mode | 918 | * @ht_opmode: HT Operation mode |
| 897 | * (u16 = opmode, -1 = do not change) | 919 | * (u16 = opmode, -1 = do not change) |
| 920 | * @p2p_ctwindow: P2P CT Window (-1 = no change) | ||
| 921 | * @p2p_opp_ps: P2P opportunistic PS (-1 = no change) | ||
| 898 | */ | 922 | */ |
| 899 | struct bss_parameters { | 923 | struct bss_parameters { |
| 900 | int use_cts_prot; | 924 | int use_cts_prot; |
| @@ -904,6 +928,7 @@ struct bss_parameters { | |||
| 904 | u8 basic_rates_len; | 928 | u8 basic_rates_len; |
| 905 | int ap_isolate; | 929 | int ap_isolate; |
| 906 | int ht_opmode; | 930 | int ht_opmode; |
| 931 | s8 p2p_ctwindow, p2p_opp_ps; | ||
| 907 | }; | 932 | }; |
| 908 | 933 | ||
| 909 | /** | 934 | /** |
| @@ -1045,9 +1070,6 @@ struct ieee80211_txq_params { | |||
| 1045 | u8 aifs; | 1070 | u8 aifs; |
| 1046 | }; | 1071 | }; |
| 1047 | 1072 | ||
| 1048 | /* from net/wireless.h */ | ||
| 1049 | struct wiphy; | ||
| 1050 | |||
| 1051 | /** | 1073 | /** |
| 1052 | * DOC: Scanning and BSS list handling | 1074 | * DOC: Scanning and BSS list handling |
| 1053 | * | 1075 | * |
| @@ -1184,6 +1206,18 @@ enum cfg80211_signal_type { | |||
| 1184 | }; | 1206 | }; |
| 1185 | 1207 | ||
| 1186 | /** | 1208 | /** |
| 1209 | * struct cfg80211_bss_ie_data - BSS entry IE data | ||
| 1210 | * @rcu_head: internal use, for freeing | ||
| 1211 | * @len: length of the IEs | ||
| 1212 | * @data: IE data | ||
| 1213 | */ | ||
| 1214 | struct cfg80211_bss_ies { | ||
| 1215 | struct rcu_head rcu_head; | ||
| 1216 | int len; | ||
| 1217 | u8 data[]; | ||
| 1218 | }; | ||
| 1219 | |||
| 1220 | /** | ||
| 1187 | * struct cfg80211_bss - BSS description | 1221 | * struct cfg80211_bss - BSS description |
| 1188 | * | 1222 | * |
| 1189 | * This structure describes a BSS (which may also be a mesh network) | 1223 | * This structure describes a BSS (which may also be a mesh network) |
| @@ -1194,36 +1228,34 @@ enum cfg80211_signal_type { | |||
| 1194 | * @tsf: timestamp of last received update | 1228 | * @tsf: timestamp of last received update |
| 1195 | * @beacon_interval: the beacon interval as from the frame | 1229 | * @beacon_interval: the beacon interval as from the frame |
| 1196 | * @capability: the capability field in host byte order | 1230 | * @capability: the capability field in host byte order |
| 1197 | * @information_elements: the information elements (Note that there | 1231 | * @ies: the information elements (Note that there |
| 1198 | * is no guarantee that these are well-formed!); this is a pointer to | 1232 | * is no guarantee that these are well-formed!); this is a pointer to |
| 1199 | * either the beacon_ies or proberesp_ies depending on whether Probe | 1233 | * either the beacon_ies or proberesp_ies depending on whether Probe |
| 1200 | * Response frame has been received | 1234 | * Response frame has been received |
| 1201 | * @len_information_elements: total length of the information elements | ||
| 1202 | * @beacon_ies: the information elements from the last Beacon frame | 1235 | * @beacon_ies: the information elements from the last Beacon frame |
| 1203 | * @len_beacon_ies: total length of the beacon_ies | ||
| 1204 | * @proberesp_ies: the information elements from the last Probe Response frame | 1236 | * @proberesp_ies: the information elements from the last Probe Response frame |
| 1205 | * @len_proberesp_ies: total length of the proberesp_ies | ||
| 1206 | * @signal: signal strength value (type depends on the wiphy's signal_type) | 1237 | * @signal: signal strength value (type depends on the wiphy's signal_type) |
| 1207 | * @free_priv: function pointer to free private data | 1238 | * @free_priv: function pointer to free private data |
| 1208 | * @priv: private area for driver use, has at least wiphy->bss_priv_size bytes | 1239 | * @priv: private area for driver use, has at least wiphy->bss_priv_size bytes |
| 1209 | */ | 1240 | */ |
| 1210 | struct cfg80211_bss { | 1241 | struct cfg80211_bss { |
| 1242 | u64 tsf; | ||
| 1243 | |||
| 1211 | struct ieee80211_channel *channel; | 1244 | struct ieee80211_channel *channel; |
| 1212 | 1245 | ||
| 1213 | u8 bssid[ETH_ALEN]; | 1246 | const struct cfg80211_bss_ies __rcu *ies; |
| 1214 | u64 tsf; | 1247 | const struct cfg80211_bss_ies __rcu *beacon_ies; |
| 1248 | const struct cfg80211_bss_ies __rcu *proberesp_ies; | ||
| 1249 | |||
| 1250 | void (*free_priv)(struct cfg80211_bss *bss); | ||
| 1251 | |||
| 1252 | s32 signal; | ||
| 1253 | |||
| 1215 | u16 beacon_interval; | 1254 | u16 beacon_interval; |
| 1216 | u16 capability; | 1255 | u16 capability; |
| 1217 | u8 *information_elements; | ||
| 1218 | size_t len_information_elements; | ||
| 1219 | u8 *beacon_ies; | ||
| 1220 | size_t len_beacon_ies; | ||
| 1221 | u8 *proberesp_ies; | ||
| 1222 | size_t len_proberesp_ies; | ||
| 1223 | 1256 | ||
| 1224 | s32 signal; | 1257 | u8 bssid[ETH_ALEN]; |
| 1225 | 1258 | ||
| 1226 | void (*free_priv)(struct cfg80211_bss *bss); | ||
| 1227 | u8 priv[0] __attribute__((__aligned__(sizeof(void *)))); | 1259 | u8 priv[0] __attribute__((__aligned__(sizeof(void *)))); |
| 1228 | }; | 1260 | }; |
| 1229 | 1261 | ||
| @@ -1231,6 +1263,9 @@ struct cfg80211_bss { | |||
| 1231 | * ieee80211_bss_get_ie - find IE with given ID | 1263 | * ieee80211_bss_get_ie - find IE with given ID |
| 1232 | * @bss: the bss to search | 1264 | * @bss: the bss to search |
| 1233 | * @ie: the IE ID | 1265 | * @ie: the IE ID |
| 1266 | * | ||
| 1267 | * Note that the return value is an RCU-protected pointer, so | ||
| 1268 | * rcu_read_lock() must be held when calling this function. | ||
| 1234 | * Returns %NULL if not found. | 1269 | * Returns %NULL if not found. |
| 1235 | */ | 1270 | */ |
| 1236 | const u8 *ieee80211_bss_get_ie(struct cfg80211_bss *bss, u8 ie); | 1271 | const u8 *ieee80211_bss_get_ie(struct cfg80211_bss *bss, u8 ie); |
diff --git a/include/net/ieee80211_radiotap.h b/include/net/ieee80211_radiotap.h index 7f0df133d119..c3999632e616 100644 --- a/include/net/ieee80211_radiotap.h +++ b/include/net/ieee80211_radiotap.h | |||
| @@ -186,6 +186,10 @@ struct ieee80211_radiotap_header { | |||
| 186 | * IEEE80211_RADIOTAP_AMPDU_STATUS u32, u16, u8, u8 unitless | 186 | * IEEE80211_RADIOTAP_AMPDU_STATUS u32, u16, u8, u8 unitless |
| 187 | * | 187 | * |
| 188 | * Contains the AMPDU information for the subframe. | 188 | * Contains the AMPDU information for the subframe. |
| 189 | * | ||
| 190 | * IEEE80211_RADIOTAP_VHT u16, u8, u8, u8[4], u8, u8, u16 | ||
| 191 | * | ||
| 192 | * Contains VHT information about this frame. | ||
| 189 | */ | 193 | */ |
| 190 | enum ieee80211_radiotap_type { | 194 | enum ieee80211_radiotap_type { |
| 191 | IEEE80211_RADIOTAP_TSFT = 0, | 195 | IEEE80211_RADIOTAP_TSFT = 0, |
| @@ -209,6 +213,7 @@ enum ieee80211_radiotap_type { | |||
| 209 | 213 | ||
| 210 | IEEE80211_RADIOTAP_MCS = 19, | 214 | IEEE80211_RADIOTAP_MCS = 19, |
| 211 | IEEE80211_RADIOTAP_AMPDU_STATUS = 20, | 215 | IEEE80211_RADIOTAP_AMPDU_STATUS = 20, |
| 216 | IEEE80211_RADIOTAP_VHT = 21, | ||
| 212 | 217 | ||
| 213 | /* valid in every it_present bitmap, even vendor namespaces */ | 218 | /* valid in every it_present bitmap, even vendor namespaces */ |
| 214 | IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE = 29, | 219 | IEEE80211_RADIOTAP_RADIOTAP_NAMESPACE = 29, |
| @@ -282,6 +287,25 @@ enum ieee80211_radiotap_type { | |||
| 282 | #define IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_ERR 0x0010 | 287 | #define IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_ERR 0x0010 |
| 283 | #define IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_KNOWN 0x0020 | 288 | #define IEEE80211_RADIOTAP_AMPDU_DELIM_CRC_KNOWN 0x0020 |
| 284 | 289 | ||
| 290 | /* For IEEE80211_RADIOTAP_VHT */ | ||
| 291 | #define IEEE80211_RADIOTAP_VHT_KNOWN_STBC 0x0001 | ||
| 292 | #define IEEE80211_RADIOTAP_VHT_KNOWN_TXOP_PS_NA 0x0002 | ||
| 293 | #define IEEE80211_RADIOTAP_VHT_KNOWN_GI 0x0004 | ||
| 294 | #define IEEE80211_RADIOTAP_VHT_KNOWN_SGI_NSYM_DIS 0x0008 | ||
| 295 | #define IEEE80211_RADIOTAP_VHT_KNOWN_LDPC_EXTRA_OFDM_SYM 0x0010 | ||
| 296 | #define IEEE80211_RADIOTAP_VHT_KNOWN_BEAMFORMED 0x0020 | ||
| 297 | #define IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH 0x0040 | ||
| 298 | #define IEEE80211_RADIOTAP_VHT_KNOWN_GROUP_ID 0x0080 | ||
| 299 | #define IEEE80211_RADIOTAP_VHT_KNOWN_PARTIAL_AID 0x0100 | ||
| 300 | |||
| 301 | #define IEEE80211_RADIOTAP_VHT_FLAG_STBC 0x01 | ||
| 302 | #define IEEE80211_RADIOTAP_VHT_FLAG_TXOP_PS_NA 0x02 | ||
| 303 | #define IEEE80211_RADIOTAP_VHT_FLAG_SGI 0x04 | ||
| 304 | #define IEEE80211_RADIOTAP_VHT_FLAG_SGI_NSYM_M10_9 0x08 | ||
| 305 | #define IEEE80211_RADIOTAP_VHT_FLAG_LDPC_EXTRA_OFDM_SYM 0x10 | ||
| 306 | #define IEEE80211_RADIOTAP_VHT_FLAG_BEAMFORMED 0x20 | ||
| 307 | |||
| 308 | |||
| 285 | /* helpers */ | 309 | /* helpers */ |
| 286 | static inline int ieee80211_get_radiotap_len(unsigned char *data) | 310 | static inline int ieee80211_get_radiotap_len(unsigned char *data) |
| 287 | { | 311 | { |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index db7680acd0da..1c02fb3b3817 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
| @@ -164,7 +164,7 @@ enum ieee80211_chanctx_change { | |||
| 164 | * active on the channel to receive MIMO transmissions | 164 | * active on the channel to receive MIMO transmissions |
| 165 | * @rx_chains_dynamic: The number of RX chains that must be enabled | 165 | * @rx_chains_dynamic: The number of RX chains that must be enabled |
| 166 | * after RTS/CTS handshake to receive SMPS MIMO transmissions; | 166 | * after RTS/CTS handshake to receive SMPS MIMO transmissions; |
| 167 | * this will always be >= @rx_chains_always. | 167 | * this will always be >= @rx_chains_static. |
| 168 | * @drv_priv: data area for driver use, will always be aligned to | 168 | * @drv_priv: data area for driver use, will always be aligned to |
| 169 | * sizeof(void *), size is determined in hw information. | 169 | * sizeof(void *), size is determined in hw information. |
| 170 | */ | 170 | */ |
| @@ -1473,6 +1473,10 @@ enum ieee80211_hw_flags { | |||
| 1473 | * include _FMT. Use %IEEE80211_RADIOTAP_MCS_HAVE_* values, only | 1473 | * include _FMT. Use %IEEE80211_RADIOTAP_MCS_HAVE_* values, only |
| 1474 | * adding _BW is supported today. | 1474 | * adding _BW is supported today. |
| 1475 | * | 1475 | * |
| 1476 | * @radiotap_vht_details: lists which VHT MCS information the HW reports, | ||
| 1477 | * the default is _GI | _BANDWIDTH. | ||
| 1478 | * Use the %IEEE80211_RADIOTAP_VHT_KNOWN_* values. | ||
| 1479 | * | ||
| 1476 | * @netdev_features: netdev features to be set in each netdev created | 1480 | * @netdev_features: netdev features to be set in each netdev created |
| 1477 | * from this HW. Note only HW checksum features are currently | 1481 | * from this HW. Note only HW checksum features are currently |
| 1478 | * compatible with mac80211. Other feature bits will be rejected. | 1482 | * compatible with mac80211. Other feature bits will be rejected. |
| @@ -1499,6 +1503,7 @@ struct ieee80211_hw { | |||
| 1499 | u8 max_tx_aggregation_subframes; | 1503 | u8 max_tx_aggregation_subframes; |
| 1500 | u8 offchannel_tx_hw_queue; | 1504 | u8 offchannel_tx_hw_queue; |
| 1501 | u8 radiotap_mcs_details; | 1505 | u8 radiotap_mcs_details; |
| 1506 | u16 radiotap_vht_details; | ||
| 1502 | netdev_features_t netdev_features; | 1507 | netdev_features_t netdev_features; |
| 1503 | }; | 1508 | }; |
| 1504 | 1509 | ||
| @@ -3139,8 +3144,7 @@ struct sk_buff *ieee80211_nullfunc_get(struct ieee80211_hw *hw, | |||
| 3139 | * @vif: &struct ieee80211_vif pointer from the add_interface callback. | 3144 | * @vif: &struct ieee80211_vif pointer from the add_interface callback. |
| 3140 | * @ssid: SSID buffer | 3145 | * @ssid: SSID buffer |
| 3141 | * @ssid_len: length of SSID | 3146 | * @ssid_len: length of SSID |
| 3142 | * @ie: buffer containing all IEs except SSID for the template | 3147 | * @tailroom: tailroom to reserve at end of SKB for IEs |
| 3143 | * @ie_len: length of the IE buffer | ||
| 3144 | * | 3148 | * |
| 3145 | * Creates a Probe Request template which can, for example, be uploaded to | 3149 | * Creates a Probe Request template which can, for example, be uploaded to |
| 3146 | * hardware. | 3150 | * hardware. |
| @@ -3148,7 +3152,7 @@ struct sk_buff *ieee80211_nullfunc_get(struct ieee80211_hw *hw, | |||
| 3148 | struct sk_buff *ieee80211_probereq_get(struct ieee80211_hw *hw, | 3152 | struct sk_buff *ieee80211_probereq_get(struct ieee80211_hw *hw, |
| 3149 | struct ieee80211_vif *vif, | 3153 | struct ieee80211_vif *vif, |
| 3150 | const u8 *ssid, size_t ssid_len, | 3154 | const u8 *ssid, size_t ssid_len, |
| 3151 | const u8 *ie, size_t ie_len); | 3155 | size_t tailroom); |
| 3152 | 3156 | ||
| 3153 | /** | 3157 | /** |
| 3154 | * ieee80211_rts_get - RTS frame generation function | 3158 | * ieee80211_rts_get - RTS frame generation function |
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index 33a417481ad8..e3e19f8b16f2 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h | |||
| @@ -1303,6 +1303,13 @@ enum nl80211_commands { | |||
| 1303 | * | 1303 | * |
| 1304 | * @NL80211_ATTR_SCAN_FLAGS: scan request control flags (u32) | 1304 | * @NL80211_ATTR_SCAN_FLAGS: scan request control flags (u32) |
| 1305 | * | 1305 | * |
| 1306 | * @NL80211_ATTR_P2P_CTWINDOW: P2P GO Client Traffic Window (u8), used with | ||
| 1307 | * the START_AP and SET_BSS commands | ||
| 1308 | * @NL80211_ATTR_P2P_OPPPS: P2P GO opportunistic PS (u8), used with the | ||
| 1309 | * START_AP and SET_BSS commands. This can have the values 0 or 1; | ||
| 1310 | * if not given in START_AP 0 is assumed, if not given in SET_BSS | ||
| 1311 | * no change is made. | ||
| 1312 | * | ||
| 1306 | * @NL80211_ATTR_MAX: highest attribute number currently defined | 1313 | * @NL80211_ATTR_MAX: highest attribute number currently defined |
| 1307 | * @__NL80211_ATTR_AFTER_LAST: internal use | 1314 | * @__NL80211_ATTR_AFTER_LAST: internal use |
| 1308 | */ | 1315 | */ |
| @@ -1570,6 +1577,9 @@ enum nl80211_attrs { | |||
| 1570 | NL80211_ATTR_CENTER_FREQ1, | 1577 | NL80211_ATTR_CENTER_FREQ1, |
| 1571 | NL80211_ATTR_CENTER_FREQ2, | 1578 | NL80211_ATTR_CENTER_FREQ2, |
| 1572 | 1579 | ||
| 1580 | NL80211_ATTR_P2P_CTWINDOW, | ||
| 1581 | NL80211_ATTR_P2P_OPPPS, | ||
| 1582 | |||
| 1573 | /* add attributes here, update the policy in nl80211.c */ | 1583 | /* add attributes here, update the policy in nl80211.c */ |
| 1574 | 1584 | ||
| 1575 | __NL80211_ATTR_AFTER_LAST, | 1585 | __NL80211_ATTR_AFTER_LAST, |
| @@ -3126,6 +3136,10 @@ enum nl80211_ap_sme_features { | |||
| 3126 | * @NL80211_FEATURE_NEED_OBSS_SCAN: The driver expects userspace to perform | 3136 | * @NL80211_FEATURE_NEED_OBSS_SCAN: The driver expects userspace to perform |
| 3127 | * OBSS scans and generate 20/40 BSS coex reports. This flag is used only | 3137 | * OBSS scans and generate 20/40 BSS coex reports. This flag is used only |
| 3128 | * for drivers implementing the CONNECT API, for AUTH/ASSOC it is implied. | 3138 | * for drivers implementing the CONNECT API, for AUTH/ASSOC it is implied. |
| 3139 | * @NL80211_FEATURE_P2P_GO_CTWIN: P2P GO implementation supports CT Window | ||
| 3140 | * setting | ||
| 3141 | * @NL80211_FEATURE_P2P_GO_OPPPS: P2P GO implementation supports opportunistic | ||
| 3142 | * powersave | ||
| 3129 | */ | 3143 | */ |
| 3130 | enum nl80211_feature_flags { | 3144 | enum nl80211_feature_flags { |
| 3131 | NL80211_FEATURE_SK_TX_STATUS = 1 << 0, | 3145 | NL80211_FEATURE_SK_TX_STATUS = 1 << 0, |
| @@ -3139,6 +3153,8 @@ enum nl80211_feature_flags { | |||
| 3139 | NL80211_FEATURE_AP_SCAN = 1 << 8, | 3153 | NL80211_FEATURE_AP_SCAN = 1 << 8, |
| 3140 | NL80211_FEATURE_VIF_TXPOWER = 1 << 9, | 3154 | NL80211_FEATURE_VIF_TXPOWER = 1 << 9, |
| 3141 | NL80211_FEATURE_NEED_OBSS_SCAN = 1 << 10, | 3155 | NL80211_FEATURE_NEED_OBSS_SCAN = 1 << 10, |
| 3156 | NL80211_FEATURE_P2P_GO_CTWIN = 1 << 11, | ||
| 3157 | NL80211_FEATURE_P2P_GO_OPPPS = 1 << 12, | ||
| 3142 | }; | 3158 | }; |
| 3143 | 3159 | ||
| 3144 | /** | 3160 | /** |
