aboutsummaryrefslogtreecommitdiffstats
path: root/firmware/microblaze
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/microblaze')
-rw-r--r--firmware/microblaze/apps/txrx_uhd.c18
-rw-r--r--firmware/microblaze/lib/net_common.c4
-rw-r--r--firmware/microblaze/lib/pkt_ctrl.c19
-rw-r--r--firmware/microblaze/lib/pkt_ctrl.h16
4 files changed, 41 insertions, 16 deletions
diff --git a/firmware/microblaze/apps/txrx_uhd.c b/firmware/microblaze/apps/txrx_uhd.c
index 4adccfed9..938491b0e 100644
--- a/firmware/microblaze/apps/txrx_uhd.c
+++ b/firmware/microblaze/apps/txrx_uhd.c
@@ -279,10 +279,16 @@ static void handle_inp_packet(uint32_t *buff, size_t num_lines){
* Called when eth phy state changes (w/ interrupts disabled)
*/
void link_changed_callback(int speed){
- bool link_is_up = speed != 0;
- hal_set_leds(link_is_up ? LED_RJ45 : 0x0, LED_RJ45);
- printf("\neth link changed: speed = %d\n", speed);
- if (link_is_up) send_gratuitous_arp();
+ printf("\neth link changed: speed = %d\n", speed);
+ if (speed != 0){
+ hal_set_leds(LED_RJ45, LED_RJ45);
+ pkt_ctrl_set_routing_mode(PKT_CTRL_ROUTING_MODE_MASTER);
+ send_gratuitous_arp(); //garp after setting the routing mode
+ }
+ else{
+ hal_set_leds(0x0, LED_RJ45);
+ pkt_ctrl_set_routing_mode(PKT_CTRL_ROUTING_MODE_SLAVE);
+ }
}
static void setup_network(void){
@@ -357,10 +363,10 @@ main(void)
while(true){
size_t num_lines;
- void *buff = claim_incoming_buffer(&num_lines);
+ void *buff = pkt_ctrl_claim_incoming_buffer(&num_lines);
if (buff != NULL){
handle_inp_packet((uint32_t *)buff, num_lines);
- release_incoming_buffer();
+ pkt_ctrl_release_incoming_buffer();
}
int pending = pic_regs->pending; // poll for under or overrun
diff --git a/firmware/microblaze/lib/net_common.c b/firmware/microblaze/lib/net_common.c
index cc08997a0..486a34252 100644
--- a/firmware/microblaze/lib/net_common.c
+++ b/firmware/microblaze/lib/net_common.c
@@ -128,7 +128,7 @@ send_pkt(eth_mac_addr_t dst, int ethertype,
ehdr.src = _local_mac_addr;
ehdr.ethertype = ethertype;
- uint32_t *buff = (uint32_t *)claim_outgoing_buffer();
+ uint32_t *buff = (uint32_t *)pkt_ctrl_claim_outgoing_buffer();
// Copy the pieces into the buffer
uint32_t *p = buff;
@@ -165,7 +165,7 @@ send_pkt(eth_mac_addr_t dst, int ethertype,
if (total_len < 60) // ensure that we don't try to send a short packet
total_len = 60;
- commit_outgoing_buffer(total_len/4);
+ pkt_ctrl_commit_outgoing_buffer(total_len/4);
}
unsigned int
diff --git a/firmware/microblaze/lib/pkt_ctrl.c b/firmware/microblaze/lib/pkt_ctrl.c
index 235a09459..f7f808cfc 100644
--- a/firmware/microblaze/lib/pkt_ctrl.c
+++ b/firmware/microblaze/lib/pkt_ctrl.c
@@ -30,24 +30,35 @@ static void set_control(uint32_t value, uint32_t mask){
buffer_pool_ctrl->ctrl = ctrl_shadow;
}
-void *claim_incoming_buffer(size_t *num_lines){
+void pkt_ctrl_set_routing_mode(pkt_ctrl_routing_mode_t mode){
+ switch(mode){
+ case PKT_CTRL_ROUTING_MODE_SLAVE:
+ set_control(0x0, 0x4);
+ break;
+ case PKT_CTRL_ROUTING_MODE_MASTER:
+ set_control(0x4, 0x4);
+ break;
+ }
+}
+
+void *pkt_ctrl_claim_incoming_buffer(size_t *num_lines){
if ((buffer_pool_status->status & 0x1) != 1) return NULL;
*num_lines = (buffer_pool_status->status >> 16) & 0xffff;
set_control(0x1, 0x1);
return buffer_ram(0);
}
-void release_incoming_buffer(void){
+void pkt_ctrl_release_incoming_buffer(void){
set_control(0x0, 0x1);
while ((buffer_pool_status->status & 0x1) != 0){}
}
-void *claim_outgoing_buffer(void){
+void *pkt_ctrl_claim_outgoing_buffer(void){
while ((buffer_pool_status->status & 0x2) != 0x2){}
return buffer_ram(1);
}
-void commit_outgoing_buffer(size_t num_lines){
+void pkt_ctrl_commit_outgoing_buffer(size_t num_lines){
set_control(0x2 | (num_lines << 16), 0x2 | (0xffff << 16));
while ((buffer_pool_status->status & 0x2) != 0x0){}
set_control(0x0, 0x2);
diff --git a/firmware/microblaze/lib/pkt_ctrl.h b/firmware/microblaze/lib/pkt_ctrl.h
index 156fc06dc..86fb46d32 100644
--- a/firmware/microblaze/lib/pkt_ctrl.h
+++ b/firmware/microblaze/lib/pkt_ctrl.h
@@ -20,28 +20,36 @@
#include <stddef.h>
+typedef enum {
+ PKT_CTRL_ROUTING_MODE_SLAVE,
+ PKT_CTRL_ROUTING_MODE_MASTER,
+} pkt_ctrl_routing_mode_t;
+
+//! Set the routing mode for this device
+void pkt_ctrl_set_routing_mode(pkt_ctrl_routing_mode_t mode);
+
/*!
* Try to claim an incomming buffer.
* \param num_lines filled with the buffer size
* \return a pointer to the buffer memory or NULL
*/
-void *claim_incoming_buffer(size_t *num_lines);
+void *pkt_ctrl_claim_incoming_buffer(size_t *num_lines);
/*!
* Release the incoming buffer. Call when done.
*/
-void release_incoming_buffer(void);
+void pkt_ctrl_release_incoming_buffer(void);
/*!
* Claim an outgoing buffer.
* \return a pointer to the buffer
*/
-void *claim_outgoing_buffer(void);
+void *pkt_ctrl_claim_outgoing_buffer(void);
/*!
* Commit the outgoing buffer.
* \param num_lines how many lines written.
*/
-void commit_outgoing_buffer(size_t num_lines);
+void pkt_ctrl_commit_outgoing_buffer(size_t num_lines);
#endif /* INCLUDED_PKT_CTRL_H */