[Armadillo:02206] Re: リンクアップ/ダウンを検出する方法

Hiroki Nakamura email@hidden
2007年 10月 12日 (金) 10:49:12 JST


お世話になっております。
nakamuraです。

随分、遅くなりましたが、、

> 現在のカーネルでは、Armadillo-9は、LANケーブルの接続状態を取得することが
> できませんが、添付の、a9_get_ethlink.patchを、linux-2.6.12.3-a9-9にあて
> ることで、取得できるようになります。

http://armadillo.atmark-techno.com/filebrowser/armadillo-9/image/linux2.6

にあったカーネルイメージlinux-2.6.12.3-a9-10.bin.gzを
使用したところ、Link Up/Downを検出することが出来ました。

以上、、
よろしくお願いします。



----- Original Message ----- 
From: "mizo" <email@hidden>
To: "Hiroki Nakamura" <email@hidden>; "Armadillo series
general discussion list" <email@hidden>
Sent: Friday, August 24, 2007 9:35 PM
Subject: Re: [Armadillo:01940] リンクアップ/ダウンを検出する方法


> 溝渕です。
>
> 現在のカーネルでは、Armadillo-9は、LANケーブルの接続状態を取得することが
> できませんが、添付の、a9_get_ethlink.patchを、linux-2.6.12.3-a9-9にあて
> ることで、取得できるようになります。
>
> また、添付のeth_link_get.cは、LANケーブルの状態を取得するサンプルです。
>
> よろしければ試してみてください。
>
> Hiroki Nakamura wrote:
> > お世話になります。
> > nakamuraと申します。
> >
> > Armadillo-9を使用しております。
> >
> > 「[Armadillo:00824] Re: リンクアップ/ダウンを検出する方法」に従って
> > ★のようなTPを作成してArmadillo-9で動作させました。しかし、LANケーブル
> > 接続の有無に拠らず、常にLink downとなっているよです。
> > 提示された方法は、Armadillo-9には適用されないのでしょうか?
> >
> > カーネルは以下です。
> > Linux armadillo9 2.6.12.3-a9-8 #1 Fri Oct 20 13:55:08 JST 2006 armv4tl
> > GNU/Linux
> >
> > ↓★↓
> > #include <sys/socket.h>
> > #include <netinet/in.h>
> > #include <arpa/inet.h>
> > #include <sys/ioctl.h>
> > #include <net/if.h>
> >
> > int Eth_Link_Get(char *ifname);
> >
> > int main(void)
> > {
> >  int flg;
> >  int ret;
> >  char buf[20];
> >
> >  flg = 0;
> >
> >  for(;;) {
> >
> >   sleep(1);
> >
> >   ret = Eth_Link_Get(buf);  //リンク確認
> >
> >   if(ret == 0) { //リンクアップ
> >    printf("Link Up !\n");
> >   }
> >   else {    //リンクダウン
> >    printf("Link down !\n");
> >   }
> >
> >  }
> >
> >  return 0;
> > }
> >
> > int Eth_Link_Get(char *ifname)
> > {
> >     struct ifreq ifr;
> >     int skfd=-1;
> >     int ret = -1;
> >
> >     /* ソケットを開く */
> >     skfd = socket(AF_INET, SOCK_DGRAM, 0);
> >     if (skfd < 0) {
> >         close(skfd);
> >         // リンクダウン
> >         return(-1) ;
> >     }
> >
> >     /* インターフェースを取得する */
> >     strcpy(ifr.ifr_name, ifname);
> >     if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0) {
> >         close(skfd);
> >         // リンクダウン
> >         return(-1);
> >     }
> >
> >     /* リンク状態確認 */
> >     if (ifr.ifr_flags & IFF_UP) {
> >         /* IPアドレス確認 */
> >         if (ioctl(skfd, SIOCGIFADDR, &ifr) == 0) {
> >                 // リンクアップ
> >                 ret = 0;
> >         }
> >     }
> >
> >     close(skfd);
> >
> >     return(ret);
> > }
> >
> > 以上、
> > よろしくお願いします。
> >
> > _______________________________________________
> > armadillo mailing list
> > email@hidden
> > http://lists.atmark-techno.com/mailman/listinfo/armadillo
> >
>
>


----------------------------------------------------------------------------
----


