| Kurt Van Dijck | 03fd3cf | 2011-01-11 04:32:31 +0000 | [diff] [blame] | 1 | /* | 
|  | 2 | * softing common interfaces | 
|  | 3 | * | 
|  | 4 | * by Kurt Van Dijck, 2008-2010 | 
|  | 5 | */ | 
|  | 6 |  | 
|  | 7 | #include <linux/atomic.h> | 
|  | 8 | #include <linux/netdevice.h> | 
|  | 9 | #include <linux/ktime.h> | 
|  | 10 | #include <linux/mutex.h> | 
|  | 11 | #include <linux/spinlock.h> | 
|  | 12 | #include <linux/can.h> | 
|  | 13 | #include <linux/can/dev.h> | 
|  | 14 |  | 
|  | 15 | #include "softing_platform.h" | 
|  | 16 |  | 
|  | 17 | struct softing; | 
|  | 18 |  | 
|  | 19 | struct softing_priv { | 
|  | 20 | struct can_priv can; /* must be the first member! */ | 
|  | 21 | struct net_device *netdev; | 
|  | 22 | struct softing *card; | 
|  | 23 | struct { | 
|  | 24 | int pending; | 
| Lucas De Marchi | 25985ed | 2011-03-30 22:57:33 -0300 | [diff] [blame] | 25 | /* variables which hold the circular buffer */ | 
| Kurt Van Dijck | 03fd3cf | 2011-01-11 04:32:31 +0000 | [diff] [blame] | 26 | int echo_put; | 
|  | 27 | int echo_get; | 
|  | 28 | } tx; | 
|  | 29 | struct can_bittiming_const btr_const; | 
|  | 30 | int index; | 
|  | 31 | uint8_t output; | 
|  | 32 | uint16_t chip; | 
|  | 33 | }; | 
|  | 34 | #define netdev2softing(netdev)	((struct softing_priv *)netdev_priv(netdev)) | 
|  | 35 |  | 
|  | 36 | struct softing { | 
|  | 37 | const struct softing_platform_data *pdat; | 
|  | 38 | struct platform_device *pdev; | 
|  | 39 | struct net_device *net[2]; | 
|  | 40 | spinlock_t spin; /* protect this structure & DPRAM access */ | 
|  | 41 | ktime_t ts_ref; | 
|  | 42 | ktime_t ts_overflow; /* timestamp overflow value, in ktime */ | 
|  | 43 |  | 
|  | 44 | struct { | 
|  | 45 | /* indication of firmware status */ | 
|  | 46 | int up; | 
|  | 47 | /* protection of the 'up' variable */ | 
|  | 48 | struct mutex lock; | 
|  | 49 | } fw; | 
|  | 50 | struct { | 
|  | 51 | int nr; | 
|  | 52 | int requested; | 
|  | 53 | int svc_count; | 
|  | 54 | unsigned int dpram_position; | 
|  | 55 | } irq; | 
|  | 56 | struct { | 
|  | 57 | int pending; | 
|  | 58 | int last_bus; | 
|  | 59 | /* | 
|  | 60 | * keep the bus that last tx'd a message, | 
|  | 61 | * in order to let every netdev queue resume | 
|  | 62 | */ | 
|  | 63 | } tx; | 
|  | 64 | __iomem uint8_t *dpram; | 
|  | 65 | unsigned long dpram_phys; | 
|  | 66 | unsigned long dpram_size; | 
|  | 67 | struct { | 
|  | 68 | uint16_t fw_version, hw_version, license, serial; | 
|  | 69 | uint16_t chip[2]; | 
|  | 70 | unsigned int freq; /* remote cpu's operating frequency */ | 
|  | 71 | } id; | 
|  | 72 | }; | 
|  | 73 |  | 
|  | 74 | extern int softing_default_output(struct net_device *netdev); | 
|  | 75 |  | 
|  | 76 | extern ktime_t softing_raw2ktime(struct softing *card, u32 raw); | 
|  | 77 |  | 
|  | 78 | extern int softing_chip_poweron(struct softing *card); | 
|  | 79 |  | 
|  | 80 | extern int softing_bootloader_command(struct softing *card, int16_t cmd, | 
|  | 81 | const char *msg); | 
|  | 82 |  | 
|  | 83 | /* Load firmware after reset */ | 
|  | 84 | extern int softing_load_fw(const char *file, struct softing *card, | 
|  | 85 | __iomem uint8_t *virt, unsigned int size, int offset); | 
|  | 86 |  | 
|  | 87 | /* Load final application firmware after bootloader */ | 
|  | 88 | extern int softing_load_app_fw(const char *file, struct softing *card); | 
|  | 89 |  | 
|  | 90 | /* | 
|  | 91 | * enable or disable irq | 
|  | 92 | * only called with fw.lock locked | 
|  | 93 | */ | 
|  | 94 | extern int softing_enable_irq(struct softing *card, int enable); | 
|  | 95 |  | 
|  | 96 | /* start/stop 1 bus on card */ | 
|  | 97 | extern int softing_startstop(struct net_device *netdev, int up); | 
|  | 98 |  | 
|  | 99 | /* netif_rx() */ | 
|  | 100 | extern int softing_netdev_rx(struct net_device *netdev, | 
|  | 101 | const struct can_frame *msg, ktime_t ktime); | 
|  | 102 |  | 
|  | 103 | /* SOFTING DPRAM mappings */ | 
|  | 104 | #define DPRAM_RX		0x0000 | 
|  | 105 | #define DPRAM_RX_SIZE	32 | 
|  | 106 | #define DPRAM_RX_CNT	16 | 
|  | 107 | #define DPRAM_RX_RD		0x0201	/* uint8_t */ | 
|  | 108 | #define DPRAM_RX_WR		0x0205	/* uint8_t */ | 
|  | 109 | #define DPRAM_RX_LOST		0x0207	/* uint8_t */ | 
|  | 110 |  | 
|  | 111 | #define DPRAM_FCT_PARAM		0x0300	/* int16_t [20] */ | 
|  | 112 | #define DPRAM_FCT_RESULT	0x0328	/* int16_t */ | 
|  | 113 | #define DPRAM_FCT_HOST		0x032b	/* uint16_t */ | 
|  | 114 |  | 
|  | 115 | #define DPRAM_INFO_BUSSTATE	0x0331	/* uint16_t */ | 
|  | 116 | #define DPRAM_INFO_BUSSTATE2	0x0335	/* uint16_t */ | 
|  | 117 | #define DPRAM_INFO_ERRSTATE	0x0339	/* uint16_t */ | 
|  | 118 | #define DPRAM_INFO_ERRSTATE2	0x033d	/* uint16_t */ | 
|  | 119 | #define DPRAM_RESET		0x0341	/* uint16_t */ | 
|  | 120 | #define DPRAM_CLR_RECV_FIFO	0x0345	/* uint16_t */ | 
|  | 121 | #define DPRAM_RESET_TIME	0x034d	/* uint16_t */ | 
|  | 122 | #define DPRAM_TIME		0x0350	/* uint64_t */ | 
|  | 123 | #define DPRAM_WR_START		0x0358	/* uint8_t */ | 
|  | 124 | #define DPRAM_WR_END		0x0359	/* uint8_t */ | 
|  | 125 | #define DPRAM_RESET_RX_FIFO	0x0361	/* uint16_t */ | 
|  | 126 | #define DPRAM_RESET_TX_FIFO	0x0364	/* uint8_t */ | 
|  | 127 | #define DPRAM_READ_FIFO_LEVEL	0x0365	/* uint8_t */ | 
|  | 128 | #define DPRAM_RX_FIFO_LEVEL	0x0366	/* uint16_t */ | 
|  | 129 | #define DPRAM_TX_FIFO_LEVEL	0x0366	/* uint16_t */ | 
|  | 130 |  | 
|  | 131 | #define DPRAM_TX		0x0400	/* uint16_t */ | 
|  | 132 | #define DPRAM_TX_SIZE	16 | 
|  | 133 | #define DPRAM_TX_CNT	32 | 
|  | 134 | #define DPRAM_TX_RD		0x0601	/* uint8_t */ | 
|  | 135 | #define DPRAM_TX_WR		0x0605	/* uint8_t */ | 
|  | 136 |  | 
|  | 137 | #define DPRAM_COMMAND		0x07e0	/* uint16_t */ | 
|  | 138 | #define DPRAM_RECEIPT		0x07f0	/* uint16_t */ | 
|  | 139 | #define DPRAM_IRQ_TOHOST	0x07fe	/* uint8_t */ | 
|  | 140 | #define DPRAM_IRQ_TOCARD	0x07ff	/* uint8_t */ | 
|  | 141 |  | 
|  | 142 | #define DPRAM_V2_RESET		0x0e00	/* uint8_t */ | 
|  | 143 | #define DPRAM_V2_IRQ_TOHOST	0x0e02	/* uint8_t */ | 
|  | 144 |  | 
|  | 145 | #define TXMAX	(DPRAM_TX_CNT - 1) | 
|  | 146 |  | 
|  | 147 | /* DPRAM return codes */ | 
|  | 148 | #define RES_NONE	0 | 
|  | 149 | #define RES_OK		1 | 
|  | 150 | #define RES_NOK		2 | 
|  | 151 | #define RES_UNKNOWN	3 | 
|  | 152 | /* DPRAM flags */ | 
|  | 153 | #define CMD_TX		0x01 | 
|  | 154 | #define CMD_ACK		0x02 | 
|  | 155 | #define CMD_XTD		0x04 | 
|  | 156 | #define CMD_RTR		0x08 | 
|  | 157 | #define CMD_ERR		0x10 | 
|  | 158 | #define CMD_BUS2	0x80 | 
|  | 159 |  | 
|  | 160 | /* returned fifo entry bus state masks */ | 
|  | 161 | #define SF_MASK_BUSOFF		0x80 | 
|  | 162 | #define SF_MASK_EPASSIVE	0x60 | 
|  | 163 |  | 
|  | 164 | /* bus states */ | 
|  | 165 | #define STATE_BUSOFF	2 | 
|  | 166 | #define STATE_EPASSIVE	1 | 
|  | 167 | #define STATE_EACTIVE	0 |