3 * Copyright (C) 2008 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
4 * Copyright (C) 2009 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
28 /* Mutex for data queue */
29 MUTEX_CREATE (mutex_queue_rx
);
31 unsigned char netdev_count
= 0;
33 netdev_t
*netdev_create (mac_addr_t addr_mac
, unsigned (*read
) (char *, unsigned), unsigned (*write
) (char *, unsigned), unsigned addr_io
)
37 /* alloc and init context */
38 dev
= (struct netdev_t
*) kmalloc (sizeof (struct netdev_t
));
43 memcpy (dev
->dev_addr
, (void *) addr_mac
, sizeof (mac_addr_t
));
45 /* assign ethernet id name */
46 dev
->name
= (unsigned char *) kmalloc (sizeof (unsigned char) * 6);
53 sprintf (dev
->name
, "eth%d", netdev_count
);
55 dev
->base_addr
= addr_io
;
63 dev
->queue_rx_cnt
= 0;
64 dev
->queue_tx_cnt
= 0;
66 /* alloc structure for received data queue */
67 dev
->queue_rx_list
.next
= &dev
->queue_rx_list
;
68 dev
->queue_rx_list
.prev
= &dev
->queue_rx_list
;
70 dev
->queue_tx_list
.next
= &dev
->queue_tx_list
;
71 dev
->queue_tx_list
.prev
= &dev
->queue_tx_list
;
73 if (!netif_create (dev
)) {
84 unsigned netdev_rx_add_queue (struct netdev_t
*dev
, char *buffer
, unsigned len
)
86 mutex_lock (&mutex_queue_rx
);
93 netdev_buffer_queue_t
*queue
;
95 /* alloc and init context */
96 queue
= (netdev_buffer_queue_t
*) kmalloc (sizeof (netdev_buffer_queue_t
));
102 queue
->buf
= (char *) kmalloc (sizeof (char) * (len
+ 1));
109 memcpy (queue
->buf
, buffer
, len
);
110 queue
->buf
[len
] = '\0';
113 queue
->next
= &dev
->queue_rx_list
;
114 queue
->prev
= dev
->queue_rx_list
.prev
;
115 queue
->prev
->next
= queue
;
116 queue
->next
->prev
= queue
;
118 mutex_unlock (&mutex_queue_rx
);
122 mutex_unlock (&mutex_queue_rx
);
127 netdev_buffer_queue_t
*netdev_rx_queue (struct netdev_t
*dev
)
132 netdev_buffer_queue_t
*queue
;
133 for (queue
= dev
->queue_rx_list
.next
; queue
!= &dev
->queue_rx_list
; queue
= queue
->next
)
139 unsigned netdev_rx_queue_flush (struct netdev_t
*dev
, netdev_buffer_queue_t
*queue
)
144 queue
->next
->prev
= queue
->prev
;
145 queue
->prev
->next
= queue
->next
;
153 int netdev_rx (struct netdev_t
*dev
, char *buf
, unsigned len
)
158 /* are there any available data in queue ? */
159 netdev_buffer_queue_t
*queue
= netdev_rx_queue (dev
);
164 unsigned l
= queue
->len
;
166 if (l
>= len
) /* TODO - received packet is longer then len (> ~MTU) */
169 /* copy available data from queue to our buffer */
170 memcpy (buf
, queue
->buf
, l
);
174 /* clean old queue entry */
175 netdev_rx_queue_flush (dev
, queue
);
177 /* return available data */