> --- linux-2.6.12.3-a9-9_orig/drivers/net/ep93xx_eth.c 2007-07-23
18:02:57.000000000 +0900
> +++ linux-2.6.12.3-a9-9/drivers/net/ep93xx_eth.c 2007-08-24
20:30:47.000000000 +0900
> @@ -1,3 +1,4 @@
> +
>
/*--------------------------------------------------------------------------
--
>   * ep93xx_eth.c
>   *  Ethernet Device Driver for Cirrus Logic EP93xx.
> @@ -56,6 +57,9 @@
>  #include <linux/etherdevice.h>
>  #include <linux/skbuff.h>
>
> +#include <linux/timer.h>
> +#include <linux/if_arp.h>
> +
>  #include <asm/arch/hardware.h>
>  #include <asm/arch/ssp.h>
>
> @@ -273,6 +277,12 @@
>  // To know if PHY auto-negotiation has done?
>  static int gPhyAutoNegoDone=0;
>
> +#if defined(CONFIG_ARCH_ARMADILLO9)
> +static void armadillo9_get_eth_state(unsigned long);
> +static struct timer_list armadillo9_get_eth_state_timer =
> +TIMER_INITIALIZER(armadillo9_get_eth_state, 0, 0);
> +#endif
> +
>
/*==========================================================================
==
>   *
>   * Internal Routines
> @@ -1312,23 +1322,26 @@
>
>  static struct phyirq_info phyirq = {&portf, 1};
>
> -static int
> -ep93xxEth_isr_phy(int irq, void *pDev, struct pt_regs *pRegs)
> +static void
> +ep93xxEth_set_link_state(struct net_device *pD)
>  {
> - struct net_device *pD = pDev;
> - u32 gpio_intsts;
>   u16 status;
>
>   status = phy_rd(19);
>   status = phy_rd(1);
>
> - if (status & 0x04) {
> - printk(KERN_DEBUG "%s(): link up.\n", __FUNCTION__);
> + if (status & 0x04)
>   netif_carrier_on(pD);
> - } else {
> - printk(KERN_DEBUG "%s(): link down.\n", __FUNCTION__);
> + else
>   netif_carrier_off(pD);
> - }
> +}
> +
> +static int
> +ep93xxEth_isr_phy(int irq, void *pDev, struct pt_regs *pRegs)
> +{
> + u32 gpio_intsts;
> +
> + ep93xxEth_set_link_state((struct net_device *)pDev);
>
>   gpio_intsts = inl(GPIO_INTSTATUSF);
>   outl(gpio_intsts & phyirq.bit, GPIO_FEOI);
> @@ -1336,6 +1349,32 @@
>   return IRQ_HANDLED;
>  }
>
> +#if defined(CONFIG_ARCH_ARMADILLO9)
> +static void
> +armadillo9_get_eth_state(unsigned long data)
> +{
> + struct net_device *pD = dev_base;
> + u32 gpio_intsts;
> + u16 status;
> + int i = 0;
> +
> + while (pD != NULL) {
> + if (pD->type != ARPHRD_ETHER) {
> + pD = pD->next;
> + continue;
> + }
> +
> + ep93xxEth_set_link_state(pD);
> +
> + pD = pD->next;
> + }
> +
> + mod_timer(&armadillo9_get_eth_state_timer, jiffies + HZ/10);
> +
> + return;
> +}
> +#endif
> +
>  static void
>  config_gpio_phyirq(void)
>  {
> @@ -1640,6 +1679,10 @@
>   return err;
>   }
>
> +#if defined(CONFIG_ARCH_ARMADILLO9)
> + mod_timer(&armadillo9_get_eth_state_timer, jiffies + HZ/10);
> +#endif
> +
>   return 0;
>  }
>
>


----------------------------------------------------------------------------
----


> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <errno.h>
> #include <netinet/in.h>
> #include <net/if.h>
> #include <sys/socket.h>
> #include <sys/ioctl.h>
> #include <unistd.h>
>
> int Eth_Link_Get(char *iface)
> {
> struct ifreq ifreq;
> int fd;
> int ret;
>
> memset(&ifreq, 0, sizeof(struct ifreq));
>
> fd = socket(PF_INET, SOCK_RAW, IPPROTO_RAW);
> if (fd < 0) {
> perror("socket");
> exit(-1);
> }
>
> strcpy(ifreq.ifr_ifrn.ifrn_name, iface);
>
> ret = ioctl(fd, SIOCGIFFLAGS, &ifreq);
> if (ret < 0) {
> perror("ioctl");
> exit(-1);
> }
>
> if(ifreq.ifr_flags & IFF_RUNNING)
> return 0; /* up */
>
> return 1; /* down */
> }
>
> int main(int argc, char *argv[])
> {
> int ret;
>
> while (1) {
> ret = Eth_Link_Get("eth0");
>
> if (ret)
> printf("link down\n");
> else
> printf("link up\n");
>
> sleep(1);
> }
>
> return 0;
> }
>




armadillo メーリングリストの案内