that's the work of a memcpy (dst, src, -2) and -2 is a very big
number on an Alpha:-). Try the patch below (this patch will be
included in Fritz next patch). But this patch isn't sufficient
enough, because there are some problems with the skbuff handling
in the icn driver. I also append an experimental patch (it's on top
of my last patch), which does work with some problems (ftp receive
works, but transmit get stuck after 24kbyte). I'm still working on
that issue.
Thomas.
Index: isdn_net.c
===================================================================
RCS file: /i4ldev/isdn/drivers/isdn/isdn_net.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- isdn_net.c 1996/06/11 14:54:08 1.14
+++ isdn_net.c 1996/06/16 17:42:54 1.15
@@ -1,4 +1,4 @@
-/* $Id: isdn_net.c,v 1.14 1996/06/11 14:54:08 hipp Exp $
+/* $Id: isdn_net.c,v 1.15 1996/06/16 17:42:54 tsbogend Exp $
*
* Linux ISDN subsystem, network interfaces and related functions (linklevel).
*
@@ -21,6 +21,9 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log: isdn_net.c,v $
+ * Revision 1.15 1996/06/16 17:42:54 tsbogend
+ * fixed problem with IP addresses on Linux/Alpha (long is 8 byte there)
+ *
* Revision 1.14 1996/06/11 14:54:08 hipp
* minor bugfix in isdn_net_send_skb
* changes in BSENT callback handler for syncPPP
@@ -110,7 +113,7 @@
extern void dev_purge_queues(struct device *dev); /* move this to net/core/dev.c */
-char *isdn_net_revision = "$Revision: 1.14 $";
+char *isdn_net_revision = "$Revision: 1.15 $";
/*
* Code for raw-networking over ISDN
@@ -138,9 +141,9 @@
isdn_net_reset(dev);
dev->start = 1;
/* Fill in the MAC-level header. */
- for (i = 0; i < ETH_ALEN - sizeof(ulong); i++)
+ for (i = 0; i < ETH_ALEN - sizeof(u32); i++)
dev->dev_addr[i] = 0xfc;
- memcpy(&(dev->dev_addr[i]), &dev->pa_addr, sizeof(ulong));
+ memcpy(&(dev->dev_addr[i]), &dev->pa_addr, sizeof(u32));
/* If this interface has slaves, start them also */
@@ -1265,7 +1268,7 @@
* guaranteed to be invalid. Need that to check
* for already compressed packets in isdn_ppp_xmit().
*/
- *((unsigned long *)skb_push(skb, len)) = 0;
+ *((u32 *)skb_push(skb, len)) = 0;
break;
#endif
}
@@ -1275,7 +1278,7 @@
/* We don't need to send arp, because we have point-to-point connections. */
static int
-isdn_net_rebuild_header(void *buff, struct device *dev, ulong dst,
+isdn_net_rebuild_header(void *buff, struct device *dev, u32 dst,
struct sk_buff *skb)
{
isdn_net_local *lp = dev->priv;
Index: isdn_ppp.c
===================================================================
RCS file: /i4ldev/isdn/drivers/isdn/isdn_ppp.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- isdn_ppp.c 1996/06/11 14:50:29 1.10
+++ isdn_ppp.c 1996/06/16 17:46:05 1.11
@@ -1,4 +1,4 @@
-/* $Id: isdn_ppp.c,v 1.10 1996/06/11 14:50:29 hipp Exp $
+/* $Id: isdn_ppp.c,v 1.11 1996/06/16 17:46:05 tsbogend Exp $
*
* Linux ISDN subsystem, functions for synchronous PPP (linklevel).
*
@@ -19,6 +19,9 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Log: isdn_ppp.c,v $
+ * Revision 1.11 1996/06/16 17:46:05 tsbogend
+ * changed unsigned long to u32 to make Alpha people happy
+ *
* Revision 1.10 1996/06/11 14:50:29 hipp
* Lot of changes and bugfixes.
* New scheme to resend packets to busy LL devices.
@@ -87,7 +90,7 @@
int BEbyte, int *sqno, int min_sqno);
#endif
-char *isdn_ppp_revision = "$Revision: 1.10 $";
+char *isdn_ppp_revision = "$Revision: 1.11 $";
struct ippp_struct *ippp_table[ISDN_MAX_CHANNELS];
extern int isdn_net_force_dial_lp(isdn_net_local *);
@@ -936,7 +939,7 @@
* therefore its first bytes are already initialized. In this case
* send it immediately ...
*/
- if (*((unsigned long *)skb->data) != 0) {
+ if (*((u32 *)skb->data) != 0) {
printk(KERN_ERR "%s: Whoops .. packet resend should no longer happen!\n",dev->name);
return (isdn_net_send_skb(dev , lp , skb));
}
---------------------------------------------------------------------
Second patch:
--- /bigbug/var/src/i4l/isdn/drivers/isdn/icn/icn.c Wed Jun 12 00:55:36 1996
+++ icn.c Sun Jun 16 17:05:27 1996
@@ -156,7 +155,7 @@
cli();
while ((skb = skb_dequeue(queue))) {
skb->free = 1;
- kfree_skb(skb, FREE_WRITE);
+ dev_kfree_skb(skb, FREE_WRITE);
}
restore_flags(flags);
}
@@ -391,11 +390,6 @@
restore_flags(flags);
break;
}
- if (skb->lock) {
- restore_flags(flags);
- break;
- }
- skb->lock = 1;
restore_flags(flags);
if (skb->len > ICN_FRAGSIZE) {
writeb (0xff, &sbuf_f);
@@ -413,14 +407,12 @@
if (!skb->len) {
skb = skb_dequeue(&card->spqueue[channel]);
skb->free = 1;
- skb->lock = 0;
- kfree_skb(skb, FREE_WRITE);
+ dev_kfree_skb(skb, FREE_WRITE);
cmd.command = ISDN_STAT_BSENT;
cmd.driver = card->myid;
cmd.arg = channel;
card->interface.statcallb(&cmd);
- } else
- skb->lock = 0;
+ }
if (!icn_trymaplock_channel(card, mch))
break;
}
@@ -696,7 +688,7 @@
if (len > 4000) {
skb->free = 1;
- kfree_skb(skb, FREE_WRITE);
+ dev_kfree_skb(skb, FREE_WRITE);
return -EINVAL;
}
if (len) {
@@ -827,7 +819,7 @@
icn_lock_channel(card,0); /* Lock Bank 0 */
restore_flags(flags);
SLEEP(1);
- memcpy_fromfs_toio(dev.shmem, buffer, ICN_CODE_STAGE1); /* Copy code */
+ memcpy_fromfs_toio((unsigned long)dev.shmem, buffer, ICN_CODE_STAGE1); /* Copy code */
#ifdef BOOT_DEBUG
printk(KERN_DEBUG "Bootloader transfered\n");
#endif
@@ -843,7 +835,7 @@
icn_lock_channel(card,2); /* Lock Bank 8 */
restore_flags(flags);
SLEEP(1);
- memcpy_fromfs_toio(dev.shmem, buffer, ICN_CODE_STAGE1); /* Copy code */
+ memcpy_fromfs_toio((unsigned long)dev.shmem, buffer, ICN_CODE_STAGE1); /* Copy code */
#ifdef BOOT_DEBUG
printk(KERN_DEBUG "Bootloader transfered\n");
#endif
@@ -895,7 +887,7 @@
while (left) {
if (sbfree) { /* If there is a free buffer... */
cnt = MIN(256, left);
- memcpy_fromfs_toio(&sbuf_l, p, cnt); /* copy data */
+ memcpy_fromfs_toio((unsigned long)&sbuf_l, p, cnt); /* copy data */
sbnext; /* switch to next buffer */
p += cnt;
left -= cnt;
@@ -1115,7 +1107,7 @@
}
break;
case ICN_IOCTL_GETMMIO:
- return (int) dev.shmem;
+ return (long) dev.shmem;
case ICN_IOCTL_SETPORT:
if (a == 0x300 || a == 0x310 || a == 0x320 || a == 0x330
|| a == 0x340 || a == 0x350 || a == 0x360 ||
@@ -1579,7 +1571,7 @@
char rev[10];
memset(&dev, 0, sizeof(icn_dev));
- dev.shmem = (icn_shmem *) (membase & 0x0ffc000);
+ dev.shmem = (icn_shmem *) ((unsigned long)membase & 0x0ffc000);
dev.channel = -1;
dev.mcard = NULL;
@@ -1592,8 +1584,8 @@
*p = 0;
} else
strcpy(rev, " ??? ");
- printk(KERN_NOTICE "ICN-ISDN-driver Rev%smem=0x%08x\n", rev,
- (uint) dev.shmem);
+ printk(KERN_NOTICE "ICN-ISDN-driver Rev%smem=0x%08lx\n", rev,
+ (ulong) dev.shmem);
return (icn_addcard(portbase,icn_id,icn_id2));
}
--
That process _deserves_ to die ("My name is Linus Torvalds, prepare to
die"). [Linus Torvalds on linux-kernel]