Linux Device Drivers by Alessandro Rubini Following are the changes made in the 6/00 reprint: Here's a key to the markup: [page-number]: serious technical mistake {page-number}: minor technical mistake : important language/formatting problem (page-number): language change or minor formatting problem ?page-number?: reader question or request for clarification (25) The text used to read: "If any errors occur when you register utilities..." It now reads: "If any errors occur when you register facilities..." (27) The line "Decrements the count." was changed to roman font. (27) The text used to read: "This situation may very well to happen..." It now reads: "This situation may very well happen..." [33] The code used to read: add += (size & ~2048) - 2048; /* skip it */ It now reads: add += ((size + 2047) & ~2047) -2048; /* skip it */ [45] The code used to read: chgrp $group /dev/${device} chmod $mode /dev/${device} It now reads: chgrp $group /dev/${device}[0-3] chmod $mode /dev/${device}[0-3] (46) The text before the code used to read: "scull.c" It now reads: "scull/main.c" (54) The section heading used to read: "Open and Close" It now reads: "Open and Release" {56} The code used to read: return filp->f_op->open(inode, filp); It now reads: return filp->f_op->open(inode, filp); /* dispatch to specific open */ <57> The paragraph beginning with "A new struct file..." was changed to read: "A new "struct file" is created only by "open". The "close" system call executes the "release" method only when the counter for the structure drops to zero, which happens when the structure is destroyed. This relationship between the "release" method and the "close" system call guarantees that the usage count for modules is always consistent." <208> The line used to read: "The return value is 0 only if the variable *v is 0 after being decremented." It now reads: "The return value is 1 only if the variable *v is 0 after being decremented, 0 otherwise." (245) The line used to read: "....request function in the sbull device is show below." It now reads: "....request function in the sbull device is shown below." [321] The code used to read: if (dev->tbusy) { /* shouldn't happen */ retval = -EBUSY; goto tx_done; } It now reads: if (dev->tbusy) { /* shouldn't happen */ return -EBUSY; } [321] The code used to read: tx_done: dev_kfree_skb(skb, FREE_WRITE); /* release it */ It now reads: tx_done: skb->free=1; dev_kfree_skb(skb, FREE_WRITE); /* release it */ <326> The following text was added to the variable list: "volatile char free; The flag must be set before the skb structure is freed." <353> The following text was removed from the page: "The specification also states that the address regions are allocated in order, from PCI_BASE_ADDRESS_0 to PCI_BASE_ADDRESS_5; as soon as one base address is unused (i.e. set to 0), you know that any subsequent address is also unused." {392} The text in the middle of the page used to read: "memcpy_tofs" It now reads: "memcpy_fromfs"