cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

tx.h (8195B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * This file is part of wl1271
      4 *
      5 * Copyright (C) 1998-2009 Texas Instruments. All rights reserved.
      6 * Copyright (C) 2009 Nokia Corporation
      7 *
      8 * Contact: Luciano Coelho <luciano.coelho@nokia.com>
      9 */
     10
     11#ifndef __TX_H__
     12#define __TX_H__
     13
     14#define TX_HW_MGMT_PKT_LIFETIME_TU       2000
     15#define TX_HW_AP_MODE_PKT_LIFETIME_TU    8000
     16
     17#define TX_HW_ATTR_SAVE_RETRIES          BIT(0)
     18#define TX_HW_ATTR_HEADER_PAD            BIT(1)
     19#define TX_HW_ATTR_SESSION_COUNTER       (BIT(2) | BIT(3) | BIT(4))
     20#define TX_HW_ATTR_RATE_POLICY           (BIT(5) | BIT(6) | BIT(7) | \
     21					  BIT(8) | BIT(9))
     22#define TX_HW_ATTR_LAST_WORD_PAD         (BIT(10) | BIT(11))
     23#define TX_HW_ATTR_TX_CMPLT_REQ          BIT(12)
     24#define TX_HW_ATTR_TX_DUMMY_REQ          BIT(13)
     25#define TX_HW_ATTR_HOST_ENCRYPT          BIT(14)
     26#define TX_HW_ATTR_EAPOL_FRAME           BIT(15)
     27
     28#define TX_HW_ATTR_OFST_SAVE_RETRIES     0
     29#define TX_HW_ATTR_OFST_HEADER_PAD       1
     30#define TX_HW_ATTR_OFST_SESSION_COUNTER  2
     31#define TX_HW_ATTR_OFST_RATE_POLICY      5
     32#define TX_HW_ATTR_OFST_LAST_WORD_PAD    10
     33#define TX_HW_ATTR_OFST_TX_CMPLT_REQ     12
     34
     35#define TX_HW_RESULT_QUEUE_LEN           16
     36#define TX_HW_RESULT_QUEUE_LEN_MASK      0xf
     37
     38#define WL1271_TX_ALIGN_TO 4
     39#define WL1271_EXTRA_SPACE_TKIP 4
     40#define WL1271_EXTRA_SPACE_AES  8
     41#define WL1271_EXTRA_SPACE_MAX  8
     42
     43/* Used for management frames and dummy packets */
     44#define WL1271_TID_MGMT 7
     45
     46/* stop a ROC for pending authentication reply after this time (ms) */
     47#define WLCORE_PEND_AUTH_ROC_TIMEOUT     1000
     48
     49struct wl127x_tx_mem {
     50	/*
     51	 * Number of extra memory blocks to allocate for this packet
     52	 * in addition to the number of blocks derived from the packet
     53	 * length.
     54	 */
     55	u8 extra_blocks;
     56	/*
     57	 * Total number of memory blocks allocated by the host for
     58	 * this packet. Must be equal or greater than the actual
     59	 * blocks number allocated by HW.
     60	 */
     61	u8 total_mem_blocks;
     62} __packed;
     63
     64struct wl128x_tx_mem {
     65	/*
     66	 * Total number of memory blocks allocated by the host for
     67	 * this packet.
     68	 */
     69	u8 total_mem_blocks;
     70	/*
     71	 * Number of extra bytes, at the end of the frame. the host
     72	 * uses this padding to complete each frame to integer number
     73	 * of SDIO blocks.
     74	 */
     75	u8 extra_bytes;
     76} __packed;
     77
     78struct wl18xx_tx_mem {
     79	/*
     80	 * Total number of memory blocks allocated by the host for
     81	 * this packet.
     82	 */
     83	u8 total_mem_blocks;
     84
     85	/*
     86	 * control bits
     87	 */
     88	u8 ctrl;
     89} __packed;
     90
     91/*
     92 * On wl128x based devices, when TX packets are aggregated, each packet
     93 * size must be aligned to the SDIO block size. The maximum block size
     94 * is bounded by the type of the padded bytes field that is sent to the
     95 * FW. Currently the type is u8, so the maximum block size is 256 bytes.
     96 */
     97#define WL12XX_BUS_BLOCK_SIZE min(512u,	\
     98	    (1u << (8 * sizeof(((struct wl128x_tx_mem *) 0)->extra_bytes))))
     99
    100struct wl1271_tx_hw_descr {
    101	/* Length of packet in words, including descriptor+header+data */
    102	__le16 length;
    103	union {
    104		struct wl127x_tx_mem wl127x_mem;
    105		struct wl128x_tx_mem wl128x_mem;
    106		struct wl18xx_tx_mem wl18xx_mem;
    107	} __packed;
    108	/* Device time (in us) when the packet arrived to the driver */
    109	__le32 start_time;
    110	/*
    111	 * Max delay in TUs until transmission. The last device time the
    112	 * packet can be transmitted is: start_time + (1024 * life_time)
    113	 */
    114	__le16 life_time;
    115	/* Bitwise fields - see TX_ATTR... definitions above. */
    116	__le16 tx_attr;
    117	/* Packet identifier used also in the Tx-Result. */
    118	u8 id;
    119	/* The packet TID value (as User-Priority) */
    120	u8 tid;
    121	/* host link ID (HLID) */
    122	u8 hlid;
    123
    124	union {
    125		u8 wl12xx_reserved;
    126
    127		/*
    128		 * bit 0   -> 0 = udp, 1 = tcp
    129		 * bit 1:7 -> IP header offset
    130		 */
    131		u8 wl18xx_checksum_data;
    132	} __packed;
    133} __packed;
    134
    135enum wl1271_tx_hw_res_status {
    136	TX_SUCCESS          = 0,
    137	TX_HW_ERROR         = 1,
    138	TX_DISABLED         = 2,
    139	TX_RETRY_EXCEEDED   = 3,
    140	TX_TIMEOUT          = 4,
    141	TX_KEY_NOT_FOUND    = 5,
    142	TX_PEER_NOT_FOUND   = 6,
    143	TX_SESSION_MISMATCH = 7,
    144	TX_LINK_NOT_VALID   = 8,
    145};
    146
    147struct wl1271_tx_hw_res_descr {
    148	/* Packet Identifier - same value used in the Tx descriptor.*/
    149	u8 id;
    150	/* The status of the transmission, indicating success or one of
    151	   several possible reasons for failure. */
    152	u8 status;
    153	/* Total air access duration including all retrys and overheads.*/
    154	__le16 medium_usage;
    155	/* The time passed from host xfer to Tx-complete.*/
    156	__le32 fw_handling_time;
    157	/* Total media delay
    158	   (from 1st EDCA AIFS counter until TX Complete). */
    159	__le32 medium_delay;
    160	/* LS-byte of last TKIP seq-num (saved per AC for recovery). */
    161	u8 tx_security_sequence_number_lsb;
    162	/* Retry count - number of transmissions without successful ACK.*/
    163	u8 ack_failures;
    164	/* The rate that succeeded getting ACK
    165	   (Valid only if status=SUCCESS). */
    166	u8 rate_class_index;
    167	/* for 4-byte alignment. */
    168	u8 spare;
    169} __packed;
    170
    171struct wl1271_tx_hw_res_if {
    172	__le32 tx_result_fw_counter;
    173	__le32 tx_result_host_counter;
    174	struct wl1271_tx_hw_res_descr tx_results_queue[TX_HW_RESULT_QUEUE_LEN];
    175} __packed;
    176
    177enum wlcore_queue_stop_reason {
    178	WLCORE_QUEUE_STOP_REASON_WATERMARK,
    179	WLCORE_QUEUE_STOP_REASON_FW_RESTART,
    180	WLCORE_QUEUE_STOP_REASON_FLUSH,
    181	WLCORE_QUEUE_STOP_REASON_SPARE_BLK, /* 18xx specific */
    182};
    183
    184static inline int wl1271_tx_get_queue(int queue)
    185{
    186	switch (queue) {
    187	case 0:
    188		return CONF_TX_AC_VO;
    189	case 1:
    190		return CONF_TX_AC_VI;
    191	case 2:
    192		return CONF_TX_AC_BE;
    193	case 3:
    194		return CONF_TX_AC_BK;
    195	default:
    196		return CONF_TX_AC_BE;
    197	}
    198}
    199
    200static inline
    201int wlcore_tx_get_mac80211_queue(struct wl12xx_vif *wlvif, int queue)
    202{
    203	int mac_queue = wlvif->hw_queue_base;
    204
    205	switch (queue) {
    206	case CONF_TX_AC_VO:
    207		return mac_queue + 0;
    208	case CONF_TX_AC_VI:
    209		return mac_queue + 1;
    210	case CONF_TX_AC_BE:
    211		return mac_queue + 2;
    212	case CONF_TX_AC_BK:
    213		return mac_queue + 3;
    214	default:
    215		return mac_queue + 2;
    216	}
    217}
    218
    219static inline int wl1271_tx_total_queue_count(struct wl1271 *wl)
    220{
    221	int i, count = 0;
    222
    223	for (i = 0; i < NUM_TX_QUEUES; i++)
    224		count += wl->tx_queue_count[i];
    225
    226	return count;
    227}
    228
    229void wl1271_tx_work(struct work_struct *work);
    230int wlcore_tx_work_locked(struct wl1271 *wl);
    231int wlcore_tx_complete(struct wl1271 *wl);
    232void wl12xx_tx_reset_wlvif(struct wl1271 *wl, struct wl12xx_vif *wlvif);
    233void wl12xx_tx_reset(struct wl1271 *wl);
    234void wl1271_tx_flush(struct wl1271 *wl);
    235u8 wlcore_rate_to_idx(struct wl1271 *wl, u8 rate, enum nl80211_band band);
    236u32 wl1271_tx_enabled_rates_get(struct wl1271 *wl, u32 rate_set,
    237				enum nl80211_band rate_band);
    238u32 wl1271_tx_min_rate_get(struct wl1271 *wl, u32 rate_set);
    239u8 wl12xx_tx_get_hlid(struct wl1271 *wl, struct wl12xx_vif *wlvif,
    240		      struct sk_buff *skb, struct ieee80211_sta *sta);
    241void wl1271_tx_reset_link_queues(struct wl1271 *wl, u8 hlid);
    242void wl1271_handle_tx_low_watermark(struct wl1271 *wl);
    243bool wl12xx_is_dummy_packet(struct wl1271 *wl, struct sk_buff *skb);
    244void wl12xx_rearm_rx_streaming(struct wl1271 *wl, unsigned long *active_hlids);
    245unsigned int wlcore_calc_packet_alignment(struct wl1271 *wl,
    246					  unsigned int packet_length);
    247void wl1271_free_tx_id(struct wl1271 *wl, int id);
    248void wlcore_stop_queue_locked(struct wl1271 *wl, struct wl12xx_vif *wlvif,
    249			      u8 queue, enum wlcore_queue_stop_reason reason);
    250void wlcore_stop_queue(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 queue,
    251		       enum wlcore_queue_stop_reason reason);
    252void wlcore_wake_queue(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 queue,
    253		       enum wlcore_queue_stop_reason reason);
    254void wlcore_stop_queues(struct wl1271 *wl,
    255			enum wlcore_queue_stop_reason reason);
    256void wlcore_wake_queues(struct wl1271 *wl,
    257			enum wlcore_queue_stop_reason reason);
    258bool wlcore_is_queue_stopped_by_reason(struct wl1271 *wl,
    259				       struct wl12xx_vif *wlvif, u8 queue,
    260				       enum wlcore_queue_stop_reason reason);
    261bool
    262wlcore_is_queue_stopped_by_reason_locked(struct wl1271 *wl,
    263					 struct wl12xx_vif *wlvif,
    264					 u8 queue,
    265					 enum wlcore_queue_stop_reason reason);
    266bool wlcore_is_queue_stopped_locked(struct wl1271 *wl, struct wl12xx_vif *wlvif,
    267				    u8 queue);
    268
    269/* from main.c */
    270void wl1271_free_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 hlid);
    271void wl12xx_rearm_tx_watchdog_locked(struct wl1271 *wl);
    272
    273#endif