[질문] sis900 이더넷 카드에서 wol 기능을 사용하고 싶습니다.

unjena의 이미지

안녕하세요

커널 2.4 젠투를 사용하고 있습니다.

항상 켜놓고 다닐 수 없기때문에, 필요할때만 사용할 수 없을까

여기저기 찾아다니다 보니 온보드에 달린 sis900 이더넷 카드에

아래 코드를 패치하면 wol 기능을 사용할 수 있다고 하더군요.

인스톨하고 사용할줄만 알았지 패치라는걸 해 본적도 없고해서 어

떻게 해야 할지 모르겠습니다.

아래 코드를 어떻게 사용해야 하는지 가르쳐주시면 감사하겠습니다.

diff --unified --recursive linux-2.4.21/drivers/net/sis900.c linux-2.4.21sis900_wol/drivers/net/sis900.c
--- linux-2.4.21/drivers/net/sis900.c	2003-06-13 15:51:35.000000000 +0100
+++ linux-2.4.21sis900_wol/drivers/net/sis900.c	2003-07-16 11:55:10.000000000 +0100
@@ -1,6 +1,6 @@
 /* sis900.c: A SiS 900/7016 PCI Fast Ethernet driver for Linux.
    Copyright 1999 Silicon Integrated System Corporation 
-   Revision:	1.08.06 Sep. 24 2002
+   Revision: 1.08.07 Jul. 16 2003
    
    Modified from the driver which is originally written by Donald Becker.
    
@@ -18,6 +18,8 @@
    preliminary Rev. 1.0 Jan. 18, 1998
    http://www.sis.com.tw/support/databook.htm
 
+
+   Rev 1.08.07 Jul. 16 2003 David M. Wilson <dw-sis900@botanicus.net> reintegrate WOL patch.
    Rev 1.08.06 Sep. 24 2002 Mufasa Yang bug fix for Tx timeout & add SiS963 support
    Rev 1.08.05 Jun. 6 2002 Mufasa Yang bug fix for read_eeprom & Tx descriptor over-boundary 
    Rev 1.08.04 Apr. 25 2002 Mufasa Yang <mufasa@sis.com.tw> added SiS962 support
@@ -69,18 +71,20 @@
 #include <asm/processor.h>      /* Processor type for cache alignment. */
 #include <asm/bitops.h>
 #include <asm/io.h>
-#include <asm/uaccess.h>	/* User space memory access functions */
+#include <asm/uaccess.h>        /* User space memory access functions */
 
 #include "sis900.h"
 
 #define SIS900_MODULE_NAME "sis900"
-#define SIS900_DRV_VERSION "v1.08.06 9/24/2002"
+#define SIS900_DRV_VERSION "v1.08.07 7/16/2003"
+#define SIS900_WOL_DEFAULT 0
 
 static char version[] __devinitdata =
 KERN_INFO "sis900.c: " SIS900_DRV_VERSION "\n";
 
 static int max_interrupt_work = 40;
 static int multicast_filter_limit = 128;
+static int enable_wol = SIS900_WOL_DEFAULT;
 
 #define sis900_debug debug
 static int sis900_debug;
@@ -179,9 +183,11 @@
 MODULE_PARM(multicast_filter_limit, "i");
 MODULE_PARM(max_interrupt_work, "i");
 MODULE_PARM(debug, "i");
+MODULE_PARM(enable_wol, "i");
 MODULE_PARM_DESC(multicast_filter_limit, "SiS 900/7016 maximum number of filtered multicast addresses");
 MODULE_PARM_DESC(max_interrupt_work, "SiS 900/7016 maximum events handled per interrupt");
 MODULE_PARM_DESC(debug, "SiS 900/7016 debug level (2-4)");
+MODULE_PARM_DESC(enable_wol, "Enable Wake-on-LAN support (0/1)");
 
 static int sis900_open(struct net_device *net_dev);
 static int sis900_mii_probe (struct net_device * net_dev);
