0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef CW1200_WSM_H_INCLUDED
0014 #define CW1200_WSM_H_INCLUDED
0015
0016 #include <linux/spinlock.h>
0017
0018 struct cw1200_common;
0019
0020
0021
0022 #define WSM_PHY_BAND_2_4G (0)
0023
0024
0025 #define WSM_PHY_BAND_5G (1)
0026
0027
0028
0029 #define WSM_TRANSMIT_RATE_1 (0)
0030
0031
0032 #define WSM_TRANSMIT_RATE_2 (1)
0033
0034
0035 #define WSM_TRANSMIT_RATE_5 (2)
0036
0037
0038 #define WSM_TRANSMIT_RATE_11 (3)
0039
0040
0041
0042
0043
0044
0045
0046
0047 #define WSM_TRANSMIT_RATE_6 (6)
0048
0049
0050 #define WSM_TRANSMIT_RATE_9 (7)
0051
0052
0053 #define WSM_TRANSMIT_RATE_12 (8)
0054
0055
0056 #define WSM_TRANSMIT_RATE_18 (9)
0057
0058
0059 #define WSM_TRANSMIT_RATE_24 (10)
0060
0061
0062 #define WSM_TRANSMIT_RATE_36 (11)
0063
0064
0065 #define WSM_TRANSMIT_RATE_48 (12)
0066
0067
0068 #define WSM_TRANSMIT_RATE_54 (13)
0069
0070
0071 #define WSM_TRANSMIT_RATE_HT_6 (14)
0072
0073
0074 #define WSM_TRANSMIT_RATE_HT_13 (15)
0075
0076
0077 #define WSM_TRANSMIT_RATE_HT_19 (16)
0078
0079
0080 #define WSM_TRANSMIT_RATE_HT_26 (17)
0081
0082
0083 #define WSM_TRANSMIT_RATE_HT_39 (18)
0084
0085
0086 #define WSM_TRANSMIT_RATE_HT_52 (19)
0087
0088
0089 #define WSM_TRANSMIT_RATE_HT_58 (20)
0090
0091
0092 #define WSM_TRANSMIT_RATE_HT_65 (21)
0093
0094
0095
0096 #define WSM_SCAN_TYPE_FOREGROUND (0)
0097
0098
0099 #define WSM_SCAN_TYPE_BACKGROUND (1)
0100
0101
0102 #define WSM_SCAN_TYPE_AUTO (2)
0103
0104
0105
0106
0107
0108
0109 #define WSM_SCAN_FLAG_FORCE_BACKGROUND (BIT(0))
0110
0111
0112
0113 #define WSM_SCAN_FLAG_SPLIT_METHOD (BIT(1))
0114
0115
0116 #define WSM_SCAN_FLAG_SHORT_PREAMBLE (BIT(2))
0117
0118
0119 #define WSM_SCAN_FLAG_11N_GREENFIELD (BIT(3))
0120
0121
0122
0123 #define WSM_SCAN_MAX_NUM_OF_CHANNELS (48)
0124
0125
0126 #define WSM_SCAN_MAX_NUM_OF_SSIDS (2)
0127
0128
0129
0130 #define WSM_PSM_ACTIVE (0)
0131
0132
0133 #define WSM_PSM_PS BIT(0)
0134
0135
0136 #define WSM_PSM_FAST_PS_FLAG BIT(7)
0137
0138
0139 #define WSM_PSM_FAST_PS (BIT(0) | BIT(7))
0140
0141
0142
0143
0144
0145 #define WSM_PSM_UNKNOWN BIT(1)
0146
0147
0148
0149 #define WSM_QUEUE_BEST_EFFORT (0)
0150
0151
0152 #define WSM_QUEUE_BACKGROUND (1)
0153
0154
0155 #define WSM_QUEUE_VIDEO (2)
0156
0157
0158 #define WSM_QUEUE_VOICE (3)
0159
0160
0161
0162 #define WSM_HT_TX_NON_HT (0)
0163
0164
0165 #define WSM_HT_TX_MIXED (1)
0166
0167
0168 #define WSM_HT_TX_GREENFIELD (2)
0169
0170
0171 #define WSM_HT_TX_STBC (BIT(7))
0172
0173
0174
0175 #define WSM_EPTA_PRIORITY_DEFAULT 4
0176
0177 #define WSM_EPTA_PRIORITY_DATA 4
0178
0179 #define WSM_EPTA_PRIORITY_MGT 5
0180
0181 #define WSM_EPTA_PRIORITY_ACTION 5
0182
0183 #define WSM_EPTA_PRIORITY_VIDEO 5
0184
0185 #define WSM_EPTA_PRIORITY_VOICE 6
0186
0187 #define WSM_EPTA_PRIORITY_EAPOL 7
0188
0189
0190
0191
0192 #define WSM_TX_STATUS_AGGREGATION (BIT(0))
0193
0194
0195
0196 #define WSM_TX_STATUS_REQUEUE (BIT(1))
0197
0198
0199 #define WSM_TX_STATUS_NORMAL_ACK (0<<2)
0200
0201
0202 #define WSM_TX_STATUS_NO_ACK (1<<2)
0203
0204
0205 #define WSM_TX_STATUS_NO_EXPLICIT_ACK (2<<2)
0206
0207
0208
0209 #define WSM_TX_STATUS_BLOCK_ACK (3<<2)
0210
0211
0212
0213 #define WSM_RX_STATUS_UNENCRYPTED (0<<0)
0214
0215
0216 #define WSM_RX_STATUS_WEP (1<<0)
0217
0218
0219 #define WSM_RX_STATUS_TKIP (2<<0)
0220
0221
0222 #define WSM_RX_STATUS_AES (3<<0)
0223
0224
0225 #define WSM_RX_STATUS_WAPI (4<<0)
0226
0227
0228 #define WSM_RX_STATUS_ENCRYPTION(status) ((status) & 0x07)
0229
0230
0231 #define WSM_RX_STATUS_AGGREGATE (BIT(3))
0232
0233
0234 #define WSM_RX_STATUS_AGGREGATE_FIRST (BIT(4))
0235
0236
0237 #define WSM_RX_STATUS_AGGREGATE_LAST (BIT(5))
0238
0239
0240 #define WSM_RX_STATUS_DEFRAGMENTED (BIT(6))
0241
0242
0243 #define WSM_RX_STATUS_BEACON (BIT(7))
0244
0245
0246 #define WSM_RX_STATUS_TIM (BIT(8))
0247
0248
0249 #define WSM_RX_STATUS_MULTICAST (BIT(9))
0250
0251
0252 #define WSM_RX_STATUS_MATCHING_SSID (BIT(10))
0253
0254
0255 #define WSM_RX_STATUS_MATCHING_BSSI (BIT(11))
0256
0257
0258 #define WSM_RX_STATUS_MORE_DATA (BIT(12))
0259
0260
0261 #define WSM_RX_STATUS_MEASUREMENT (BIT(13))
0262
0263
0264 #define WSM_RX_STATUS_HT (BIT(14))
0265
0266
0267 #define WSM_RX_STATUS_STBC (BIT(15))
0268
0269
0270 #define WSM_RX_STATUS_ADDRESS1 (BIT(16))
0271
0272
0273 #define WSM_RX_STATUS_GROUP (BIT(17))
0274
0275
0276 #define WSM_RX_STATUS_BROADCAST (BIT(18))
0277
0278
0279 #define WSM_RX_STATUS_GROUP_KEY (BIT(19))
0280
0281
0282 #define WSM_RX_STATUS_KEY_IDX(status) (((status >> 20)) & 0x0F)
0283
0284
0285 #define WSM_RX_STATUS_TSF_INCLUDED (BIT(24))
0286
0287
0288 #define WSM_TX_2BYTES_SHIFT (BIT(7))
0289
0290
0291
0292 #define WSM_JOIN_MODE_IBSS (0)
0293
0294
0295 #define WSM_JOIN_MODE_BSS (1)
0296
0297
0298
0299 #define WSM_JOIN_PREAMBLE_LONG (0)
0300
0301
0302 #define WSM_JOIN_PREAMBLE_SHORT (1)
0303
0304
0305 #define WSM_JOIN_PREAMBLE_SHORT_2 (2)
0306
0307
0308
0309 #define WSM_JOIN_FLAGS_UNSYNCRONIZED BIT(0)
0310
0311 #define WSM_JOIN_FLAGS_P2P_GO BIT(1)
0312
0313
0314
0315
0316 #define WSM_JOIN_FLAGS_FORCE BIT(2)
0317
0318
0319
0320 #define WSM_JOIN_FLAGS_PRIO BIT(3)
0321
0322
0323
0324 #define WSM_JOIN_FLAGS_FORCE_WITH_COMPLETE_IND BIT(5)
0325
0326
0327 #define WSM_KEY_TYPE_WEP_DEFAULT (0)
0328 #define WSM_KEY_TYPE_WEP_PAIRWISE (1)
0329 #define WSM_KEY_TYPE_TKIP_GROUP (2)
0330 #define WSM_KEY_TYPE_TKIP_PAIRWISE (3)
0331 #define WSM_KEY_TYPE_AES_GROUP (4)
0332 #define WSM_KEY_TYPE_AES_PAIRWISE (5)
0333 #define WSM_KEY_TYPE_WAPI_GROUP (6)
0334 #define WSM_KEY_TYPE_WAPI_PAIRWISE (7)
0335
0336
0337 #define WSM_KEY_MAX_INDEX (10)
0338
0339
0340 #define WSM_ACK_POLICY_NORMAL (0)
0341 #define WSM_ACK_POLICY_NO_ACK (1)
0342
0343
0344 #define WSM_START_MODE_AP (0)
0345 #define WSM_START_MODE_P2P_GO (1)
0346 #define WSM_START_MODE_P2P_DEV (2)
0347
0348
0349 #define WSM_ASSOCIATION_MODE_USE_PREAMBLE_TYPE (BIT(0))
0350 #define WSM_ASSOCIATION_MODE_USE_HT_MODE (BIT(1))
0351 #define WSM_ASSOCIATION_MODE_USE_BASIC_RATE_SET (BIT(2))
0352 #define WSM_ASSOCIATION_MODE_USE_MPDU_START_SPACING (BIT(3))
0353 #define WSM_ASSOCIATION_MODE_SNOOP_ASSOC_FRAMES (BIT(4))
0354
0355
0356 #define WSM_RCPI_RSSI_THRESHOLD_ENABLE (BIT(0))
0357 #define WSM_RCPI_RSSI_USE_RSSI (BIT(1))
0358 #define WSM_RCPI_RSSI_DONT_USE_UPPER (BIT(2))
0359 #define WSM_RCPI_RSSI_DONT_USE_LOWER (BIT(3))
0360
0361
0362 #define WSM_UPDATE_IE_BEACON (BIT(0))
0363 #define WSM_UPDATE_IE_PROBE_RESP (BIT(1))
0364 #define WSM_UPDATE_IE_PROBE_REQ (BIT(2))
0365
0366
0367
0368 #define WSM_EVENT_ERROR (0)
0369
0370
0371 #define WSM_EVENT_BSS_LOST (1)
0372
0373
0374 #define WSM_EVENT_BSS_REGAINED (2)
0375
0376
0377 #define WSM_EVENT_RADAR_DETECTED (3)
0378
0379
0380 #define WSM_EVENT_RCPI_RSSI (4)
0381
0382
0383 #define WSM_EVENT_BT_INACTIVE (5)
0384
0385
0386 #define WSM_EVENT_BT_ACTIVE (6)
0387
0388
0389
0390 #define WSM_MIB_ID_DOT11_STATION_ID 0x0000
0391
0392
0393 #define WSM_MIB_ID_DOT11_MAX_TRANSMIT_LIFTIME 0x0001
0394
0395
0396 #define WSM_MIB_ID_DOT11_MAX_RECEIVE_LIFETIME 0x0002
0397
0398
0399 #define WSM_MIB_ID_DOT11_SLOT_TIME 0x0003
0400
0401
0402 #define WSM_MIB_ID_DOT11_GROUP_ADDRESSES_TABLE 0x0004
0403 #define WSM_MAX_GRP_ADDRTABLE_ENTRIES 8
0404
0405
0406 #define WSM_MIB_ID_DOT11_WEP_DEFAULT_KEY_ID 0x0005
0407
0408
0409 #define WSM_MIB_ID_DOT11_CURRENT_TX_POWER_LEVEL 0x0006
0410
0411
0412 #define WSM_MIB_ID_DOT11_RTS_THRESHOLD 0x0007
0413
0414
0415 #define WSM_MIB_ID_NON_ERP_PROTECTION 0x1000
0416
0417
0418 #define WSM_MIB_ID_ARP_IP_ADDRESSES_TABLE 0x1001
0419 #define WSM_MAX_ARP_IP_ADDRTABLE_ENTRIES 1
0420
0421
0422 #define WSM_MIB_ID_TEMPLATE_FRAME 0x1002
0423
0424
0425 #define WSM_MIB_ID_RX_FILTER 0x1003
0426
0427
0428 #define WSM_MIB_ID_BEACON_FILTER_TABLE 0x1004
0429
0430
0431 #define WSM_MIB_ID_BEACON_FILTER_ENABLE 0x1005
0432
0433
0434 #define WSM_MIB_ID_OPERATIONAL_POWER_MODE 0x1006
0435
0436
0437 #define WSM_MIB_ID_BEACON_WAKEUP_PERIOD 0x1007
0438
0439
0440 #define WSM_MIB_ID_RCPI_RSSI_THRESHOLD 0x1009
0441
0442
0443 #define WSM_MIB_ID_STATISTICS_TABLE 0x100A
0444
0445
0446 #define WSM_MIB_ID_IBSS_PS_CONFIG 0x100B
0447
0448
0449 #define WSM_MIB_ID_COUNTERS_TABLE 0x100C
0450
0451
0452 #define WSM_MIB_ID_BLOCK_ACK_POLICY 0x100E
0453
0454
0455 #define WSM_MIB_ID_OVERRIDE_INTERNAL_TX_RATE 0x100F
0456
0457
0458 #define WSM_MIB_ID_SET_ASSOCIATION_MODE 0x1010
0459
0460
0461 #define WSM_MIB_ID_UPDATE_EPTA_CONFIG_DATA 0x1011
0462
0463
0464 #define WSM_MIB_ID_SELECT_CCA_METHOD 0x1012
0465
0466
0467 #define WSM_MIB_ID_SET_UAPSD_INFORMATION 0x1013
0468
0469
0470 #define WSM_MIB_ID_SET_AUTO_CALIBRATION_MODE 0x1015
0471
0472
0473 #define WSM_MIB_ID_SET_TX_RATE_RETRY_POLICY 0x1016
0474
0475
0476 #define WSM_MIB_ID_SET_HOST_MSG_TYPE_FILTER 0x1017
0477
0478
0479 #define WSM_MIB_ID_P2P_FIND_INFO 0x1018
0480
0481
0482 #define WSM_MIB_ID_P2P_PS_MODE_INFO 0x1019
0483
0484
0485 #define WSM_MIB_ID_SET_ETHERTYPE_DATAFRAME_FILTER 0x101A
0486
0487
0488 #define WSM_MIB_ID_SET_UDPPORT_DATAFRAME_FILTER 0x101B
0489
0490
0491 #define WSM_MIB_ID_SET_MAGIC_DATAFRAME_FILTER 0x101C
0492
0493
0494 #define WSM_MIB_ID_P2P_DEVICE_INFO 0x101D
0495
0496
0497 #define WSM_MIB_ID_SET_WCDMA_BAND 0x101E
0498
0499
0500 #define WSM_MIB_ID_GRP_SEQ_COUNTER 0x101F
0501
0502
0503 #define WSM_MIB_ID_PROTECTED_MGMT_POLICY 0x1020
0504
0505
0506 #define WSM_MIB_ID_SET_HT_PROTECTION 0x1021
0507
0508
0509 #define WSM_MIB_ID_GPIO_COMMAND 0x1022
0510
0511
0512 #define WSM_MIB_ID_TSF_COUNTER 0x1023
0513
0514
0515 #define WSM_MIB_ID_BLOCK_ACK_INFO 0x100D
0516
0517
0518 #define WSM_MIB_USE_MULTI_TX_CONF 0x1024
0519
0520
0521 #define WSM_MIB_ID_KEEP_ALIVE_PERIOD 0x1025
0522
0523
0524 #define WSM_MIB_ID_DISABLE_BSSID_FILTER 0x1026
0525
0526
0527 #define WSM_FRAME_TYPE_PROBE_REQUEST (0)
0528 #define WSM_FRAME_TYPE_BEACON (1)
0529 #define WSM_FRAME_TYPE_NULL (2)
0530 #define WSM_FRAME_TYPE_QOS_NULL (3)
0531 #define WSM_FRAME_TYPE_PS_POLL (4)
0532 #define WSM_FRAME_TYPE_PROBE_RESPONSE (5)
0533
0534 #define WSM_FRAME_GREENFIELD (0x80)
0535
0536
0537
0538
0539 #define WSM_STATUS_SUCCESS (0)
0540
0541
0542
0543 #define WSM_STATUS_FAILURE (1)
0544
0545
0546 #define WSM_INVALID_PARAMETER (2)
0547
0548
0549
0550 #define WSM_ACCESS_DENIED (3)
0551
0552
0553 #define WSM_STATUS_DECRYPTFAILURE (4)
0554
0555
0556 #define WSM_STATUS_MICFAILURE (5)
0557
0558
0559
0560 #define WSM_STATUS_RETRY_EXCEEDED (6)
0561
0562
0563
0564 #define WSM_STATUS_TX_LIFETIME_EXCEEDED (7)
0565
0566
0567 #define WSM_STATUS_LINK_LOST (8)
0568
0569
0570 #define WSM_STATUS_NO_KEY_FOUND (9)
0571
0572
0573 #define WSM_STATUS_JAMMER_DETECTED (10)
0574
0575
0576
0577 #define WSM_REQUEUE (11)
0578
0579
0580 #define WSM_MAX_FILTER_ELEMENTS (4)
0581
0582 #define WSM_FILTER_ACTION_IGNORE (0)
0583 #define WSM_FILTER_ACTION_FILTER_IN (1)
0584 #define WSM_FILTER_ACTION_FILTER_OUT (2)
0585
0586 #define WSM_FILTER_PORT_TYPE_DST (0)
0587 #define WSM_FILTER_PORT_TYPE_SRC (1)
0588
0589
0590 struct wsm_hdr {
0591 __le16 len;
0592 __le16 id;
0593 };
0594
0595 #define WSM_TX_SEQ_MAX (7)
0596 #define WSM_TX_SEQ(seq) \
0597 ((seq & WSM_TX_SEQ_MAX) << 13)
0598 #define WSM_TX_LINK_ID_MAX (0x0F)
0599 #define WSM_TX_LINK_ID(link_id) \
0600 ((link_id & WSM_TX_LINK_ID_MAX) << 6)
0601
0602 #define MAX_BEACON_SKIP_TIME_MS 1000
0603
0604 #define WSM_CMD_LAST_CHANCE_TIMEOUT (HZ * 3 / 2)
0605
0606
0607
0608
0609 #define WSM_STARTUP_IND_ID 0x0801
0610
0611 struct wsm_startup_ind {
0612 u16 input_buffers;
0613 u16 input_buffer_size;
0614 u16 status;
0615 u16 hw_id;
0616 u16 hw_subid;
0617 u16 fw_cap;
0618 u16 fw_type;
0619 u16 fw_api;
0620 u16 fw_build;
0621 u16 fw_ver;
0622 char fw_label[128];
0623 u32 config[4];
0624 };
0625
0626
0627
0628
0629
0630 #define WSM_CONFIGURATION_REQ_ID 0x0009
0631 #define WSM_CONFIGURATION_RESP_ID 0x0409
0632
0633 struct wsm_tx_power_range {
0634 int min_power_level;
0635 int max_power_level;
0636 u32 stepping;
0637 };
0638
0639 struct wsm_configuration {
0640 u32 dot11MaxTransmitMsduLifeTime;
0641 u32 dot11MaxReceiveLifeTime;
0642 u32 dot11RtsThreshold;
0643 u8 *dot11StationId;
0644 const void *dpdData;
0645 size_t dpdData_size;
0646 u8 dot11FrequencyBandsSupported;
0647 u32 supportedRateMask;
0648 struct wsm_tx_power_range txPowerRange[2];
0649 };
0650
0651 int wsm_configuration(struct cw1200_common *priv,
0652 struct wsm_configuration *arg);
0653
0654
0655 #define WSM_RESET_REQ_ID 0x000A
0656 #define WSM_RESET_RESP_ID 0x040A
0657 struct wsm_reset {
0658 int link_id;
0659 bool reset_statistics;
0660 };
0661
0662 int wsm_reset(struct cw1200_common *priv, const struct wsm_reset *arg);
0663
0664
0665 #define WSM_READ_MIB_REQ_ID 0x0005
0666 #define WSM_READ_MIB_RESP_ID 0x0405
0667 int wsm_read_mib(struct cw1200_common *priv, u16 mib_id, void *buf,
0668 size_t buf_size);
0669
0670
0671 #define WSM_WRITE_MIB_REQ_ID 0x0006
0672 #define WSM_WRITE_MIB_RESP_ID 0x0406
0673 int wsm_write_mib(struct cw1200_common *priv, u16 mib_id, void *buf,
0674 size_t buf_size);
0675
0676
0677 #define WSM_START_SCAN_REQ_ID 0x0007
0678 #define WSM_START_SCAN_RESP_ID 0x0407
0679
0680 struct wsm_ssid {
0681 u8 ssid[32];
0682 u32 length;
0683 };
0684
0685 struct wsm_scan_ch {
0686 u16 number;
0687 u32 min_chan_time;
0688 u32 max_chan_time;
0689 u32 tx_power_level;
0690 };
0691
0692 struct wsm_scan {
0693
0694 u8 band;
0695
0696
0697 u8 type;
0698
0699
0700 u8 flags;
0701
0702
0703 u8 max_tx_rate;
0704
0705
0706
0707
0708 u32 auto_scan_interval;
0709
0710
0711
0712
0713
0714
0715 u32 num_probes;
0716
0717
0718
0719 u8 num_channels;
0720
0721
0722
0723
0724 u8 num_ssids;
0725
0726
0727
0728 u8 probe_delay;
0729
0730
0731 struct wsm_ssid *ssids;
0732
0733
0734 struct wsm_scan_ch *ch;
0735 };
0736
0737 int wsm_scan(struct cw1200_common *priv, const struct wsm_scan *arg);
0738
0739
0740 #define WSM_STOP_SCAN_REQ_ID 0x0008
0741 #define WSM_STOP_SCAN_RESP_ID 0x0408
0742 int wsm_stop_scan(struct cw1200_common *priv);
0743
0744
0745 #define WSM_SCAN_COMPLETE_IND_ID 0x0806
0746 struct wsm_scan_complete {
0747
0748 u32 status;
0749
0750
0751 u8 psm;
0752
0753
0754 u8 num_channels;
0755 };
0756
0757
0758 #define WSM_TX_CONFIRM_IND_ID 0x0404
0759 #define WSM_MULTI_TX_CONFIRM_ID 0x041E
0760
0761 struct wsm_tx_confirm {
0762
0763 u32 packet_id;
0764
0765
0766 u32 status;
0767
0768
0769 u8 tx_rate;
0770
0771
0772
0773 u8 ack_failures;
0774
0775
0776 u16 flags;
0777
0778
0779
0780 u32 media_delay;
0781
0782
0783
0784 u32 tx_queue_delay;
0785 };
0786
0787
0788
0789
0790
0791
0792
0793
0794
0795
0796
0797
0798
0799 struct wsm_tx {
0800
0801 struct wsm_hdr hdr;
0802
0803
0804 u32 packet_id;
0805
0806
0807 u8 max_tx_rate;
0808
0809
0810 u8 queue_id;
0811
0812
0813 u8 more;
0814
0815
0816
0817
0818
0819
0820 u8 flags;
0821
0822
0823 u32 reserved;
0824
0825
0826
0827
0828
0829
0830 __le32 expire_time;
0831
0832
0833 __le32 ht_tx_parameters;
0834 } __packed;
0835
0836
0837 #define WSM_TX_EXTRA_HEADROOM (28)
0838
0839
0840 #define WSM_RECEIVE_IND_ID 0x0804
0841
0842 struct wsm_rx {
0843
0844 u32 status;
0845
0846
0847 u16 channel_number;
0848
0849
0850 u8 rx_rate;
0851
0852
0853
0854 u8 rcpi_rssi;
0855
0856
0857 u32 flags;
0858 };
0859
0860
0861 #define WSM_RX_EXTRA_HEADROOM (16)
0862
0863
0864 struct wsm_event {
0865
0866 u32 id;
0867
0868
0869
0870
0871
0872 u32 data;
0873 };
0874
0875 struct cw1200_wsm_event {
0876 struct list_head link;
0877 struct wsm_event evt;
0878 };
0879
0880
0881
0882
0883 typedef void (*wsm_event_cb) (struct cw1200_common *priv,
0884 struct wsm_event *arg);
0885
0886
0887 #define WSM_JOIN_REQ_ID 0x000B
0888 #define WSM_JOIN_RESP_ID 0x040B
0889
0890 struct wsm_join {
0891
0892 u8 mode;
0893
0894
0895 u8 band;
0896
0897
0898
0899
0900 u16 channel_number;
0901
0902
0903
0904 u8 bssid[6];
0905
0906
0907
0908
0909 u16 atim_window;
0910
0911
0912 u8 preamble_type;
0913
0914
0915
0916 u8 probe_for_join;
0917
0918
0919 u8 dtim_period;
0920
0921
0922 u8 flags;
0923
0924
0925 u32 ssid_len;
0926
0927
0928 u8 ssid[32];
0929
0930
0931 u32 beacon_interval;
0932
0933
0934 u32 basic_rate_set;
0935 };
0936
0937 struct wsm_join_cnf {
0938 u32 status;
0939
0940
0941 u32 min_power_level;
0942
0943
0944 u32 max_power_level;
0945 };
0946
0947 int wsm_join(struct cw1200_common *priv, struct wsm_join *arg);
0948
0949
0950 struct wsm_join_complete {
0951
0952 u32 status;
0953 };
0954
0955
0956 #define WSM_SET_PM_REQ_ID 0x0010
0957 #define WSM_SET_PM_RESP_ID 0x0410
0958 struct wsm_set_pm {
0959
0960 u8 mode;
0961
0962
0963 u8 fast_psm_idle_period;
0964
0965
0966 u8 ap_psm_change_period;
0967
0968
0969 u8 min_auto_pspoll_period;
0970 };
0971
0972 int wsm_set_pm(struct cw1200_common *priv, const struct wsm_set_pm *arg);
0973
0974
0975 struct wsm_set_pm_complete {
0976 u8 psm;
0977 };
0978
0979
0980 #define WSM_SET_BSS_PARAMS_REQ_ID 0x0011
0981 #define WSM_SET_BSS_PARAMS_RESP_ID 0x0411
0982 struct wsm_set_bss_params {
0983
0984 u8 reset_beacon_loss;
0985
0986
0987
0988
0989 u8 beacon_lost_count;
0990
0991
0992 u16 aid;
0993
0994
0995 u32 operational_rate_set;
0996 };
0997
0998 int wsm_set_bss_params(struct cw1200_common *priv,
0999 const struct wsm_set_bss_params *arg);
1000
1001
1002 #define WSM_ADD_KEY_REQ_ID 0x000C
1003 #define WSM_ADD_KEY_RESP_ID 0x040C
1004 struct wsm_add_key {
1005 u8 type;
1006 u8 index;
1007 u16 reserved;
1008 union {
1009 struct {
1010 u8 peer[6];
1011 u8 reserved;
1012 u8 keylen;
1013 u8 keydata[16];
1014 } __packed wep_pairwise;
1015 struct {
1016 u8 keyid;
1017 u8 keylen;
1018 u16 reserved;
1019 u8 keydata[16];
1020 } __packed wep_group;
1021 struct {
1022 u8 peer[6];
1023 u16 reserved;
1024 u8 keydata[16];
1025 u8 rx_mic_key[8];
1026 u8 tx_mic_key[8];
1027 } __packed tkip_pairwise;
1028 struct {
1029 u8 keydata[16];
1030 u8 rx_mic_key[8];
1031 u8 keyid;
1032 u8 reserved[3];
1033 u8 rx_seqnum[8];
1034 } __packed tkip_group;
1035 struct {
1036 u8 peer[6];
1037 u16 reserved;
1038 u8 keydata[16];
1039 } __packed aes_pairwise;
1040 struct {
1041 u8 keydata[16];
1042 u8 keyid;
1043 u8 reserved[3];
1044 u8 rx_seqnum[8];
1045 } __packed aes_group;
1046 struct {
1047 u8 peer[6];
1048 u8 keyid;
1049 u8 reserved;
1050 u8 keydata[16];
1051 u8 mic_key[16];
1052 } __packed wapi_pairwise;
1053 struct {
1054 u8 keydata[16];
1055 u8 mic_key[16];
1056 u8 keyid;
1057 u8 reserved[3];
1058 } __packed wapi_group;
1059 } __packed;
1060 } __packed;
1061
1062 int wsm_add_key(struct cw1200_common *priv, const struct wsm_add_key *arg);
1063
1064
1065 #define WSM_REMOVE_KEY_REQ_ID 0x000D
1066 #define WSM_REMOVE_KEY_RESP_ID 0x040D
1067 struct wsm_remove_key {
1068 u8 index;
1069 };
1070
1071 int wsm_remove_key(struct cw1200_common *priv,
1072 const struct wsm_remove_key *arg);
1073
1074
1075 struct wsm_set_tx_queue_params {
1076
1077 u8 ackPolicy;
1078
1079
1080
1081 u16 allowedMediumTime;
1082
1083
1084
1085 u32 maxTransmitLifetime;
1086 };
1087
1088 struct wsm_tx_queue_params {
1089
1090 struct wsm_set_tx_queue_params params[4];
1091 };
1092
1093
1094 #define WSM_TX_QUEUE_SET(queue_params, queue, ack_policy, allowed_time,\
1095 max_life_time) \
1096 do { \
1097 struct wsm_set_tx_queue_params *p = &(queue_params)->params[queue]; \
1098 p->ackPolicy = (ack_policy); \
1099 p->allowedMediumTime = (allowed_time); \
1100 p->maxTransmitLifetime = (max_life_time); \
1101 } while (0)
1102
1103 int wsm_set_tx_queue_params(struct cw1200_common *priv,
1104 const struct wsm_set_tx_queue_params *arg, u8 id);
1105
1106
1107 #define WSM_EDCA_PARAMS_REQ_ID 0x0013
1108 #define WSM_EDCA_PARAMS_RESP_ID 0x0413
1109 struct wsm_edca_queue_params {
1110
1111 u16 cwmin;
1112
1113
1114 u16 cwmax;
1115
1116
1117 u16 aifns;
1118
1119
1120 u16 txop_limit;
1121
1122
1123
1124
1125 u32 max_rx_lifetime;
1126 };
1127
1128 struct wsm_edca_params {
1129
1130 struct wsm_edca_queue_params params[4];
1131 bool uapsd_enable[4];
1132 };
1133
1134 #define TXOP_UNIT 32
1135 #define WSM_EDCA_SET(__edca, __queue, __aifs, __cw_min, __cw_max, __txop, __lifetime,\
1136 __uapsd) \
1137 do { \
1138 struct wsm_edca_queue_params *p = &(__edca)->params[__queue]; \
1139 p->cwmin = __cw_min; \
1140 p->cwmax = __cw_max; \
1141 p->aifns = __aifs; \
1142 p->txop_limit = ((__txop) * TXOP_UNIT); \
1143 p->max_rx_lifetime = __lifetime; \
1144 (__edca)->uapsd_enable[__queue] = (__uapsd); \
1145 } while (0)
1146
1147 int wsm_set_edca_params(struct cw1200_common *priv,
1148 const struct wsm_edca_params *arg);
1149
1150 int wsm_set_uapsd_param(struct cw1200_common *priv,
1151 const struct wsm_edca_params *arg);
1152
1153
1154
1155
1156
1157 #define WSM_SWITCH_CHANNEL_REQ_ID 0x0016
1158 #define WSM_SWITCH_CHANNEL_RESP_ID 0x0416
1159
1160 struct wsm_switch_channel {
1161
1162
1163 u8 mode;
1164
1165
1166
1167
1168 u8 switch_count;
1169
1170
1171
1172 u16 channel_number;
1173 };
1174
1175 int wsm_switch_channel(struct cw1200_common *priv,
1176 const struct wsm_switch_channel *arg);
1177
1178 #define WSM_START_REQ_ID 0x0017
1179 #define WSM_START_RESP_ID 0x0417
1180
1181 struct wsm_start {
1182
1183 u8 mode;
1184
1185
1186 u8 band;
1187
1188
1189 u16 channel_number;
1190
1191
1192
1193 u32 ct_window;
1194
1195
1196
1197 u32 beacon_interval;
1198
1199
1200 u8 dtim_period;
1201
1202
1203 u8 preamble;
1204
1205
1206
1207 u8 probe_delay;
1208
1209
1210 u8 ssid_len;
1211
1212
1213 u8 ssid[32];
1214
1215
1216 u32 basic_rate_set;
1217 };
1218
1219 int wsm_start(struct cw1200_common *priv, const struct wsm_start *arg);
1220
1221 #define WSM_BEACON_TRANSMIT_REQ_ID 0x0018
1222 #define WSM_BEACON_TRANSMIT_RESP_ID 0x0418
1223
1224 struct wsm_beacon_transmit {
1225
1226 u8 enable_beaconing;
1227 };
1228
1229 int wsm_beacon_transmit(struct cw1200_common *priv,
1230 const struct wsm_beacon_transmit *arg);
1231
1232 int wsm_start_find(struct cw1200_common *priv);
1233
1234 int wsm_stop_find(struct cw1200_common *priv);
1235
1236 struct wsm_suspend_resume {
1237
1238
1239 int link_id;
1240
1241 bool stop;
1242
1243 bool multicast;
1244
1245
1246
1247 int queue;
1248 };
1249
1250
1251 struct wsm_update_ie {
1252
1253 u16 what;
1254 u16 count;
1255 u8 *ies;
1256 size_t length;
1257 };
1258
1259 int wsm_update_ie(struct cw1200_common *priv,
1260 const struct wsm_update_ie *arg);
1261
1262
1263 struct wsm_map_link {
1264
1265 u8 mac_addr[6];
1266 u8 link_id;
1267 };
1268
1269 int wsm_map_link(struct cw1200_common *priv, const struct wsm_map_link *arg);
1270
1271
1272
1273
1274 static inline int wsm_set_output_power(struct cw1200_common *priv,
1275 int power_level)
1276 {
1277 __le32 val = __cpu_to_le32(power_level);
1278 return wsm_write_mib(priv, WSM_MIB_ID_DOT11_CURRENT_TX_POWER_LEVEL,
1279 &val, sizeof(val));
1280 }
1281
1282 static inline int wsm_set_beacon_wakeup_period(struct cw1200_common *priv,
1283 unsigned dtim_interval,
1284 unsigned listen_interval)
1285 {
1286 struct {
1287 u8 numBeaconPeriods;
1288 u8 reserved;
1289 __le16 listenInterval;
1290 } val = {
1291 dtim_interval, 0, __cpu_to_le16(listen_interval)
1292 };
1293
1294 if (dtim_interval > 0xFF || listen_interval > 0xFFFF)
1295 return -EINVAL;
1296 else
1297 return wsm_write_mib(priv, WSM_MIB_ID_BEACON_WAKEUP_PERIOD,
1298 &val, sizeof(val));
1299 }
1300
1301 struct wsm_rcpi_rssi_threshold {
1302 u8 rssiRcpiMode;
1303 u8 lowerThreshold;
1304 u8 upperThreshold;
1305 u8 rollingAverageCount;
1306 };
1307
1308 static inline int wsm_set_rcpi_rssi_threshold(struct cw1200_common *priv,
1309 struct wsm_rcpi_rssi_threshold *arg)
1310 {
1311 return wsm_write_mib(priv, WSM_MIB_ID_RCPI_RSSI_THRESHOLD, arg,
1312 sizeof(*arg));
1313 }
1314
1315 struct wsm_mib_counters_table {
1316 __le32 plcp_errors;
1317 __le32 fcs_errors;
1318 __le32 tx_packets;
1319 __le32 rx_packets;
1320 __le32 rx_packet_errors;
1321 __le32 rx_decryption_failures;
1322 __le32 rx_mic_failures;
1323 __le32 rx_no_key_failures;
1324 __le32 tx_multicast_frames;
1325 __le32 tx_frames_success;
1326 __le32 tx_frame_failures;
1327 __le32 tx_frames_retried;
1328 __le32 tx_frames_multi_retried;
1329 __le32 rx_frame_duplicates;
1330 __le32 rts_success;
1331 __le32 rts_failures;
1332 __le32 ack_failures;
1333 __le32 rx_multicast_frames;
1334 __le32 rx_frames_success;
1335 __le32 rx_cmac_icv_errors;
1336 __le32 rx_cmac_replays;
1337 __le32 rx_mgmt_ccmp_replays;
1338 } __packed;
1339
1340 static inline int wsm_get_counters_table(struct cw1200_common *priv,
1341 struct wsm_mib_counters_table *arg)
1342 {
1343 return wsm_read_mib(priv, WSM_MIB_ID_COUNTERS_TABLE,
1344 arg, sizeof(*arg));
1345 }
1346
1347 static inline int wsm_get_station_id(struct cw1200_common *priv, u8 *mac)
1348 {
1349 return wsm_read_mib(priv, WSM_MIB_ID_DOT11_STATION_ID, mac, ETH_ALEN);
1350 }
1351
1352 struct wsm_rx_filter {
1353 bool promiscuous;
1354 bool bssid;
1355 bool fcs;
1356 bool probeResponder;
1357 };
1358
1359 static inline int wsm_set_rx_filter(struct cw1200_common *priv,
1360 const struct wsm_rx_filter *arg)
1361 {
1362 __le32 val = 0;
1363 if (arg->promiscuous)
1364 val |= __cpu_to_le32(BIT(0));
1365 if (arg->bssid)
1366 val |= __cpu_to_le32(BIT(1));
1367 if (arg->fcs)
1368 val |= __cpu_to_le32(BIT(2));
1369 if (arg->probeResponder)
1370 val |= __cpu_to_le32(BIT(3));
1371 return wsm_write_mib(priv, WSM_MIB_ID_RX_FILTER, &val, sizeof(val));
1372 }
1373
1374 int wsm_set_probe_responder(struct cw1200_common *priv, bool enable);
1375
1376 #define WSM_BEACON_FILTER_IE_HAS_CHANGED BIT(0)
1377 #define WSM_BEACON_FILTER_IE_NO_LONGER_PRESENT BIT(1)
1378 #define WSM_BEACON_FILTER_IE_HAS_APPEARED BIT(2)
1379
1380 struct wsm_beacon_filter_table_entry {
1381 u8 ie_id;
1382 u8 flags;
1383 u8 oui[3];
1384 u8 match_data[3];
1385 } __packed;
1386
1387 struct wsm_mib_beacon_filter_table {
1388 __le32 num;
1389 struct wsm_beacon_filter_table_entry entry[10];
1390 } __packed;
1391
1392 static inline int wsm_set_beacon_filter_table(struct cw1200_common *priv,
1393 struct wsm_mib_beacon_filter_table *ft)
1394 {
1395 size_t size = __le32_to_cpu(ft->num) *
1396 sizeof(struct wsm_beacon_filter_table_entry) +
1397 sizeof(__le32);
1398
1399 return wsm_write_mib(priv, WSM_MIB_ID_BEACON_FILTER_TABLE, ft, size);
1400 }
1401
1402 #define WSM_BEACON_FILTER_ENABLE BIT(0)
1403 #define WSM_BEACON_FILTER_AUTO_ERP BIT(1)
1404
1405 struct wsm_beacon_filter_control {
1406 int enabled;
1407 int bcn_count;
1408 };
1409
1410 static inline int wsm_beacon_filter_control(struct cw1200_common *priv,
1411 struct wsm_beacon_filter_control *arg)
1412 {
1413 struct {
1414 __le32 enabled;
1415 __le32 bcn_count;
1416 } val;
1417 val.enabled = __cpu_to_le32(arg->enabled);
1418 val.bcn_count = __cpu_to_le32(arg->bcn_count);
1419 return wsm_write_mib(priv, WSM_MIB_ID_BEACON_FILTER_ENABLE, &val,
1420 sizeof(val));
1421 }
1422
1423 enum wsm_power_mode {
1424 wsm_power_mode_active = 0,
1425 wsm_power_mode_doze = 1,
1426 wsm_power_mode_quiescent = 2,
1427 };
1428
1429 struct wsm_operational_mode {
1430 enum wsm_power_mode power_mode;
1431 int disable_more_flag_usage;
1432 int perform_ant_diversity;
1433 };
1434
1435 static inline int wsm_set_operational_mode(struct cw1200_common *priv,
1436 const struct wsm_operational_mode *arg)
1437 {
1438 u8 val = arg->power_mode;
1439 if (arg->disable_more_flag_usage)
1440 val |= BIT(4);
1441 if (arg->perform_ant_diversity)
1442 val |= BIT(5);
1443 return wsm_write_mib(priv, WSM_MIB_ID_OPERATIONAL_POWER_MODE, &val,
1444 sizeof(val));
1445 }
1446
1447 struct wsm_template_frame {
1448 u8 frame_type;
1449 u8 rate;
1450 struct sk_buff *skb;
1451 };
1452
1453 static inline int wsm_set_template_frame(struct cw1200_common *priv,
1454 struct wsm_template_frame *arg)
1455 {
1456 int ret;
1457 u8 *p = skb_push(arg->skb, 4);
1458 p[0] = arg->frame_type;
1459 p[1] = arg->rate;
1460 ((__le16 *)p)[1] = __cpu_to_le16(arg->skb->len - 4);
1461 ret = wsm_write_mib(priv, WSM_MIB_ID_TEMPLATE_FRAME, p, arg->skb->len);
1462 skb_pull(arg->skb, 4);
1463 return ret;
1464 }
1465
1466
1467 struct wsm_protected_mgmt_policy {
1468 bool protectedMgmtEnable;
1469 bool unprotectedMgmtFramesAllowed;
1470 bool encryptionForAuthFrame;
1471 };
1472
1473 static inline int wsm_set_protected_mgmt_policy(struct cw1200_common *priv,
1474 struct wsm_protected_mgmt_policy *arg)
1475 {
1476 __le32 val = 0;
1477 int ret;
1478 if (arg->protectedMgmtEnable)
1479 val |= __cpu_to_le32(BIT(0));
1480 if (arg->unprotectedMgmtFramesAllowed)
1481 val |= __cpu_to_le32(BIT(1));
1482 if (arg->encryptionForAuthFrame)
1483 val |= __cpu_to_le32(BIT(2));
1484 ret = wsm_write_mib(priv, WSM_MIB_ID_PROTECTED_MGMT_POLICY,
1485 &val, sizeof(val));
1486 return ret;
1487 }
1488
1489 struct wsm_mib_block_ack_policy {
1490 u8 tx_tid;
1491 u8 reserved1;
1492 u8 rx_tid;
1493 u8 reserved2;
1494 } __packed;
1495
1496 static inline int wsm_set_block_ack_policy(struct cw1200_common *priv,
1497 u8 tx_tid_policy,
1498 u8 rx_tid_policy)
1499 {
1500 struct wsm_mib_block_ack_policy val = {
1501 .tx_tid = tx_tid_policy,
1502 .rx_tid = rx_tid_policy,
1503 };
1504 return wsm_write_mib(priv, WSM_MIB_ID_BLOCK_ACK_POLICY, &val,
1505 sizeof(val));
1506 }
1507
1508 struct wsm_mib_association_mode {
1509 u8 flags;
1510 u8 preamble;
1511 u8 greenfield;
1512 u8 mpdu_start_spacing;
1513 __le32 basic_rate_set;
1514 } __packed;
1515
1516 static inline int wsm_set_association_mode(struct cw1200_common *priv,
1517 struct wsm_mib_association_mode *arg)
1518 {
1519 return wsm_write_mib(priv, WSM_MIB_ID_SET_ASSOCIATION_MODE, arg,
1520 sizeof(*arg));
1521 }
1522
1523 #define WSM_TX_RATE_POLICY_FLAG_TERMINATE_WHEN_FINISHED BIT(2)
1524 #define WSM_TX_RATE_POLICY_FLAG_COUNT_INITIAL_TRANSMIT BIT(3)
1525 struct wsm_tx_rate_retry_policy {
1526 u8 index;
1527 u8 short_retries;
1528 u8 long_retries;
1529
1530
1531
1532
1533
1534
1535 u8 flags;
1536 u8 rate_recoveries;
1537 u8 reserved[3];
1538 __le32 rate_count_indices[3];
1539 } __packed;
1540
1541 struct wsm_set_tx_rate_retry_policy {
1542 u8 num;
1543 u8 reserved[3];
1544 struct wsm_tx_rate_retry_policy tbl[8];
1545 } __packed;
1546
1547 static inline int wsm_set_tx_rate_retry_policy(struct cw1200_common *priv,
1548 struct wsm_set_tx_rate_retry_policy *arg)
1549 {
1550 size_t size = 4 + arg->num * sizeof(struct wsm_tx_rate_retry_policy);
1551 return wsm_write_mib(priv, WSM_MIB_ID_SET_TX_RATE_RETRY_POLICY, arg,
1552 size);
1553 }
1554
1555
1556 struct wsm_ether_type_filter_hdr {
1557 u8 num;
1558 u8 reserved[3];
1559 } __packed;
1560
1561 struct wsm_ether_type_filter {
1562 u8 action;
1563 u8 reserved;
1564 __le16 type;
1565 } __packed;
1566
1567 static inline int wsm_set_ether_type_filter(struct cw1200_common *priv,
1568 struct wsm_ether_type_filter_hdr *arg)
1569 {
1570 size_t size = sizeof(struct wsm_ether_type_filter_hdr) +
1571 arg->num * sizeof(struct wsm_ether_type_filter);
1572 return wsm_write_mib(priv, WSM_MIB_ID_SET_ETHERTYPE_DATAFRAME_FILTER,
1573 arg, size);
1574 }
1575
1576
1577 struct wsm_udp_port_filter_hdr {
1578 u8 num;
1579 u8 reserved[3];
1580 } __packed;
1581
1582 struct wsm_udp_port_filter {
1583 u8 action;
1584 u8 type;
1585 __le16 port;
1586 } __packed;
1587
1588 static inline int wsm_set_udp_port_filter(struct cw1200_common *priv,
1589 struct wsm_udp_port_filter_hdr *arg)
1590 {
1591 size_t size = sizeof(struct wsm_udp_port_filter_hdr) +
1592 arg->num * sizeof(struct wsm_udp_port_filter);
1593 return wsm_write_mib(priv, WSM_MIB_ID_SET_UDPPORT_DATAFRAME_FILTER,
1594 arg, size);
1595 }
1596
1597
1598
1599 #define D11_MAX_SSID_LEN (32)
1600
1601 struct wsm_p2p_device_type {
1602 __le16 category_id;
1603 u8 oui[4];
1604 __le16 subcategory_id;
1605 } __packed;
1606
1607 struct wsm_p2p_device_info {
1608 struct wsm_p2p_device_type primaryDevice;
1609 u8 reserved1[3];
1610 u8 devname_size;
1611 u8 local_devname[D11_MAX_SSID_LEN];
1612 u8 reserved2[3];
1613 u8 num_secdev_supported;
1614 struct wsm_p2p_device_type secdevs[];
1615 } __packed;
1616
1617
1618 struct wsm_cdma_band {
1619 u8 wcdma_band;
1620 u8 reserved[3];
1621 } __packed;
1622
1623
1624 struct wsm_group_tx_seq {
1625 __le32 bits_47_16;
1626 __le16 bits_15_00;
1627 __le16 reserved;
1628 } __packed;
1629
1630
1631 #define WSM_DUAL_CTS_PROT_ENB (1 << 0)
1632 #define WSM_NON_GREENFIELD_STA_PRESENT (1 << 1)
1633 #define WSM_HT_PROT_MODE__NO_PROT (0 << 2)
1634 #define WSM_HT_PROT_MODE__NON_MEMBER (1 << 2)
1635 #define WSM_HT_PROT_MODE__20_MHZ (2 << 2)
1636 #define WSM_HT_PROT_MODE__NON_HT_MIXED (3 << 2)
1637 #define WSM_LSIG_TXOP_PROT_FULL (1 << 4)
1638 #define WSM_LARGE_L_LENGTH_PROT (1 << 5)
1639
1640 struct wsm_ht_protection {
1641 __le32 flags;
1642 } __packed;
1643
1644
1645 #define WSM_GPIO_COMMAND_SETUP 0
1646 #define WSM_GPIO_COMMAND_READ 1
1647 #define WSM_GPIO_COMMAND_WRITE 2
1648 #define WSM_GPIO_COMMAND_RESET 3
1649 #define WSM_GPIO_ALL_PINS 0xFF
1650
1651 struct wsm_gpio_command {
1652 u8 command;
1653 u8 pin;
1654 __le16 config;
1655 } __packed;
1656
1657
1658 struct wsm_tsf_counter {
1659 __le64 tsf_counter;
1660 } __packed;
1661
1662
1663 struct wsm_keep_alive_period {
1664 __le16 period;
1665 u8 reserved[2];
1666 } __packed;
1667
1668 static inline int wsm_keep_alive_period(struct cw1200_common *priv,
1669 int period)
1670 {
1671 struct wsm_keep_alive_period arg = {
1672 .period = __cpu_to_le16(period),
1673 };
1674 return wsm_write_mib(priv, WSM_MIB_ID_KEEP_ALIVE_PERIOD,
1675 &arg, sizeof(arg));
1676 };
1677
1678
1679 struct wsm_set_bssid_filtering {
1680 u8 filter;
1681 u8 reserved[3];
1682 } __packed;
1683
1684 static inline int wsm_set_bssid_filtering(struct cw1200_common *priv,
1685 bool enabled)
1686 {
1687 struct wsm_set_bssid_filtering arg = {
1688 .filter = !enabled,
1689 };
1690 return wsm_write_mib(priv, WSM_MIB_ID_DISABLE_BSSID_FILTER,
1691 &arg, sizeof(arg));
1692 }
1693
1694
1695 struct wsm_mib_multicast_filter {
1696 __le32 enable;
1697 __le32 num_addrs;
1698 u8 macaddrs[WSM_MAX_GRP_ADDRTABLE_ENTRIES][ETH_ALEN];
1699 } __packed;
1700
1701 static inline int wsm_set_multicast_filter(struct cw1200_common *priv,
1702 struct wsm_mib_multicast_filter *fp)
1703 {
1704 return wsm_write_mib(priv, WSM_MIB_ID_DOT11_GROUP_ADDRESSES_TABLE,
1705 fp, sizeof(*fp));
1706 }
1707
1708
1709 struct wsm_mib_arp_ipv4_filter {
1710 __le32 enable;
1711 __be32 ipv4addrs[WSM_MAX_ARP_IP_ADDRTABLE_ENTRIES];
1712 } __packed;
1713
1714 static inline int wsm_set_arp_ipv4_filter(struct cw1200_common *priv,
1715 struct wsm_mib_arp_ipv4_filter *fp)
1716 {
1717 return wsm_write_mib(priv, WSM_MIB_ID_ARP_IP_ADDRESSES_TABLE,
1718 fp, sizeof(*fp));
1719 }
1720
1721
1722 struct wsm_p2p_ps_modeinfo {
1723 u8 opp_ps_ct_window;
1724 u8 count;
1725 u8 reserved;
1726 u8 dtim_count;
1727 __le32 duration;
1728 __le32 interval;
1729 __le32 start_time;
1730 } __packed;
1731
1732 static inline int wsm_set_p2p_ps_modeinfo(struct cw1200_common *priv,
1733 struct wsm_p2p_ps_modeinfo *mi)
1734 {
1735 return wsm_write_mib(priv, WSM_MIB_ID_P2P_PS_MODE_INFO,
1736 mi, sizeof(*mi));
1737 }
1738
1739 static inline int wsm_get_p2p_ps_modeinfo(struct cw1200_common *priv,
1740 struct wsm_p2p_ps_modeinfo *mi)
1741 {
1742 return wsm_read_mib(priv, WSM_MIB_ID_P2P_PS_MODE_INFO,
1743 mi, sizeof(*mi));
1744 }
1745
1746
1747
1748 static inline int wsm_use_multi_tx_conf(struct cw1200_common *priv,
1749 bool enabled)
1750 {
1751 __le32 arg = enabled ? __cpu_to_le32(1) : 0;
1752
1753 return wsm_write_mib(priv, WSM_MIB_USE_MULTI_TX_CONF,
1754 &arg, sizeof(arg));
1755 }
1756
1757
1758
1759 struct wsm_uapsd_info {
1760 __le16 uapsd_flags;
1761 __le16 min_auto_trigger_interval;
1762 __le16 max_auto_trigger_interval;
1763 __le16 auto_trigger_step;
1764 };
1765
1766 static inline int wsm_set_uapsd_info(struct cw1200_common *priv,
1767 struct wsm_uapsd_info *arg)
1768 {
1769 return wsm_write_mib(priv, WSM_MIB_ID_SET_UAPSD_INFORMATION,
1770 arg, sizeof(*arg));
1771 }
1772
1773
1774 struct wsm_override_internal_txrate {
1775 u8 internalTxRate;
1776 u8 nonErpInternalTxRate;
1777 u8 reserved[2];
1778 } __packed;
1779
1780 static inline int wsm_set_override_internal_txrate(struct cw1200_common *priv,
1781 struct wsm_override_internal_txrate *arg)
1782 {
1783 return wsm_write_mib(priv, WSM_MIB_ID_OVERRIDE_INTERNAL_TX_RATE,
1784 arg, sizeof(*arg));
1785 }
1786
1787
1788
1789
1790 void wsm_lock_tx(struct cw1200_common *priv);
1791 void wsm_lock_tx_async(struct cw1200_common *priv);
1792 bool wsm_flush_tx(struct cw1200_common *priv);
1793 void wsm_unlock_tx(struct cw1200_common *priv);
1794
1795
1796
1797
1798 int wsm_handle_exception(struct cw1200_common *priv, u8 *data, size_t len);
1799 int wsm_handle_rx(struct cw1200_common *priv, u16 id, struct wsm_hdr *wsm,
1800 struct sk_buff **skb_p);
1801
1802
1803
1804
1805 struct wsm_buf {
1806 u8 *begin;
1807 u8 *data;
1808 u8 *end;
1809 };
1810
1811 void wsm_buf_init(struct wsm_buf *buf);
1812 void wsm_buf_deinit(struct wsm_buf *buf);
1813
1814
1815
1816
1817 struct wsm_cmd {
1818 spinlock_t lock;
1819 int done;
1820 u8 *ptr;
1821 size_t len;
1822 void *arg;
1823 int ret;
1824 u16 cmd;
1825 };
1826
1827
1828
1829
1830 int wsm_get_tx(struct cw1200_common *priv, u8 **data,
1831 size_t *tx_len, int *burst);
1832 void wsm_txed(struct cw1200_common *priv, u8 *data);
1833
1834
1835
1836
1837
1838
1839 static inline u8 wsm_queue_id_to_linux(u8 queue_id)
1840 {
1841 static const u8 queue_mapping[] = {
1842 2, 3, 1, 0
1843 };
1844 return queue_mapping[queue_id];
1845 }
1846
1847 static inline u8 wsm_queue_id_to_wsm(u8 queue_id)
1848 {
1849 static const u8 queue_mapping[] = {
1850 3, 2, 0, 1
1851 };
1852 return queue_mapping[queue_id];
1853 }
1854
1855 #endif