summaryrefslogblamecommitdiffstats
path: root/drivers/staging/agnx/xmit.h
blob: 93ac4157e697b0c44f177bbf4a3662aca1081768 (plain) (tree)

























































































































































































































































                                                                        
#ifndef AGNX_XMIT_H_
#define AGNX_XMIT_H_

#include <net/mac80211.h>

struct agnx_priv;

static inline u32 agnx_set_bits(u32 mask, u8 shift, u32 value)
{
	return (value << shift) & mask;
}

static inline u32 agnx_get_bits(u32 mask, u8 shift, u32 value)
{
	return (value & mask) >> shift;
}


struct agnx_rx {
	__be16 rx_packet_duration; /*  RX Packet Duration */
	__be16 replay_cnt;	/* Replay Count */
} __attribute__((__packed__));


struct agnx_tx {
	u8 long_retry_limit; /* Long Retry Limit */
	u8 short_retry_limit; /* Short Retry Limit */
	u8 long_retry_cnt;	/* Long Retry Count */
	u8 short_retry_cnt; /* Short Retry Count */
} __attribute__((__packed__));


/* Copy from bcm43xx */
#define P4D_BYT3S(magic, nr_bytes)      u8 __p4dding##magic[nr_bytes]
#define P4D_BYTES(line, nr_bytes)       P4D_BYT3S(line, nr_bytes)
#define PAD_BYTES(nr_bytes)             P4D_BYTES(__LINE__, nr_bytes)

#define P4D_BIT3S(magic, nr_bits)       __be32 __padding##magic:nr_bits
#define P4D_BITS(line, nr_bits)         P4D_BIT3S(line, nr_bits)
#define PAD_BITS(nr_bits)	        P4D_BITS(__LINE__, nr_bits)


struct agnx_hdr {
	__be32 reg0;
#define RTS		        0x80000000 /* RTS */
#define RTS_SHIFT		31
#define MULTICAST	        0x40000000 /* multicast */
#define MULTICAST_SHIFT		30
#define ACK			0x30000000 /* ACK */
#define ACK_SHIFT		28
#define TM			0x08000000 /* TM */
#define TM_SHIFT		27
#define RELAY			0x04000000 /* Relay */
#define RELAY_SHIFT		26
/* 	PAD_BITS(4); */
#define REVISED_FCS		0x00380000 /* revised FCS */
#define REVISED_FCS_SHIFT	19
#define NEXT_BUFFER_ADDR	0x0007FFFF /* Next Buffer Address */
#define NEXT_BUFFER_ADDR_SHIFT	0

	__be32 reg1;
#define MAC_HDR_LEN		0xFC000000 /* MAC Header Length  */
#define MAC_HDR_LEN_SHIFT	26
#define DURATION_OVERIDE	0x02000000 /* Duration Override */
#define DURATION_OVERIDE_SHIFT	25
#define PHY_HDR_OVERIDE		0x01000000 /* PHY Header Override */
#define PHY_HDR_OVERIDE_SHIFT	24
#define CRC_FAIL		0x00800000 /* CRC fail */
#define CRC_FAIL_SHIFT		23
/*	PAD_BITS(1); */
#define SEQUENCE_NUMBER		0x00200000 /* Sequence Number */
#define SEQUENCE_NUMBER_SHIFT	21
/*	PAD_BITS(2); */
#define BUFF_HEAD_ADDR		0x0007FFFF /* Buffer Head Address */
#define BUFF_HEAD_ADDR_SHIFT	0

	__be32 reg2;
#define PDU_COUNT		0xFC000000 /* PDU Count */
#define PDU_COUNT_SHIFT		26
/* 	PAD_BITS(3); */
#define WEP_KEY			0x00600000 /* WEP Key # */
#define WEP_KEY_SHIFT		21
#define USES_WEP_KEY		0x00100000 /* Uses WEP Key */
#define USES_WEP_KEY_SHIFT	20
#define KEEP_ALIVE		0x00080000 /* Keep alive */
#define KEEP_ALIVE_SHIFT	19
#define BUFF_TAIL_ADDR		0x0007FFFF /* Buffer Tail Address */
#define BUFF_TAIL_ADDR_SHIFT	0

	__be32 reg3;
#define CTS_11G			0x80000000	/* CTS in 11g */
#define CTS_11G_SHIFT		31
#define RTS_11G			0x40000000	/* RTS in 11g */
#define RTS_11G_SHIFT		30
/* PAD_BITS(2); */
#define FRAG_SIZE		0x0FFF0000	/* fragment size */
#define FRAG_SIZE_SHIFT		16
#define PAYLOAD_LEN		0x0000FFF0	/* payload length */
#define PAYLOAD_LEN_SHIFT	4
#define FRAG_NUM		0x0000000F	/* number of frags */
#define FRAG_NUM_SHIFT		0

	__be32 reg4;
/* 	PAD_BITS(4); */
#define RELAY_STAID		0x0FFF0000 /* relayStald */
#define RELAY_STAID_SHIFT	16
#define STATION_ID		0x0000FFF0 /* Station ID */
#define STATION_ID_SHIFT	4
#define WORKQUEUE_ID		0x0000000F /* Workqueue ID */
#define WORKQUEUE_ID_SHIFT	0