@@ -908,6 +914,7 @@
 {
 	struct sis900_private *sis_priv = net_dev->priv;
 	long ioaddr = net_dev->base_addr;
+	u32 cfgpmcsr;
 	u8 revision;
 	int ret;
 
@@ -934,6 +941,15 @@
 	/* Workaround for EDB */
 	sis900_set_mode(ioaddr, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED);
 
+	/* Enable Wake-on-LAN if requested. */
+	if (enable_wol) {
+		pci_read_config_dword(sis_priv->pci_dev, CFGPMCSR, &cfgpmcsr);
+		cfgpmcsr |= PME_EN;
+		pci_write_config_dword(sis_priv->pci_dev, CFGPMCSR, cfgpmcsr);
+		outl(inl(ioaddr + pmctrl) | MAGICPKT | ALGORITHM, ioaddr + pmctrl);
+	} else
+		outl(inl(ioaddr + pmctrl) & ~MAGICPKT, ioaddr + pmctrl);
+
 	/* Enable all known interrupts by setting the interrupt mask. */
 	outl((RxSOVR|RxORN|RxERR|RxOK|TxURN|TxERR|TxIDLE), ioaddr + imr);
 	outl(RxENA | inl(ioaddr + cr), ioaddr + cr);
diff --unified --recursive linux-2.4.21/drivers/net/sis900.h linux-2.4.21sis900_wol/drivers/net/sis900.h
--- linux-2.4.21/drivers/net/sis900.h	2002-11-28 23:53:14.000000000 +0000
+++ linux-2.4.21sis900_wol/drivers/net/sis900.h	2003-07-16 11:18:47.000000000 +0100
@@ -140,6 +140,25 @@
 	EEREQ = 0x00000400, EEDONE = 0x00000200, EEGNT = 0x00000100
 };
 
+/* Wake-on-LAN support. */
+enum sis900_power_management_control_register_bits {
+	LINKLOSS  = 0x00000001,
+	LINKON    = 0x00000002,
+	MAGICPKT  = 0x00000400,
+	ALGORITHM = 0x00000800,
+	FRM1EN    = 0x00100000,
+	FRM2EN    = 0x00200000,
+	FRM3EN    = 0x00400000,
+	FRM1ACS   = 0x01000000,
+	FRM2ACS   = 0x02000000,
+	FRM3ACS   = 0x04000000,
+	WAKEALL   = 0x40000000,
+	GATECLK   = 0x80000000
+};
+
+#define CFGPMCSR 0x44
+#define PME_EN 0x100
+
 /* Manamgement Data I/O (mdio) frame */
 #define MIIread         0x6000
 #define MIIwrite        0x5002

codebank의 이미지

------------------------------
좋은 하루 되세요.

unjena의 이미지

codebank님 께서 링크해주신 문서를 보고 따라 해 봤습니다.

love src # pwd
/usr/src
love src # patch -p0 < sis900_wol.patch
patching file linux-2.4.21/drivers/net/sis900.c
Hunk #2 FAILED at 18.
Hunk #3 FAILED at 71.
Hunk #4 succeeded at 185 (offset 2 lines).
Hunk #5 succeeded at 947 (offset 33 lines).
Hunk #6 succeeded at 975 (offset 34 lines).
2 out of 6 hunks FAILED -- saving rejects to file linux-2.4.21/drivers/net/sis900.c.rej
patching file linux-2.4.21/drivers/net/sis900.h
Hunk #1 FAILED at 140.
1 out of 1 hunk FAILED -- saving rejects to file linux-2.4.21/drivers/net/sis900.h.rej

이런 결과가 나옵니다.
참조한 문서에 따르면 rej 파일이 생기면 안된다고 했던것 같은데,
뭘 잘못했는지 알 수 가 없습니다.

조금만 더 도와주시면 감사하겠습니다.

問世問 情是何物,
直敎生死相許?
天南地北雙飛客,
老翅幾回寒暑?
歡樂趣 , 離別苦,
就中更有癡兒女.
君應有語, 渺萬里層雲,
千山暮雪,
隻影向誰去?
((赤憐劍郞 ))

codebank의 이미지

아~ 죄송합니다.
제가 집에서는 통신을 못해서 늦게 봤습니다.

rej파일이 생기면 안된다고는 하지만 가끔 생기는 수도 있습니다.
같은 패치를 두번 적용시키거나 비교파일이 너무 많이 틀려져서 그런경우도 있습니다만
그럴 확률은 아주 적죠.

