[movitz-cvs] CVS update: movitz/losp/x86-pc/dp8390.lisp
Frode Vatvedt Fjeld
ffjeld at common-lisp.net
Thu Feb 26 11:19:17 UTC 2004
Update of /project/movitz/cvsroot/movitz/losp/x86-pc
In directory common-lisp.net:/tmp/cvs-serv27591
Modified Files:
dp8390.lisp
Log Message:
Cleaned up this driver code quite a bit, I think it's quite a bit
neater now.
Date: Thu Feb 26 06:19:17 2004
Author: ffjeld
Index: movitz/losp/x86-pc/dp8390.lisp
diff -u movitz/losp/x86-pc/dp8390.lisp:1.5 movitz/losp/x86-pc/dp8390.lisp:1.6
--- movitz/losp/x86-pc/dp8390.lisp:1.5 Mon Feb 2 09:03:13 2004
+++ movitz/losp/x86-pc/dp8390.lisp Thu Feb 26 06:19:17 2004
@@ -10,7 +10,7 @@
;;;; Author: Frode Vatvedt Fjeld <frodef at acm.org>
;;;; Created at: Wed Sep 18 12:21:36 2002
;;;;
-;;;; $Id: dp8390.lisp,v 1.5 2004/02/02 14:03:13 ffjeld Exp $
+;;;; $Id: dp8390.lisp,v 1.6 2004/02/26 11:19:17 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -22,7 +22,7 @@
(in-package muerte.x86-pc.ne2k)
(defconstant +page0-read-map+
- #(cr clda0 clda1 bnry tsr ncr fifo isr crda0 crda1 rsr cntr0 cntr1 cntr2))
+ #(cr clda0 clda1 bnry tsr ncr fifo isr crda0 crda1 rbcr0 rbcr1 rsr cntr0 cntr1 cntr2))
(defconstant +page0-write-map+
#(cr pstart pstop bnry tpsr tbcr0 tbcr1 isr rsar0 rsar1 rbcr0 rbcr1 rcr tcr dcr imr))
@@ -109,9 +109,11 @@
(dp8390 ($page0-read isr)))
(setf (dp8390 ($page0-write isr))
(ash 1 ($interrupt-status dma-complete)))
- (error "Incomplete dp8390~@[ ~A~] @ #x~X DMA: crda=#x~X."
+ (error "Incomplete dp8390~@[ ~A~] @ #x~X DMA: crda=#x~X~@[, rbcr=#x~X~]."
command io-base
- (io-register8x2 dp8390 ($page0-read crda1) ($page0-read crda0)))))
+ (io-register8x2 dp8390 ($page0-read crda1) ($page0-read crda0))
+ (let ((x (io-register8x2 dp8390 ($page0-read rbcr1) ($page0-read rbcr0))))
+ (unless (= x #xffff) x)))))
nil)
(defun initialize-dma (io-base command size &optional address)
@@ -170,14 +172,14 @@
((io-base
:initarg :io-base
:reader io-base)
- (cached-curr
+ (write-pointer ; This is (* 256 CURR)
:documentation "This register is written by the device and read by the driver when neccessary."
- :initarg :cached-curr
- :accessor cached-curr)
- (cached-bnry
+ :initarg :write-pointer
+ :accessor write-pointer)
+ (read-pointer ; This is (* 256 BNRY)
:documentation "This register is cached on a write-through basis. It's only read by the device."
- :initarg :cached-bnry
- :accessor cached-bnry)
+ :initarg :read-pointer
+ :accessor read-pointer)
(transmit-buffer
:initarg :transmit-buffer
:reader transmit-buffer)
@@ -191,17 +193,21 @@
:initform 0
:accessor ring-overflow-count)))
-(defun ring-empty-p (device)
- "Is the dp8390 receive buffer ring empty?"
- (not (or (/= (cached-curr device) ; Can we tell from the cached values alone?
- (cached-bnry device))
- (with-dp8390 (dp8390 (io-base device))
- (setf (dp8390 ($page0-write cr)) ($command page-1))
- (let ((new-curr (dp8390 ($page1-read curr)))) ; must update CURR register cache.
- (setf (cached-curr device) new-curr)
- (setf (dp8390 ($page1-write cr)) ($command page-0)) ; restore page 0
- (/= new-curr (cached-bnry device)))))))
-
+(defun next-packet (device)
+ "If there's a packet available in the ring, return its ring pointer address.
+ Otherwise, return nil."
+ (let ((read-pointer (read-pointer device)))
+ (if (/= (write-pointer device) ; Can we tell from the cached values alone?
+ read-pointer)
+ read-pointer
+ (with-dp8390 (dp8390 (io-base device))
+ (setf (dp8390 ($page0-write cr)) ($command page-1))
+ (let ((new-write-pointer (* 256 (dp8390 ($page1-read curr))))) ; update CURR register cache.
+ (setf (dp8390 ($page1-write cr)) ($command page-0)) ; restore page 0
+ (unless (= new-write-pointer read-pointer)
+ (setf (write-pointer device) new-write-pointer)
+ read-pointer))))))
+
(defmethod (setf mac-address) :after (mac-address (device dp8390-device))
"Keep the dp8390 device registers in sync with mac-address."
(check-type mac-address vector)
@@ -258,13 +264,13 @@
(dp8390 ($page0-write rbcr0)) 0
(dp8390 ($page0-write rbcr1)) 0
(dp8390 ($page0-write rcr)) rx-config
- (dp8390 ($page0-write tpsr)) (slot-value device 'transmit-buffer) ; address
+ (dp8390 ($page0-write tpsr)) (truncate (slot-value device 'transmit-buffer) 256) ; address
(dp8390 ($page0-write tcr)) ($tx-config loopback-mode-1) ; internal loopback
- (dp8390 ($page0-write pstart)) (slot-value device 'ring-start)
- (dp8390 ($page0-write bnry)) (slot-value device 'ring-start)
- (dp8390 ($page0-write pstop)) (slot-value device 'ring-stop)
+ (dp8390 ($page0-write pstart)) (truncate (slot-value device 'ring-start) 256)
+ (dp8390 ($page0-write bnry)) (truncate (slot-value device 'ring-start) 256)
+ (dp8390 ($page0-write pstop)) (truncate (slot-value device 'ring-stop) 256)
(dp8390 ($page0-write cr)) ($command page-1 stop)
- (dp8390 ($page1-write curr)) (slot-value device 'ring-start)
+ (dp8390 ($page1-write curr)) (truncate (slot-value device 'ring-start) 256)
(dp8390 ($page1-write cr)) ($command page-0 start)
(dp8390 ($page0-write isr)) #xff
(dp8390 ($page0-write imr)) interrupt-mask
More information about the Movitz-cvs
mailing list