	/* FIXME this register maybe is LE? */
	__be32 reg5;
/* 	PAD_BITS(4); */
#define ROUTE_HOST		0x0F000000
#define ROUTE_HOST_SHIFT	24
#define ROUTE_CARD_CPU		0x00F00000
#define ROUTE_CARD_CPU_SHIFT	20
#define ROUTE_ENCRYPTION	0x000F0000
#define ROUTE_ENCRYPTION_SHIFT	16
#define ROUTE_TX		0x0000F000
#define ROUTE_TX_SHIFT		12
#define ROUTE_RX1		0x00000F00
#define ROUTE_RX1_SHIFT		8
#define ROUTE_RX2		0x000000F0
#define ROUTE_RX2_SHIFT		4
#define ROUTE_COMPRESSION	0x0000000F
#define ROUTE_COMPRESSION_SHIFT 0

	__be32 _11g0;			/* 11g */
	__be32 _11g1;			/* 11g */
	__be32 _11b0;			/* 11b */
	__be32 _11b1;			/* 11b */
	u8 mac_hdr[32];			/* MAC header */

	__be16 rts_duration;		/* RTS duration */
	__be16 last_duration;		/* Last duration */
	__be16 sec_last_duration;	/* Second to Last duration */
	__be16 other_duration;		/* Other duration */
	__be16 tx_last_duration;	/* TX Last duration */
	__be16 tx_other_duration;	/* TX Other Duration */
	__be16 last_11g_len;		/* Length of last 11g */
	__be16 other_11g_len;		/* Lenght of other 11g */

	__be16 last_11b_len;		/* Length of last 11b */
	__be16 other_11b_len;		/* Lenght of other 11b */


	__be16 reg6;
#define MBF			0xF000 /* mbf */
#define MBF_SHIFT		12
#define RSVD4			0x0FFF /* rsvd4 */
#define RSVD4_SHIFT		0

	__be16 rx_frag_stat;	/* RX fragmentation status */

	__be32 time_stamp;	/* TimeStamp */
	__be32 phy_stats_hi;	/* PHY stats hi */
	__be32 phy_stats_lo;	/* PHY stats lo */
	__be32 mic_key0;	/* MIC key 0 */
	__be32 mic_key1;	/* MIC key 1 */

	union {			/* RX/TX Union */
		struct agnx_rx rx;
		struct agnx_tx tx;
	};

	u8 rx_channel;		/* Recieve Channel */
	PAD_BYTES(3);

	u8 reserved[4];
} __attribute__((__packed__));


struct agnx_desc {
#define PACKET_LEN		0xFFF00000
#define PACKET_LEN_SHIFT	20
/* ------------------------------------------------ */
#define FIRST_PACKET_MASK	0x00080000
#define FIRST_PACKET_MASK_SHIFT	19
#define FIRST_RESERV2		0x00040000
#define FIRST_RESERV2_SHIFT	18
#define FIRST_TKIP_ERROR	0x00020000
#define FIRST_TKIP_ERROR_SHIFT	17
#define FIRST_TKIP_PACKET	0x00010000
#define FIRST_TKIP_PACKET_SHIFT	16
#define FIRST_RESERV1		0x0000F000
#define FIRST_RESERV1_SHIFT	12
#define FIRST_FRAG_LEN		0x00000FF8
#define FIRST_FRAG_LEN_SHIFT	3
/* ------------------------------------------------ */
#define SUB_RESERV2		0x000c0000
#define SUB_RESERV2_SHIFT	18
#define SUB_TKIP_ERROR		0x00020000
#define SUB_TKIP_ERROR_SHIFT	17
#define SUB_TKIP_PACKET		0x00010000
#define SUB_TKIP_PACKET_SHIFT	16
#define SUB_RESERV1		0x00008000
#define SUB_RESERV1_SHIFT	15
#define SUB_FRAG_LEN		0x00007FF8
#define SUB_FRAG_LEN_SHIFT	3
/* ------------------------------------------------ */
#define FIRST_FRAG		0x00000004
#define FIRST_FRAG_SHIFT	2
#define LAST_FRAG		0x00000002
#define LAST_FRAG_SHIFT		1
#define OWNER			0x00000001
#define OWNER_SHIFT		0
	__be32 frag;
	__be32 dma_addr;
} __attribute__((__packed__));

enum {HEADER, PACKET};

struct agnx_info {
        struct sk_buff *skb;
        dma_addr_t mapping;
	u32 dma_len;		/* dma buffer len  */
	/* Below fields only usful for tx */
	u32 hdr_len;		/* ieee80211 header length */
	unsigned int type;
        struct ieee80211_tx_info *txi;
        struct ieee80211_hdr hdr;
};


struct agnx_ring {
	struct agnx_desc *desc;
	dma_addr_t dma;
	struct agnx_info *info;
	/* Will lead to overflow when sent packet number enough? */
	unsigned int idx;
	unsigned int idx_sent;		/* only usful for txd and txm */
	unsigned int size;
};

#define AGNX_RX_RING_SIZE	128
#define AGNX_TXD_RING_SIZE	256
#define AGNX_TXM_RING_SIZE	128

void disable_rx_interrupt(struct agnx_priv *priv);
void enable_rx_interrupt(struct agnx_priv *priv);
int fill_rings(struct agnx_priv *priv);
void unfill_rings(struct agnx_priv *priv);
void handle_rx_irq(struct agnx_priv *priv);
void handle_txd_irq(struct agnx_priv *priv);
void handle_txm_irq(struct agnx_priv *priv);
void handle_other_irq(struct agnx_priv *priv);
int _agnx_tx(struct agnx_priv *priv, struct sk_buff *skb);
#endif /* AGNX_XMIT_H_ */