master/ethernet.c
changeset 1313 ed15eef57d5c
parent 1209 8be462afb7f4
child 1326 ef907b0b5125
equal deleted inserted replaced
1312:74853e018898 1313:ed15eef57d5c
    90         ec_eoe_t *eoe, /**< EoE handler */
    90         ec_eoe_t *eoe, /**< EoE handler */
    91         ec_slave_t *slave /**< EtherCAT slave */
    91         ec_slave_t *slave /**< EtherCAT slave */
    92         )
    92         )
    93 {
    93 {
    94     ec_eoe_t **priv;
    94     ec_eoe_t **priv;
    95     int result, i;
    95     int i, ret = 0;
    96     char name[EC_DATAGRAM_NAME_SIZE];
    96     char name[EC_DATAGRAM_NAME_SIZE];
    97 
    97 
    98     eoe->slave = slave;
    98     eoe->slave = slave;
    99 
    99 
   100     ec_datagram_init(&eoe->datagram);
   100     ec_datagram_init(&eoe->datagram);
   129 
   129 
   130     snprintf(eoe->datagram.name, EC_DATAGRAM_NAME_SIZE, name);
   130     snprintf(eoe->datagram.name, EC_DATAGRAM_NAME_SIZE, name);
   131 
   131 
   132     if (!(eoe->dev = alloc_netdev(sizeof(ec_eoe_t *), name, ether_setup))) {
   132     if (!(eoe->dev = alloc_netdev(sizeof(ec_eoe_t *), name, ether_setup))) {
   133         EC_ERR("Unable to allocate net_device %s for EoE handler!\n", name);
   133         EC_ERR("Unable to allocate net_device %s for EoE handler!\n", name);
       
   134         ret = -ENODEV;
   134         goto out_return;
   135         goto out_return;
   135     }
   136     }
   136 
   137 
   137     // initialize net_device
   138     // initialize net_device
   138     eoe->dev->open = ec_eoedev_open;
   139     eoe->dev->open = ec_eoedev_open;
   154 #if 0
   155 #if 0
   155     eoe->dev->mtu = slave->sii.rx_mailbox_size - ETH_HLEN - 10;
   156     eoe->dev->mtu = slave->sii.rx_mailbox_size - ETH_HLEN - 10;
   156 #endif
   157 #endif
   157 
   158 
   158     // connect the net_device to the kernel
   159     // connect the net_device to the kernel
   159     if ((result = register_netdev(eoe->dev))) {
   160     ret = register_netdev(eoe->dev);
   160         EC_ERR("Unable to register net_device: error %i\n", result);
   161     if (ret) {
       
   162         EC_ERR("Unable to register net_device: error %i\n", ret);
   161         goto out_free;
   163         goto out_free;
   162     }
   164     }
   163 
   165 
   164     // make the last address octet unique
   166     // make the last address octet unique
   165     eoe->dev->dev_addr[ETH_ALEN - 1] = (uint8_t) eoe->dev->ifindex;
   167     eoe->dev->dev_addr[ETH_ALEN - 1] = (uint8_t) eoe->dev->ifindex;
   167 
   169 
   168  out_free:
   170  out_free:
   169     free_netdev(eoe->dev);
   171     free_netdev(eoe->dev);
   170     eoe->dev = NULL;
   172     eoe->dev = NULL;
   171  out_return:
   173  out_return:
   172     return -1;
   174     return ret;
   173 }
   175 }
   174 
   176 
   175 /*****************************************************************************/
   177 /*****************************************************************************/
   176 
   178 
   177 /**
   179 /**
   270         }
   272         }
   271     }
   273     }
   272     printk("\n");
   274     printk("\n");
   273 #endif
   275 #endif
   274 
   276 
   275     if (!(data = ec_slave_mbox_prepare_send(eoe->slave, &eoe->datagram,
   277     data = ec_slave_mbox_prepare_send(eoe->slave, &eoe->datagram,
   276                                             0x02, current_size + 4)))
   278             0x02, current_size + 4);
   277         return -1;
   279     if (IS_ERR(data))
       
   280         return PTR_ERR(data);
   278 
   281 
   279     EC_WRITE_U8 (data,     0x00); // eoe fragment req.
   282     EC_WRITE_U8 (data,     0x00); // eoe fragment req.
   280     EC_WRITE_U8 (data + 1, last_fragment);
   283     EC_WRITE_U8 (data + 1, last_fragment);
   281     EC_WRITE_U16(data + 2, ((eoe->tx_fragment_number & 0x3F) |
   284     EC_WRITE_U16(data + 2, ((eoe->tx_fragment_number & 0x3F) |
   282                             (complete_offset & 0x3F) << 6 |
   285                             (complete_offset & 0x3F) << 6 |
   413         eoe->stats.rx_errors++;
   416         eoe->stats.rx_errors++;
   414         eoe->state = ec_eoe_state_tx_start;
   417         eoe->state = ec_eoe_state_tx_start;
   415         return;
   418         return;
   416     }
   419     }
   417 
   420 
   418     if (!(data = ec_slave_mbox_fetch(eoe->slave, &eoe->datagram,
   421     data = ec_slave_mbox_fetch(eoe->slave, &eoe->datagram,
   419                                      &mbox_prot, &rec_size))) {
   422             &mbox_prot, &rec_size);
       
   423     if (IS_ERR(data)) {
   420         eoe->stats.rx_errors++;
   424         eoe->stats.rx_errors++;
   421         eoe->state = ec_eoe_state_tx_start;
   425         eoe->state = ec_eoe_state_tx_start;
   422         return;
   426         return;
   423     }
   427     }
   424 
   428