[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 メーリングリストの案内