master/device.c
changeset 579 17c6fd3b076e
parent 574 609e58ece96a
child 590 5801d4a4ff7d
equal deleted inserted replaced
578:f402b4bd2f4d 579:17c6fd3b076e
    52    Device constructor.
    52    Device constructor.
    53    \return 0 in case of success, else < 0
    53    \return 0 in case of success, else < 0
    54 */
    54 */
    55 
    55 
    56 int ec_device_init(ec_device_t *device, /**< EtherCAT device */
    56 int ec_device_init(ec_device_t *device, /**< EtherCAT device */
    57                    ec_master_t *master, /**< master owning the device */
    57         ec_master_t *master /**< master owning the device */
    58                    struct net_device *net_dev, /**< net_device structure */
    58         )
    59                    ec_pollfunc_t poll, /**< pointer to device's poll function */
    59 {
    60                    struct module *module /**< the device's module */
       
    61                    )
       
    62 {
       
    63     struct ethhdr *eth;
       
    64 
       
    65     device->master = master;
    60     device->master = master;
       
    61 
       
    62 #ifdef EC_DBG_IF
       
    63     if (ec_debug_init(&device->dbg)) {
       
    64         EC_ERR("Failed to init debug device!\n");
       
    65         goto out_return;
       
    66     }
       
    67 #endif
       
    68 
       
    69     if (!(device->tx_skb = dev_alloc_skb(ETH_FRAME_LEN))) {
       
    70         EC_ERR("Error allocating device socket buffer!\n");
       
    71 #ifdef EC_DBG_IF
       
    72         goto out_debug;
       
    73 #else
       
    74         goto out_return;
       
    75 #endif
       
    76     }
       
    77 
       
    78     // add Ethernet-II-header
       
    79     skb_reserve(device->tx_skb, ETH_HLEN);
       
    80     device->eth = (struct ethhdr *) skb_push(device->tx_skb, ETH_HLEN);
       
    81     device->eth->h_proto = htons(0x88A4);
       
    82     memset(device->eth->h_dest, 0xFF, ETH_ALEN);
       
    83 
       
    84     ec_device_detach(device); // resets remaining fields
       
    85     return 0;
       
    86 
       
    87 #ifdef EC_DBG_IF
       
    88  out_debug:
       
    89     ec_debug_clear(&device->dbg);
       
    90 #endif
       
    91  out_return:
       
    92     return -1;
       
    93 }
       
    94 
       
    95 /*****************************************************************************/
       
    96 
       
    97 /**
       
    98    EtherCAT device destuctor.
       
    99 */
       
   100 
       
   101 void ec_device_clear(ec_device_t *device /**< EtherCAT device */)
       
   102 {
       
   103     if (device->open) ec_device_close(device);
       
   104     dev_kfree_skb(device->tx_skb);
       
   105 #ifdef EC_DBG_IF
       
   106     ec_debug_clear(&device->dbg);
       
   107 #endif
       
   108 }
       
   109 
       
   110 /*****************************************************************************/
       
   111 
       
   112 /**
       
   113    Associate with net_device.
       
   114 */
       
   115 
       
   116 void ec_device_attach(ec_device_t *device, /**< EtherCAT device */
       
   117         struct net_device *net_dev, /**< net_device structure */
       
   118         ec_pollfunc_t poll, /**< pointer to device's poll function */
       
   119         struct module *module /**< the device's module */
       
   120         )
       
   121 {
       
   122     ec_device_detach(device); // resets fields
       
   123 
    66     device->dev = net_dev;
   124     device->dev = net_dev;
    67     device->poll = poll;
   125     device->poll = poll;
    68     device->module = module;
   126     device->module = module;
    69 
   127 
       
   128     device->tx_skb->dev = net_dev;
       
   129     memcpy(device->eth->h_source, net_dev->dev_addr, ETH_ALEN);
       
   130 }
       
   131 
       
   132 /*****************************************************************************/
       
   133 
       
   134 /**
       
   135    Disconnect from net_device.
       
   136 */
       
   137 
       
   138 void ec_device_detach(ec_device_t *device /**< EtherCAT device */)
       
   139 {
       
   140     device->dev = NULL;
       
   141     device->poll = NULL;
       
   142     device->module = NULL;
    70     device->open = 0;
   143     device->open = 0;
    71     device->link_state = 0; // down
   144     device->link_state = 0; // down
    72 
       
    73     device->tx_count = 0;
   145     device->tx_count = 0;
    74     device->rx_count = 0;
   146     device->rx_count = 0;
    75 
   147     device->tx_skb->dev = NULL;
    76 #ifdef EC_DBG_IF
       
    77     if (ec_debug_init(&device->dbg)) {
       
    78         EC_ERR("Failed to init debug device!\n");
       
    79         goto out_return;
       
    80     }
       
    81 #endif
       
    82 
       
    83     if (!(device->tx_skb = dev_alloc_skb(ETH_FRAME_LEN))) {
       
    84         EC_ERR("Error allocating device socket buffer!\n");
       
    85 #ifdef EC_DBG_IF
       
    86         goto out_debug;
       
    87 #else
       
    88         goto out_return;
       
    89 #endif
       
    90     }
       
    91 
       
    92     device->tx_skb->dev = net_dev;
       
    93 
       
    94     // add Ethernet-II-header
       
    95     skb_reserve(device->tx_skb, ETH_HLEN);
       
    96     eth = (struct ethhdr *) skb_push(device->tx_skb, ETH_HLEN);
       
    97     eth->h_proto = htons(0x88A4);
       
    98     memcpy(eth->h_source, net_dev->dev_addr, net_dev->addr_len);
       
    99     memset(eth->h_dest, 0xFF, net_dev->addr_len);
       
   100 
       
   101     return 0;
       
   102 
       
   103 #ifdef EC_DBG_IF
       
   104  out_debug:
       
   105     ec_debug_clear(&device->dbg);
       
   106 #endif
       
   107  out_return:
       
   108     return -1;
       
   109 }
       
   110 
       
   111 /*****************************************************************************/
       
   112 
       
   113 /**
       
   114    EtherCAT device destuctor.
       
   115 */
       
   116 
       
   117 void ec_device_clear(ec_device_t *device /**< EtherCAT device */)
       
   118 {
       
   119     if (device->open) ec_device_close(device);
       
   120     if (device->tx_skb) dev_kfree_skb(device->tx_skb);
       
   121 #ifdef EC_DBG_IF
       
   122     ec_debug_clear(&device->dbg);
       
   123 #endif
       
   124 }
   148 }
   125 
   149 
   126 /*****************************************************************************/
   150 /*****************************************************************************/
   127 
   151 
   128 /**
   152 /**