123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- typedef uint32_t __u32;
- typedef uint16_t __u16;
- typedef uint8_t __u8;
-
- static int verbose_messages=0;
- static int print_info=0;
- static int fatal_condition=0;
- static int fw_fatal;
-
- #define tprintf(fmt, a...) \
- do { \
- if ( verbose_messages ) { \
- printf("%s:%d: " fmt "\n", __func__, __LINE__, ##a); \
- } \
- } \
- while(0)
-
- #define eprintf(fmt, a...) \
- printf("%s:%d: " fmt "\n", __func__, __LINE__, ##a)
-
- static void cpu_to_be_buf(void *buf, int size)
- {
- int dw_sz = size >> 2, i;
-
- for (i = 0; i < dw_sz; ++i) {
- ((__u32 *) buf)[i] = cpu_to_be32(((__u32 *) buf)[i]);
- }
- }
-
- static void be_to_cpu_buf(void *buf, int size)
- {
- int dw_sz = size >> 2, i;
- u32 *p = buf;
-
- for (i = 0; i < dw_sz; ++i) {
- p[i] = be32_to_cpu(p[i]);
- }
- }
-
- #include "cmdif_mt23108.c"
- #include "cmdif_comm.c"
- #include "ib_mt23108.c"
- #include "ib_mad.c"
- #include "ib_driver.c"
- #include "ipoib.c"
-
- static int probe_imp(struct pci_device *pci, struct nic *nic)
- {
- int rc;
-
- if (0 && nic) { /* just to supress warning */
- return 0;
- }
-
- fatal_condition= 0;
- fw_fatal= 0;
-
- tprintf("");
- rc = ipoib_init(pci);
- if (rc)
- return rc;
-
- tprintf("");
-
- return rc;
- }
-
- static int disable_imp(void)
- {
- int rc;
-
- rc = ipoib_close(fw_fatal);
-
- return rc;
- }
-
- static int transmit_imp(const char *dest, /* Destination */
- unsigned int type, /* Type */
- const char *packet, /* Packet */
- unsigned int size)
- { /* size */
- int rc;
-
- if (fatal_condition) {
- /* since the transmit function does not return a value
- we return success but do nothing to suppress error messages */
- return 0;
- }
-
- rc = ipoib_send_packet(dest, type, packet, size);
- if (rc) {
- printf("*** ERROR IN SEND FLOW ***\n");
- printf("restarting Etherboot\n");
- sleep(1);
- longjmp(restart_etherboot, -1);
- /* we should not be here ... */
- return -1;
- }
-
- return rc;
- }
-
- static void hd(void *where, int n)
- {
- int i;
-
- while (n > 0) {
- printf("%X ", where);
- for (i = 0; i < ((n > 16) ? 16 : n); i++)
- printf(" %hhX", ((char *)where)[i]);
- printf("\n");
- n -= 16;
- where += 16;
- }
- }
-
- static int poll_imp(struct nic *nic, int retrieve, unsigned int *size_p)
- {
- static char packet[2048];
- static char *last_packet_p = NULL;
- static unsigned long last_packet_size;
- char *packet_p;
- const int eth_header_len = 14;
- unsigned int packet_len;
- int is_bcast = 0;
- __u16 prot, *ptr;
- int rc;
-
- if (0 && nic) { /* just to supress warning */
- return -1;
- }
-
- if (fatal_condition) {
- *size_p = 0;
- return 0;
- }
-
- if (poll_error_buf()) {
- fatal_condition= 1;
- fw_fatal= 1;
- printf("\n *** DEVICE FATAL ERROR ***\n");
- goto fatal_handling;
- }
- else if (drain_eq()) {
- fatal_condition= 1;
- printf("\n *** FATAL ERROR ***\n");
- goto fatal_handling;
- }
-
-
- if (retrieve) {
- /* we actually want to read the packet */
- if (last_packet_p) {
- eprintf("");
- /* there is already a packet that was previously read */
- memcpy(nic->packet, last_packet_p, last_packet_size);
- *size_p = last_packet_size;
- last_packet_p = NULL;
- return 0;
- }
- packet_p = nic->packet;
- } else {
- /* we don't want to read the packet,
- just know if there is one. so we
- read the packet to a local buffer and
- we will return that buffer when the ip layer wants
- another packet */
- if (last_packet_p) {
- /* there is already a packet that
- was not consumend */
- eprintf("overflow receive packets");
- return -1;
- }
- packet_p = packet;
- }
-
- rc = ipoib_read_packet(&prot, packet_p + eth_header_len, &packet_len,
- &is_bcast);
- if (rc) {
- printf("*** FATAL IN RECEIVE FLOW ****\n");
- goto fatal_handling;
- }
-
- if (packet_len == 0) {
- *size_p = 0;
- return 0;
- }
-
- if (is_bcast) {
- int i;
- for (i = 0; i < 6; ++i) {
- packet_p[i] = 0xff;
- }
- } else {
- packet_p[0] = MLX_ETH_BYTE0;
- packet_p[1] = MLX_ETH_BYTE1;
- packet_p[2] = MLX_ETH_BYTE2;
- packet_p[3] = 0;
- packet_p[4] = 0;
- packet_p[5] = 0;
- }
-
- memset(packet_p + 6, 0, 6);
-
- ptr = (__u16 *) (packet_p + 12);
- *ptr = htons(prot);
-
- if (!retrieve) {
- last_packet_p = packet;
- last_packet_size = packet_len + eth_header_len;
- *size_p = 0;
- }
-
- *size_p = packet_len + eth_header_len;
- tprintf("packet size=%d, prot=%x\n", *size_p, prot);
- if (0) {
- hd(nic->packet, 42);
- }
-
- return 0;
-
- fatal_handling:
- printf("restarting Etherboot\n");
- sleep(1);
- longjmp(restart_etherboot, -1);
- /* we should not be here ... */
- return -1;
-
- }
|