문제를 해결하기 위해서는 patch파일과 실제 바뀐파일을 비교해 보시면 됩니다.
.patch파일의 구조가 그리 어렵지 않으니 다음글을 참조해서 한번 비교해 보시고 이상이
없다면 그대로 커널 컴파일을 하시면 됩니다.

@@ 이 표시는 라인을 뜻합니다. 즉, 소스의 표시된 라인으로 이동하면 그 위 아래로
그 아래 나열된 문자열들을 발견할 수가 있을겁니다.
- 원본 소스에서 빠질 내용입니다.
+원본 소스에 더해질 내용입니다.

이 세가지 정도만 알고 계신다면 patch파일을 보시고 직접 소스를 수정해도 상관은 없습니다.
일단 간단한 예를 들어보면

@@ -69,18 +71,20 @@
 #include <asm/processor.h>      /* Processor type for cache alignment. */
 #include <asm/bitops.h>
 #include <asm/io.h>
-#include <asm/uaccess.h>   /* User space memory access functions */
+#include <asm/uaccess.h>        /* User space memory access functions */

 #include "sis900.h"

 #define SIS900_MODULE_NAME "sis900"
-#define SIS900_DRV_VERSION "v1.08.06 9/24/2002"
+#define SIS900_DRV_VERSION "v1.08.07 7/16/2003"
+#define SIS900_WOL_DEFAULT 0

 static char version[] __devinitdata =
 KERN_INFO "sis900.c: " SIS900_DRV_VERSION "\n";

 static int max_interrupt_work = 40;
 static int multicast_filter_limit = 128;
+static int enable_wol = SIS900_WOL_DEFAULT;

 #define sis900_debug debug
 static int sis900_debug;

위의 내용은 위 patch파일 본문중의 한내용입니다.
일단 @@ -69,18 +71,20 @@라고 표시된줄의 뜻은 원본 소스의 69라인부터 18줄 이라는
소리입니다. 다음의 71,20은 바뀐 소스의 71줄부터 20줄을 뜻하죠.
즉, 뒤의 숫자는 앞전에 patch가 이루워진 이후의 숫자를 뜻합니다.
일단 linux/drivers/net/sis900.c 파일을 열고 69라인으로 이동하면 그 아래 코드들이 보일
겁니다.
거기서 -#include <asm/uaccess.h> /* User... */ 이부분은 이 라인을 삭제하고
+#include <asm/uaccess... 이부분을 넣으라는 소리지요.
일방적으로 -되는 경우도 있고 +되는 경우도 있고 위처럼 교환하는 경우도 있습니다만
그냥 -와 +를 보고 지우고 넣고를 해주면 됩니다.

이미 patch가 끝났다면 위의 @@, -, +표시를 보면서 적절한 위치에 해당 값들이 들어갔는지만을
확인해주면 됩니다.
올리신 patch파일의 경우에는 한개의 파일에만 적용되는데 만일 여러 파일에 적용되는 patch가
있다면 diff --unified...로 된 문장을 찾아보면 뒤에나오는 해당 파일이 참조되는 것이므로
그 파일에 대해서 적절히 적용이 되었는지만 보시면 될겁니다.

그리고 rej파일이 생겼다면 그 파일도 한번 열어서 읽어보세요. 아마 무슨이유때문에 reject가
되었는지를 설명하고 있을겁니다.(보통은 이미 적용된 patch이기 때문에...)
참고로 gentoo의 경우에는 커널 뒤에붙는 r1, r10 이런 부분이 패치가 몇개 적용되었다는 것을
표시합니다. 따라서 표준 커널소스에 patch를 적용시키는것과는 약간의 차이가 있을 수가 있습니다.
(이게 rej파일이 생기는 원인일 수도 있다는 소리이지요.)

그리 많은 라인이 아닌것 같은데 직접 소스를 비교해 보시고 컴파일을 해보시길 바랍니다.

P.S. : 아~ 마지막 부분에 sis900.h에 대한 패치도 있었군요. 위와 마찬가지로 sis900.h파일에
대해서도 patch파일에 적혀있는 내용이 적용되어있는지 확인해 보시고 없다면 직접 넣어주시면
됩니다. :)

------------------------------
좋은 하루 되세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.