summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorChristian Mauderer <Christian.Mauderer@embedded-brains.de>2012-04-03 14:35:55 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-07-18 09:46:13 +0200
commit356c9285e3303371af78bf7fdabebccf713d238f (patch)
tree22347b33d12b4df5d082471f48ce42ab7eef74a0 /c
parentbsp/mpc55xx: Support re-initialization of eDMA (diff)
downloadrtems-356c9285e3303371af78bf7fdabebccf713d238f.tar.bz2
bsp/mpc55xx: Implement network interface off
Diffstat (limited to 'c')
-rw-r--r--c/src/lib/libbsp/powerpc/mpc55xxevb/network/smsc9218i.c32
1 files changed, 29 insertions, 3 deletions
diff --git a/c/src/lib/libbsp/powerpc/mpc55xxevb/network/smsc9218i.c b/c/src/lib/libbsp/powerpc/mpc55xxevb/network/smsc9218i.c
index 3ec27b59fb..c32486c6d5 100644
--- a/c/src/lib/libbsp/powerpc/mpc55xxevb/network/smsc9218i.c
+++ b/c/src/lib/libbsp/powerpc/mpc55xxevb/network/smsc9218i.c
@@ -1788,6 +1788,33 @@ static void smsc9218i_interface_stats(smsc9218i_driver_entry *e)
printf("frame compact count: %u\n", jc->frame_compact_count);
}
+static void smsc9218i_interface_off(struct ifnet *ifp)
+{
+ smsc9218i_driver_entry *e = (smsc9218i_driver_entry *) ifp->if_softc;
+ rtems_status_code sc = RTEMS_SUCCESSFUL;
+ rtems_interrupt_level level;
+ union SIU_DIRER_tag direr = MPC55XX_ZERO_FLAGS;
+
+ /* remove interrupt handler */
+ sc = rtems_interrupt_handler_remove(
+ MPC55XX_IRQ_SIU_EXTERNAL_0,
+ smsc9218i_interrupt_handler,
+ e
+ );
+ ASSERT_SC(sc);
+
+ mpc55xx_edma_release_channel(
+ &e->edma_receive
+ );
+
+ mpc55xx_edma_release_channel(
+ &e->edma_transmit
+ );
+
+ /* set in reset state */
+ smsc9218i_reset_signal(false);
+}
+
static int smsc9218i_interface_ioctl(
struct ifnet *ifp,
ioctl_command_t command,
@@ -1808,12 +1835,11 @@ static int smsc9218i_interface_ioctl(
ether_ioctl(ifp, command, data);
break;
case SIOCSIFFLAGS:
- if (ifp->if_flags & IFF_RUNNING) {
- /* TODO: off */
- }
if (ifp->if_flags & IFF_UP) {
ifp->if_flags |= IFF_RUNNING;
/* TODO: init */
+ } else {
+ smsc9218i_interface_off(ifp);
}
break;
case SIO_RTEMS_SHOW_STATS: