PERFORCE change 94416 for review

Marcel Moolenaar marcel at FreeBSD.org
Sat Apr 1 19:11:30 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=94416

Change 94416 by marcel at marcel_nfs on 2006/04/01 19:11:26

	IFC @94415

Affected files ...

.. //depot/projects/uart/amd64/conf/GENERIC#15 integrate
.. //depot/projects/uart/boot/forth/beastie.4th#7 integrate
.. //depot/projects/uart/compat/linux/linux_socket.c#11 integrate
.. //depot/projects/uart/compat/svr4/svr4_stream.c#8 integrate
.. //depot/projects/uart/conf/files.powerpc#8 integrate
.. //depot/projects/uart/dev/mpt/mpt.c#12 integrate
.. //depot/projects/uart/dev/mpt/mpt.h#9 integrate
.. //depot/projects/uart/dev/mpt/mpt_cam.c#9 integrate
.. //depot/projects/uart/dev/mpt/mpt_debug.c#11 integrate
.. //depot/projects/uart/dev/mpt/mpt_pci.c#15 integrate
.. //depot/projects/uart/dev/scc/scc_bfe.h#16 integrate
.. //depot/projects/uart/dev/scc/scc_bfe_ebus.c#7 integrate
.. //depot/projects/uart/dev/scc/scc_bfe_macio.c#1 branch
.. //depot/projects/uart/dev/scc/scc_bfe_sbus.c#7 integrate
.. //depot/projects/uart/dev/scc/scc_core.c#20 integrate
.. //depot/projects/uart/dev/scc/scc_dev_sab82532.c#9 integrate
.. //depot/projects/uart/dev/scc/scc_dev_z8530.c#11 integrate
.. //depot/projects/uart/dev/uart/uart_cpu.h#19 integrate
.. //depot/projects/uart/dev/uart/uart_dev_ns8250.c#39 integrate
.. //depot/projects/uart/dev/uart/uart_dev_sab82532.c#41 integrate
.. //depot/projects/uart/dev/uart/uart_dev_z8530.c#29 integrate
.. //depot/projects/uart/fs/devfs/devfs_vnops.c#14 integrate
.. //depot/projects/uart/i386/conf/GENERIC#14 integrate
.. //depot/projects/uart/kern/kern_descrip.c#22 integrate
.. //depot/projects/uart/kern/uipc_socket.c#17 integrate
.. //depot/projects/uart/kern/uipc_socket2.c#11 integrate
.. //depot/projects/uart/kern/uipc_syscalls.c#17 integrate
.. //depot/projects/uart/kern/uipc_usrreq.c#11 integrate
.. //depot/projects/uart/kern/vfs_mount.c#22 integrate
.. //depot/projects/uart/kern/vfs_subr.c#26 integrate
.. //depot/projects/uart/modules/scc/Makefile#4 integrate
.. //depot/projects/uart/net/raw_cb.c#5 integrate
.. //depot/projects/uart/net/raw_usrreq.c#6 integrate
.. //depot/projects/uart/net/rtsock.c#11 integrate
.. //depot/projects/uart/netatalk/ddp_usrreq.c#7 integrate
.. //depot/projects/uart/netatm/atm_aal5.c#6 integrate
.. //depot/projects/uart/netatm/atm_proto.c#6 integrate
.. //depot/projects/uart/netatm/atm_socket.c#9 integrate
.. //depot/projects/uart/netatm/atm_usrreq.c#7 integrate
.. //depot/projects/uart/netatm/atm_var.h#7 integrate
.. //depot/projects/uart/netgraph/bluetooth/include/ng_btsocket_hci_raw.h#4 integrate
.. //depot/projects/uart/netgraph/bluetooth/include/ng_btsocket_l2cap.h#5 integrate
.. //depot/projects/uart/netgraph/bluetooth/include/ng_btsocket_rfcomm.h#6 integrate
.. //depot/projects/uart/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c#6 integrate
.. //depot/projects/uart/netgraph/bluetooth/socket/ng_btsocket_l2cap.c#7 integrate
.. //depot/projects/uart/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c#6 integrate
.. //depot/projects/uart/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c#8 integrate
.. //depot/projects/uart/netgraph/ng_socket.c#9 integrate
.. //depot/projects/uart/netinet/in_pcb.c#12 integrate
.. //depot/projects/uart/netinet/in_pcb.h#8 integrate
.. //depot/projects/uart/netinet/ip_divert.c#10 integrate
.. //depot/projects/uart/netinet/raw_ip.c#14 integrate
.. //depot/projects/uart/netinet/tcp_input.c#19 integrate
.. //depot/projects/uart/netinet/tcp_subr.c#15 integrate
.. //depot/projects/uart/netinet/tcp_timer.c#11 integrate
.. //depot/projects/uart/netinet/tcp_usrreq.c#10 integrate
.. //depot/projects/uart/netinet/tcp_var.h#11 integrate
.. //depot/projects/uart/netinet/udp_usrreq.c#14 integrate
.. //depot/projects/uart/netinet6/in6_pcb.c#10 integrate
.. //depot/projects/uart/netinet6/in6_pcb.h#4 integrate
.. //depot/projects/uart/netinet6/raw_ip6.c#10 integrate
.. //depot/projects/uart/netinet6/udp6_usrreq.c#9 integrate
.. //depot/projects/uart/netipsec/keysock.c#8 integrate
.. //depot/projects/uart/netipx/ipx_usrreq.c#7 integrate
.. //depot/projects/uart/netipx/spx_usrreq.c#12 integrate
.. //depot/projects/uart/netkey/keysock.c#9 integrate
.. //depot/projects/uart/netnatm/natm.c#9 integrate
.. //depot/projects/uart/nfsclient/nfs_vfsops.c#12 integrate
.. //depot/projects/uart/sys/protosw.h#8 integrate
.. //depot/projects/uart/sys/socketvar.h#11 integrate

Differences ...

==== //depot/projects/uart/amd64/conf/GENERIC#15 (text+ko) ====

@@ -16,7 +16,7 @@
 # If you are in doubt as to the purpose or necessity of a line, check first
 # in NOTES.
 #
-# $FreeBSD: src/sys/amd64/conf/GENERIC,v 1.450 2006/03/29 09:57:21 scottl Exp $
+# $FreeBSD: src/sys/amd64/conf/GENERIC,v 1.451 2006/03/31 23:04:48 emax Exp $
 
 cpu		HAMMER
 ident		GENERIC
@@ -148,6 +148,8 @@
 device		atkbd		# AT keyboard
 device		psm		# PS/2 mouse
 
+device		kbdmux		# keyboard multiplexer
+
 device		vga		# VGA video card driver
 
 device		splash		# Splash screen and screen saver support

==== //depot/projects/uart/boot/forth/beastie.4th#7 (text+ko) ====

@@ -23,7 +23,7 @@
 \ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 \ SUCH DAMAGE.
 \
-\ $FreeBSD: src/sys/boot/forth/beastie.4th,v 1.11 2005/10/30 05:36:23 scottl Exp $
+\ $FreeBSD: src/sys/boot/forth/beastie.4th,v 1.12 2006/03/31 21:36:17 scottl Exp $
 
 marker task-beastie.4th
 
@@ -40,7 +40,6 @@
 
 variable bootkey
 variable bootacpikey
-variable bootusbkey
 variable bootsafekey
 variable bootverbosekey
 variable bootsinglekey
@@ -196,12 +195,6 @@
 	printmenuitem ."  Boot FreeBSD in single user mode" bootsinglekey !
 	printmenuitem ."  Boot FreeBSD with verbose logging" bootverbosekey !
 	printmenuitem ."  Escape to loader prompt" escapekey !
-	s" arch-i386" environment? if
-		drop
-		printmenuitem ."  Boot FreeBSD with USB keyboard" bootusbkey !
-	else
-		-2 bootusbkey !
-	then
 	printmenuitem ."  Reboot" rebootkey !
 	menuX @ 20 at-xy
 	." Select option, [Enter] for default"
@@ -267,10 +260,6 @@
 			then
 			0 boot
 		then
-		dup bootusbkey @ = if
-			s" 0x1" s" hint.atkbd.0.flags" setenv
-			0 boot
-		then
 		dup bootsafekey @ = if
 			s" arch-i386" environment? if
 				drop
@@ -283,6 +272,7 @@
 			s" 0" s" hw.ata.atapi_dma" setenv
 			s" 0" s" hw.ata.wc" setenv
 			s" 0" s" hw.eisa_slots" setenv
+			s" 1" s" hint.kbdmux.0.disabled" setenv
 			0 boot
 		then
 		dup bootverbosekey @ = if

==== //depot/projects/uart/compat/linux/linux_socket.c#11 (text+ko) ====

@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/linux/linux_socket.c,v 1.66 2006/03/21 21:56:04 netchild Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/linux/linux_socket.c,v 1.67 2006/04/01 15:25:01 rwatson Exp $");
 
 /* XXX we use functions that might not exist. */
 #include "opt_compat.h"
@@ -662,6 +662,10 @@
 	 * Linux doesn't return EISCONN the first time it occurs,
 	 * when on a non-blocking socket. Instead it returns the
 	 * error getsockopt(SOL_SOCKET, SO_ERROR) would return on BSD.
+	 *
+	 * XXXRW: Instead of using fgetsock(), check that it is a
+	 * socket and use the file descriptor reference instead of
+	 * creating a new one.
 	 */
 	NET_LOCK_GIANT();
 	error = fgetsock(td, linux_args.s, &so, &fflag);

==== //depot/projects/uart/compat/svr4/svr4_stream.c#8 (text+ko) ====

@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/svr4/svr4_stream.c,v 1.56 2005/09/28 07:03:02 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/svr4/svr4_stream.c,v 1.57 2006/04/01 15:25:01 rwatson Exp $");
 
 #include "opt_compat.h"
 #include "opt_ktrace.h"
@@ -167,6 +167,10 @@
 	struct uio *ktruio = NULL;
 #endif
 
+	/*
+	 * XXXRW: Instead of using fgetsock(), just rely on the file
+	 * descriptor reference.
+	 */
 	if ((error = fgetsock(td, s, &so, NULL)) != 0)
 		return (error);
 
@@ -263,6 +267,10 @@
 	struct uio *ktruio = NULL;
 #endif
 
+	/*
+	 * XXXRW: Instead of using fgetsock(), just rely on the file
+	 * descriptor reference.
+	 */
 	if ((error = fgetsock(td, s, &so, NULL)) != 0)
 		return (error);
 

==== //depot/projects/uart/conf/files.powerpc#8 (text+ko) ====

@@ -1,7 +1,7 @@
 # This file tells config what files go into building a kernel,
 # files marked standard are always included.
 #
-# $FreeBSD: src/sys/conf/files.powerpc,v 1.50 2006/03/31 01:42:55 marcel Exp $
+# $FreeBSD: src/sys/conf/files.powerpc,v 1.51 2006/04/01 04:53:08 marcel Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -116,5 +116,6 @@
 powerpc/psim/openpic_iobus.c	optional psim
 powerpc/psim/sio_iobus.c	optional sio psim
 
+dev/scc/scc_bfe_macio.c		optional	scc powermac
 dev/zs/zs.c			optional	powermac zs
 dev/zs/zs_macio.c		optional	powermac zs

==== //depot/projects/uart/dev/mpt/mpt.c#12 (text+ko) ====

@@ -92,7 +92,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt.c,v 1.23 2006/03/26 07:16:17 mjacob Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt.c,v 1.24 2006/04/01 07:12:18 mjacob Exp $");
 
 #include <dev/mpt/mpt.h>
 #include <dev/mpt/mpt_cam.h> /* XXX For static handler registration */
@@ -477,12 +477,12 @@
 		req->state &= ~REQ_STATE_QUEUED;
 		req->state |= REQ_STATE_DONE;
 		TAILQ_REMOVE(&mpt->request_pending_list, req, links);
-
-		if ((req->state & REQ_STATE_NEED_WAKEUP) != 0)
+		if ((req->state & REQ_STATE_NEED_WAKEUP) != 0) {
 			wakeup(req);
+		}
 	}
 
-	return (/*free_reply*/TRUE);
+	return (TRUE);
 }
 
 static int
@@ -490,7 +490,7 @@
  uint32_t reply_desc, MSG_DEFAULT_REPLY *reply_frame)
 {
 	/* Nothing to be done. */
-	return (/*free_reply*/TRUE);
+	return (TRUE);
 }
 
 static int
@@ -499,11 +499,8 @@
 {
 	int free_reply;
 
-	if (reply_frame == NULL) {
-		mpt_prt(mpt, "Event Handler: req %p:%u - Unexpected NULL reply\n",
-		    req, req->serno);
-		return (/*free_reply*/TRUE);
-	}
+	KASSERT(reply_frame != NULL, ("null reply in mpt_event_reply_handler"));
+	KASSERT(req != NULL, ("null request in mpt_event_reply_handler"));
 
 	free_reply = TRUE;
 	switch (reply_frame->Function) {
@@ -535,7 +532,7 @@
 			uint32_t context;
 
 			context = htole32(req->index|MPT_REPLY_HANDLER_EVENTS);
-			ack_req = mpt_get_request(mpt, /*sleep_ok*/FALSE);
+			ack_req = mpt_get_request(mpt, FALSE);
 			if (ack_req == NULL) {
 				struct mpt_evtf_record *evtf;
 
@@ -546,32 +543,59 @@
 				break;
 			}
 			mpt_send_event_ack(mpt, ack_req, msg, context);
+			/*
+			 * Don't check for CONTINUATION_REPLY here
+			 */
+			return (free_reply);
 		}
 		break;
 	}
 	case MPI_FUNCTION_PORT_ENABLE:
-		mpt_lprt(mpt, MPT_PRT_DEBUG, "enable port reply\n");
+		mpt_lprt(mpt, MPT_PRT_DEBUG , "enable port reply\n");
 		break;
 	case MPI_FUNCTION_EVENT_ACK:
 		break;
 	default:
-		mpt_prt(mpt, "Unknown Event Function: %x\n",
+		mpt_prt(mpt, "unknown event function: %x\n",
 			reply_frame->Function);
 		break;
 	}
 
-	if (req != NULL
-	 && (reply_frame->MsgFlags & MPI_MSGFLAGS_CONTINUATION_REPLY) == 0) {
-
-		req->state &= ~REQ_STATE_QUEUED;
-		req->state |= REQ_STATE_DONE;
+	/*
+	 * I'm not sure that this continuation stuff works as it should.
+	 *
+	 * I've had FC async events occur that free the frame up because
+	 * the continuation bit isn't set, and then additional async events
+	 * then occur using the same context. As you might imagine, this
+	 * leads to Very Bad Thing.
+	 *
+	 *  Let's just be safe for now and not free them up until we figure
+	 * out what's actually happening here.
+	 */
+#if	0
+	if ((reply_frame->MsgFlags & MPI_MSGFLAGS_CONTINUATION_REPLY) == 0) {
 		TAILQ_REMOVE(&mpt->request_pending_list, req, links);
-
-		if ((req->state & REQ_STATE_NEED_WAKEUP) != 0)
-			wakeup(req);
-		else
-			mpt_free_request(mpt, req);
+		mpt_free_request(mpt, req);
+		mpt_prt(mpt, "event_reply %x for req %p:%u NOT a continuation",
+		    reply_frame->Function, req, req->serno);
+		if (reply_frame->Function == MPI_FUNCTION_EVENT_NOTIFICATION) {
+			MSG_EVENT_NOTIFY_REPLY *msg =
+			    (MSG_EVENT_NOTIFY_REPLY *)reply_frame;
+			mpt_prtc(mpt, " Event=0x%x AckReq=%d",
+			    msg->Event, msg->AckRequired);
+		}
+	} else {
+		mpt_prt(mpt, "event_reply %x for %p:%u IS a continuation",
+		    reply_frame->Function, req, req->serno);
+		if (reply_frame->Function == MPI_FUNCTION_EVENT_NOTIFICATION) {
+			MSG_EVENT_NOTIFY_REPLY *msg =
+			    (MSG_EVENT_NOTIFY_REPLY *)reply_frame;
+			mpt_prtc(mpt, " Event=0x%x AckReq=%d",
+			    msg->Event, msg->AckRequired);
+		}
+		mpt_prtc(mpt, "\n");
 	}
+#endif
 	return (free_reply);
 }
 
@@ -609,10 +633,10 @@
 	case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE:
 		break;
 	default:
-		return (/*handled*/0);
+		return (0);
 		break;
 	}
-	return (/*handled*/1);
+	return (1);
 }
 
 static void
@@ -622,7 +646,7 @@
 	MSG_EVENT_ACK *ackp;
 
 	ackp = (MSG_EVENT_ACK *)ack_req->req_vbuf;
-	bzero(ackp, sizeof *ackp);
+	memset(ackp, 0, sizeof (*ackp));
 	ackp->Function = MPI_FUNCTION_EVENT_ACK;
 	ackp->Event = msg->Event;
 	ackp->EventContext = msg->EventContext;
@@ -637,6 +661,7 @@
 {
 	struct mpt_softc *mpt;
 	uint32_t reply_desc;
+	uint32_t last_reply_desc = MPT_REPLY_EMPTY;
 	int ntrips = 0;
 
 	mpt = (struct mpt_softc *)arg;
@@ -649,6 +674,15 @@
 		u_int		   req_index;
 		int		   free_rf;
 
+		if (reply_desc == last_reply_desc) {
+			mpt_prt(mpt, "debounce reply_desc 0x%x\n", reply_desc);
+			if (ntrips++ == 1000) {
+				break;
+			}
+			continue;
+		}
+		last_reply_desc = reply_desc;
+
 		req = NULL;
 		reply_frame = NULL;
 		reply_baddr = 0;
@@ -657,7 +691,7 @@
 			/*
 			 * Insure that the reply frame is coherent.
 			 */
-			reply_baddr = (reply_desc << 1);
+			reply_baddr = MPT_REPLY_BADDR(reply_desc);
 			offset = reply_baddr - (mpt->reply_phys & 0xFFFFFFFF);
 			bus_dmamap_sync_range(mpt->reply_dmat,
 			    mpt->reply_dmap, offset, MPT_REPLY_SIZE,
@@ -732,13 +766,17 @@
 		req_index = MPT_CONTEXT_TO_REQI(ctxt_idx);
 		if (req_index < MPT_MAX_REQUESTS(mpt)) {
 			req = &mpt->request_pool[req_index];
+		} else {
+			mpt_prt(mpt, "WARN: mpt_intr index == %d (reply_desc =="
+			    " 0x%x)\n", req_index, reply_desc);
 		}
 
 		free_rf = mpt_reply_handlers[cb_index](mpt, req,
 		    reply_desc, reply_frame);
 
-		if (reply_frame != NULL && free_rf)
+		if (reply_frame != NULL && free_rf) {
 			mpt_free_reply(mpt, reply_baddr);
+		}
 
 		/*
 		 * If we got ourselves disabled, don't get stuck in a loop
@@ -761,12 +799,13 @@
 	MSG_DEFAULT_REPLY  ioc_status_frame;
 	request_t	  *req;
 
-	bzero(&ioc_status_frame, sizeof(ioc_status_frame));
+	memset(&ioc_status_frame, 0, sizeof(ioc_status_frame));
 	ioc_status_frame.MsgLength = roundup2(sizeof(ioc_status_frame), 4);
 	ioc_status_frame.IOCStatus = iocstatus;
 	while((req = TAILQ_FIRST(chain)) != NULL) {
 		MSG_REQUEST_HEADER *msg_hdr;
 		u_int		    cb_index;
+
 		TAILQ_REMOVE(chain, req, links);
 		msg_hdr = (MSG_REQUEST_HEADER *)req->req_vbuf;
 		ioc_status_frame.Function = msg_hdr->Function;
@@ -784,7 +823,6 @@
 void
 mpt_dump_reply_frame(struct mpt_softc *mpt, MSG_DEFAULT_REPLY *reply_frame)
 {
-
 	mpt_prt(mpt, "Address Reply:\n");
 	mpt_print_reply(reply_frame);
 }
@@ -1072,7 +1110,7 @@
 			pers->reset(mpt, ret);
 	}
 
-	if (reinit != 0) {
+	if (reinit) {
 		ret = mpt_enable_ioc(mpt, 1);
 		if (ret == MPT_OK) {
 			mpt_enable_ints(mpt);
@@ -1100,13 +1138,18 @@
 		req->chain = NULL;
 		mpt_free_request(mpt, nxt);	/* NB: recursion */
 	}
-	req->serno = 0;
+
+	KASSERT(req->state != REQ_STATE_FREE, ("freeing free request"));
+	KASSERT(!(req->state & REQ_STATE_LOCKED), ("freeing locked request"));
+
 	req->ccb = NULL;
-	req->state = REQ_STATE_FREE;
+
 	if (LIST_EMPTY(&mpt->ack_frames)) {
 		/*
 		 * Insert free ones at the tail
 		 */
+		req->serno = 0;
+		req->state = REQ_STATE_FREE;
 		TAILQ_INSERT_TAIL(&mpt->request_free_list, req, links);
 		if (mpt->getreqwaiter != 0) {
 			mpt->getreqwaiter = 0;
@@ -1120,6 +1163,10 @@
 	 */
 	record = LIST_FIRST(&mpt->ack_frames);
 	LIST_REMOVE(record, links);
+	req->state = REQ_STATE_ALLOCATED;
+	if ((req->serno = mpt->sequence++) == 0) {
+		req->serno = mpt->sequence++;
+	}
 	mpt_send_event_ack(mpt, req, &record->reply, record->context);
 	reply_baddr = (uint32_t)((uint8_t *)record - mpt->reply)
 		    + (mpt->reply_phys & 0xFFFFFFFF);
@@ -1137,16 +1184,20 @@
 	if (req != NULL) {
 		KASSERT(req == &mpt->request_pool[req->index],
 		    ("mpt_get_request: corrupted request free list\n"));
+		KASSERT(req->state == REQ_STATE_FREE,
+		    ("req not free on free list %x", req->state));
 		TAILQ_REMOVE(&mpt->request_free_list, req, links);
 		req->state = REQ_STATE_ALLOCATED;
 		req->chain = NULL;
-		req->serno = mpt->sequence++;
+		if ((req->serno = mpt->sequence++) == 0) {
+			req->serno = mpt->sequence++;
+		}
 	} else if (sleep_ok != 0) {
 		mpt->getreqwaiter = 1;
 		mpt_sleep(mpt, &mpt->request_free_list, PUSER, "mptgreq", 0);
 		goto retry;
 	}
-	return req;
+	return (req);
 }
 
 /* Pass the command to the IOC */
@@ -1339,11 +1390,21 @@
 	*data16++ = mpt_read(mpt, MPT_OFFSET_DOORBELL) & MPT_DB_DATA_MASK;
 	mpt_write(mpt, MPT_OFFSET_INTR_STATUS, 0);
 
-	/* With the second word, we can now look at the length */
-	if (((reply_len >> 1) != hdr->MsgLength)) {
+	/*
+	 * With the second word, we can now look at the length.
+	 * Warn about a reply that's too short (except for IOC FACTS REPLY)
+	 */
+	if ((reply_len >> 1) != hdr->MsgLength &&
+	    (hdr->Function != MPI_FUNCTION_IOC_FACTS)){
+#if __FreeBSD_version >= 500000
+		mpt_prt(mpt, "reply length does not match message length: "
+			"got %x; expected %x for function %x\n",
+			hdr->MsgLength << 2, reply_len << 1, hdr->Function);
+#else
 		mpt_prt(mpt, "reply length does not match message length: "
-			"got 0x%02x, expected 0x%02zx\n",
-			hdr->MsgLength << 2, reply_len << 1);
+			"got %x; expected %zx for function %x\n",
+			hdr->MsgLength << 2, reply_len << 1, hdr->Function);
+#endif
 	}
 
 	/* Get rest of the reply; but don't overflow the provided buffer */
@@ -1386,7 +1447,7 @@
 	MSG_IOC_FACTS f_req;
 	int error;
 	
-	bzero(&f_req, sizeof f_req);
+	memset(&f_req, 0, sizeof f_req);
 	f_req.Function = MPI_FUNCTION_IOC_FACTS;
 	f_req.MsgContext = htole32(MPT_REPLY_HANDLER_HANDSHAKE);
 	error = mpt_send_handshake_cmd(mpt, sizeof f_req, &f_req);
@@ -1426,7 +1487,7 @@
 	MSG_IOC_INIT init;
 	MSG_IOC_INIT_REPLY reply;
 
-	bzero(&init, sizeof init);
+	memset(&init, 0, sizeof init);
 	init.WhoInit = who;
 	init.Function = MPI_FUNCTION_IOC_INIT;
 	if (mpt->is_fc) {
@@ -1644,10 +1705,17 @@
 	if (rv)
 		return (rv);
 
+#if __FreeBSD_version >= 500000
 	mpt_lprt(mpt, MPT_PRT_DEBUG,  "IOC Page 2 Header: ver %x, len %zx, "
 		 "num %x, type %x\n", hdr.PageVersion,
 		 hdr.PageLength * sizeof(uint32_t),
 		 hdr.PageNumber, hdr.PageType);
+#else
+	mpt_lprt(mpt, MPT_PRT_DEBUG,  "IOC Page 2 Header: ver %x, len %z, "
+		 "num %x, type %x\n", hdr.PageVersion,
+		 hdr.PageLength * sizeof(uint32_t),
+		 hdr.PageNumber, hdr.PageType);
+#endif
 
 	len = hdr.PageLength * sizeof(uint32_t);
 	mpt->ioc_page2 = malloc(len, M_DEVBUF, M_NOWAIT | M_ZERO);
@@ -1788,7 +1856,7 @@
 		return (-1);
 
 	enable_req = req->req_vbuf;
-	bzero(enable_req, MPT_RQSL(mpt));
+	memset(enable_req, 0,  MPT_RQSL(mpt));
 
 	enable_req->Function   = MPI_FUNCTION_PORT_ENABLE;
 	enable_req->MsgContext = htole32(req->index | MPT_REPLY_HANDLER_CONFIG);
@@ -1812,9 +1880,6 @@
 
 /*
  * Enable/Disable asynchronous event reporting.
- *
- * NB: this is the first command we send via shared memory
- * instead of the handshake register.
  */
 static int
 mpt_send_event_request(struct mpt_softc *mpt, int onoff)
@@ -1822,20 +1887,24 @@
 	request_t *req;
 	MSG_EVENT_NOTIFY *enable_req;
 
-	req = mpt_get_request(mpt, /*sleep_ok*/FALSE);
-
+	req = mpt_get_request(mpt, FALSE);
+	if (req == NULL) {
+		return (ENOMEM);
+	}
 	enable_req = req->req_vbuf;
-	bzero(enable_req, sizeof *enable_req);
+	memset(enable_req, 0, sizeof *enable_req);
 
 	enable_req->Function   = MPI_FUNCTION_EVENT_NOTIFICATION;
 	enable_req->MsgContext = htole32(req->index | MPT_REPLY_HANDLER_EVENTS);
 	enable_req->Switch     = onoff;
 
 	mpt_check_doorbell(mpt);
-	mpt_lprt(mpt, MPT_PRT_DEBUG,
-		 "%sabling async events\n", onoff ? "en" : "dis");
+	mpt_lprt(mpt, MPT_PRT_DEBUG, "%sabling async events\n",
+	    onoff ? "en" : "dis");
+	/*
+	 * Send the command off, but don't wait for it.
+	 */
 	mpt_send_cmd(mpt, req);
-
 	return (0);
 }
 
@@ -1980,8 +2049,11 @@
 	/* Put all request buffers on the free list */
 	TAILQ_INIT(&mpt->request_pending_list);
 	TAILQ_INIT(&mpt->request_free_list);
+	TAILQ_INIT(&mpt->request_timeout_list);
 	for (val = 0; val < MPT_MAX_REQUESTS(mpt); val++) {
-		mpt_free_request(mpt, &mpt->request_pool[val]);
+		request_t *req = &mpt->request_pool[val];
+		req->state = REQ_STATE_ALLOCATED;
+		mpt_free_request(mpt, req);
 	}
 
 	for (val = 0; val < MPT_MAX_LUNS; val++) {
@@ -2462,7 +2534,8 @@
 
 
 	/*
-	 * Enable the port if asked
+	 * Enable the port if asked. This is only done if we're resetting
+	 * the IOC after initial startup.
 	 */
 	if (portenable) {
 		/*

==== //depot/projects/uart/dev/mpt/mpt.h#9 (text+ko) ====

@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/dev/mpt/mpt.h,v 1.13 2006/03/25 07:08:26 mjacob Exp $ */
+/* $FreeBSD: src/sys/dev/mpt/mpt.h,v 1.14 2006/04/01 07:12:18 mjacob Exp $ */
 /*-
  * Generic defines for LSI '909 FC  adapters.
  * FreeBSD Version.
@@ -278,12 +278,14 @@
 
 /**************************** MPI Transaction State ***************************/
 typedef enum {
-	REQ_STATE_FREE		= 0x00,
-	REQ_STATE_ALLOCATED	= 0x01,
-	REQ_STATE_QUEUED	= 0x02,
-	REQ_STATE_DONE		= 0x04,
-	REQ_STATE_TIMEDOUT	= 0x08,
-	REQ_STATE_NEED_WAKEUP	= 0x10,
+	REQ_STATE_NIL		= 0x00,
+	REQ_STATE_FREE		= 0x01,
+	REQ_STATE_ALLOCATED	= 0x02,
+	REQ_STATE_QUEUED	= 0x04,
+	REQ_STATE_DONE		= 0x08,
+	REQ_STATE_TIMEDOUT	= 0x10,
+	REQ_STATE_NEED_WAKEUP	= 0x20,
+	REQ_STATE_LOCKED	= 0x80,	/* can't be freed */
 	REQ_STATE_MASK		= 0xFF
 } mpt_req_state_t; 
 
@@ -292,7 +294,7 @@
 	mpt_req_state_t	state;		/* Request State Information */
 	uint16_t	index;		/* Index of this entry */
 	uint16_t	IOCStatus;	/* Completion status */
-	uint16_t	serno;		/* serial number */
+	uint32_t	serno;		/* serial number */
 	union ccb      *ccb;		/* CAM request */
 	void	       *req_vbuf;	/* Virtual Address of Entry */
 	void	       *sense_vbuf;	/* Virtual Address of sense data */
@@ -310,11 +312,11 @@
 	uint32_t bytes_xfered;	/* current relative offset */
 	union ccb *ccb;		/* pointer to currently active ccb */
 	request_t *req;		/* pointer to currently active assist request */
-	int	flags;
-#define	BOGUS_JO	0x01
 	int	nxfers;
+	uint32_t tag_id;
 	enum {
 		TGT_STATE_NIL,
+		TGT_STATE_LOADING,
 		TGT_STATE_LOADED,
 		TGT_STATE_IN_CAM,
                 TGT_STATE_SETTING_UP_FOR_DATA,
@@ -335,12 +337,12 @@
  * which owns the incoming ATIO plus a rolling sequence number.
  */
 #define	MPT_MAKE_TAGID(mpt, req, ioindex)	\
-	((ioindex << 16) | (mpt->sequence++))
+ ((ioindex << 18) | (((mpt->sequence++) & 0x3f) << 12) | (req->index & 0xfff))
 
 #ifdef	INVARIANTS
 #define	MPT_TAG_2_REQ(a, b)		mpt_tag_2_req(a, (uint32_t) b)
 #else
-#define	MPT_TAG_2_REQ(mpt, tag)		mpt->tgt_cmd_ptrs[tag >> 16]
+#define	MPT_TAG_2_REQ(mpt, tag)		mpt->tgt_cmd_ptrs[tag >> 18]
 #endif
 
 #define	MPT_TGT_STATE(mpt, req) ((mpt_tgt_state_t *) \
@@ -509,6 +511,7 @@
 	uint8_t		mpt_max_devices;
 	uint8_t		mpt_max_buses;
 	uint8_t		ioc_facts_flags;
+	uint8_t		padding0;
 
 	/*
 	 * Port Facts
@@ -615,11 +618,6 @@
 	struct req_queue	request_pending_list;
 	struct req_queue	request_timeout_list;
 
-	/*
-	 * Deferred frame acks due to resource shortage.
-	 */
-	struct mpt_evtf_list	ack_frames;
-
 
 	struct cam_sim	       *sim;
 	struct cam_path	       *path;
@@ -631,6 +629,10 @@
 	request_t	       *tmf_req;
 
 	/*
+	 * Deferred frame acks due to resource shortage.
+	 */
+	struct mpt_evtf_list	ack_frames;
+	/*
 	 * Target Mode Support
 	 */
 	uint32_t		scsi_tgt_handler_id;
@@ -644,13 +646,11 @@
 	tgt_resource_t		trt_wildcard;	/* wildcard luns */
 	tgt_resource_t		trt[MPT_MAX_LUNS];
 	uint16_t		tgt_cmds_allocated;
+	uint16_t		padding1;
 
-	/*
-	 * Stuff..
-	 */
-	uint16_t		sequence;	/* Sequence Number */
 	uint16_t		timeouts;	/* timeout count */
 	uint16_t		success;	/* successes afer timeout */
+	uint32_t		sequence;	/* Sequence Number */
 
 
 	/* Opposing port in a 929 or 1030, or NULL */
@@ -806,18 +806,12 @@
 #define MPT_SENSE_SIZE		32	/* included in MPT_REQUEST_AREA */
 #define MPT_REQ_MEM_SIZE(mpt)	(MPT_MAX_REQUESTS(mpt) * MPT_REQUEST_AREA)
 
-/*
- * Currently we try to pack both callbacks and request indices into 14 bits
- * so that we don't have to get fancy when we get a target mode context
- * reply (which only has 14 bits of IoIndex value) or a normal scsi
- * initiator context reply (where we get bits 28..0 of context).
- */
-#define MPT_CONTEXT_CB_SHIFT	(14)
+#define MPT_CONTEXT_CB_SHIFT	(16)
 #define MPT_CBI(handle)		(handle >> MPT_CONTEXT_CB_SHIFT)
 #define MPT_CBI_TO_HID(cbi)	((cbi) << MPT_CONTEXT_CB_SHIFT)
 #define MPT_CONTEXT_TO_CBI(x)	\
     (((x) >> MPT_CONTEXT_CB_SHIFT) & (MPT_NUM_REPLY_HANDLERS - 1))
-#define MPT_CONTEXT_REQI_MASK	0x3FFF
+#define MPT_CONTEXT_REQI_MASK	0xFFFF
 #define MPT_CONTEXT_TO_REQI(x)	((x) & MPT_CONTEXT_REQI_MASK)
 
 /*
@@ -857,8 +851,9 @@
      return mpt_read(mpt, MPT_OFFSET_REPLY_Q);
 }
 
-void mpt_complete_request_chain(struct mpt_softc *mpt,
-				struct req_queue *chain, u_int iocstatus);
+void
+mpt_complete_request_chain(struct mpt_softc *, struct req_queue *, u_int);
+
 /************************** Scatter Gather Managment **************************/
 /* MPT_RQSL- size of request frame, in bytes */
 #define	MPT_RQSL(mpt)		(mpt->request_frame_size << 2)
@@ -954,7 +949,7 @@
 static __inline request_t *
 mpt_tag_2_req(struct mpt_softc *mpt, uint32_t tag)
 {
-	uint16_t rtg = (tag >> 16);
+	uint16_t rtg = (tag >> 18);
 	KASSERT(rtg < mpt->tgt_cmds_allocated, ("bad tag %d\n", tag));
 	KASSERT(mpt->tgt_cmd_ptrs, ("no cmd backpointer array"));
 	KASSERT(mpt->tgt_cmd_ptrs[rtg], ("no cmd backpointer"));

==== //depot/projects/uart/dev/mpt/mpt_cam.c#9 (text+ko) ====

@@ -91,7 +91,7 @@
  * OWNER OR CONTRIBUTOR IS ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_cam.c,v 1.12 2006/03/25 07:08:26 mjacob Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/mpt/mpt_cam.c,v 1.13 2006/04/01 07:12:18 mjacob Exp $");
 
 #include <dev/mpt/mpt.h>
 #include <dev/mpt/mpt_cam.h>
@@ -114,19 +114,18 @@
 static mpt_reply_handler_t mpt_scsi_reply_handler;
 static mpt_reply_handler_t mpt_scsi_tmf_reply_handler;
 static mpt_reply_handler_t mpt_fc_els_reply_handler;
-static mpt_reply_handler_t mpt_scsi_tgt_reply_handler;
-static int mpt_scsi_reply_frame_handler(struct mpt_softc *mpt, request_t *req,
-					MSG_DEFAULT_REPLY *reply_frame);
-static int mpt_bus_reset(struct mpt_softc *, int /*sleep_ok*/);
+static int mpt_scsi_reply_frame_handler(struct mpt_softc *, request_t *,
+					MSG_DEFAULT_REPLY *);
+static int mpt_bus_reset(struct mpt_softc *, int);
 static int mpt_fc_reset_link(struct mpt_softc *, int);
 
 static int mpt_spawn_recovery_thread(struct mpt_softc *mpt);
 static void mpt_terminate_recovery_thread(struct mpt_softc *mpt);
 static void mpt_recovery_thread(void *arg);
-static int mpt_scsi_send_tmf(struct mpt_softc *, u_int /*type*/,
-			     u_int /*flags*/, u_int /*channel*/,
-			     u_int /*target*/, u_int /*lun*/,
-			     u_int /*abort_ctx*/, int /*sleep_ok*/);
+static void mpt_recover_commands(struct mpt_softc *mpt);
+
+static int mpt_scsi_send_tmf(struct mpt_softc *, u_int, u_int, u_int,
+    u_int, u_int, u_int, int);
 
 static void mpt_fc_add_els(struct mpt_softc *mpt, request_t *);
 static void mpt_post_target_command(struct mpt_softc *, request_t *, int);
@@ -135,9 +134,15 @@
 static int mpt_disable_lun(struct mpt_softc *, target_id_t, lun_id_t);
 static void mpt_target_start_io(struct mpt_softc *, union ccb *);
 static cam_status mpt_abort_target_ccb(struct mpt_softc *, union ccb *);
-static cam_status mpt_abort_target_cmd(struct mpt_softc *, request_t *);
-
-static void mpt_recover_commands(struct mpt_softc *mpt);
+static int mpt_abort_target_cmd(struct mpt_softc *, request_t *);
+static void mpt_scsi_tgt_status(struct mpt_softc *, union ccb *, request_t *,
+    uint8_t, uint8_t const *);
+static void
+mpt_scsi_tgt_tsk_mgmt(struct mpt_softc *, request_t *, mpt_task_mgmt_t,
+    tgt_resource_t *, int);
+static void mpt_tgt_dump_tgt_state(struct mpt_softc *, request_t *);
+static void mpt_tgt_dump_req_state(struct mpt_softc *, request_t *);
+static mpt_reply_handler_t mpt_scsi_tgt_reply_handler;
 
 static uint32_t scsi_io_handler_id = MPT_HANDLER_ID_NONE;
 static uint32_t scsi_tmf_handler_id = MPT_HANDLER_ID_NONE;
@@ -257,7 +262,7 @@
 	/*
 	 * We keep one request reserved for timeout TMF requests.
 	 */
-	mpt->tmf_req = mpt_get_request(mpt, /*sleep_ok*/FALSE);
+	mpt->tmf_req = mpt_get_request(mpt, FALSE);
 	if (mpt->tmf_req == NULL) {
 		mpt_prt(mpt, "Unable to allocate dedicated TMF request!\n");
 		error = ENOMEM;
@@ -435,6 +440,10 @@
 	U32 fl;
 	int r, doit = 0;
 
+	if ((mpt->role & MPT_ROLE_TARGET) == 0) {
+		return (0);
+	}
+
 	r = mpt_read_cfg_header(mpt, MPI_CONFIG_PAGETYPE_FC_PORT, 1, 0,
 	    &fc.Header, FALSE, 5000);
 	if (r) {
@@ -478,6 +487,10 @@
 		}
 		mpt_prt(mpt, cc);
 	}
+#else
+	if ((mpt->role & MPT_ROLE_TARGET) == 0) {
+		return (0);
+	}
 #endif
 	return (mpt_fc_reset_link(mpt, 1));
 }
@@ -822,17 +835,12 @@
 	request_t	 *req;
 
 	ccb = (union ccb *)arg;
-#ifdef NOTYET
-	mpt = mpt_find_softc(mpt);
-	if (mpt == NULL)
-		return;
-#else
 	mpt = ccb->ccb_h.ccb_mpt_ptr;
-#endif
 
 	MPT_LOCK(mpt);
 	req = ccb->ccb_h.ccb_req_ptr;
-	mpt_prt(mpt, "Request %p Timed out.\n", req);
+	mpt_prt(mpt, "request %p:%u timed out for ccb %p (req->ccb %p)\n", req,
+	    req->serno, ccb, req->ccb);
 	if ((req->state & REQ_STATE_QUEUED) == REQ_STATE_QUEUED) {
 		TAILQ_REMOVE(&mpt->request_pending_list, req, links);
 		TAILQ_INSERT_TAIL(&mpt->request_timeout_list, req, links);
@@ -993,7 +1001,7 @@
 	for (seg = 0; seg < first_lim; seg++, se++, dm_segs++) {
 		uint32_t tf;
 
-		bzero(se, sizeof (*se));
+		memset(se, 0, sizeof (*se));
 		se->Address.Low = dm_segs->ds_addr;
 		if (sizeof(bus_addr_t) > 4) {
 			se->Address.High = ((uint64_t) dm_segs->ds_addr) >> 32;
@@ -1061,7 +1069,7 @@
 		/*
 		 * Now initialized the chain descriptor.
 		 */
-		bzero(ce, sizeof (SGE_CHAIN64));
+		memset(ce, 0, sizeof (*ce));
 
 		/*
 		 * Get the physical address of the chain list.
@@ -1108,7 +1116,7 @@
 		 * set the end of list and end of buffer flags.
 		 */
 		while (seg < this_seg_lim) {
-			bzero(se, sizeof (*se));
+			memset(se, 0, sizeof (*se));
 			se->Address.Low = dm_segs->ds_addr;
 			if (sizeof (bus_addr_t) > 4) {
 				se->Address.High =
@@ -1369,7 +1377,7 @@
 	for (seg = 0; seg < first_lim; seg++, se++, dm_segs++) {
 		uint32_t tf;
 
-		bzero(se, sizeof (*se));
+		memset(se, 0,sizeof (*se));
 		se->Address = dm_segs->ds_addr;
 		MPI_pSGE_SET_LENGTH(se, dm_segs->ds_len);
 		tf = flags;
@@ -1434,7 +1442,7 @@
 		/*
 		 * Now initialized the chain descriptor.
 		 */
-		bzero(ce, sizeof (SGE_CHAIN32));
+		memset(ce, 0, sizeof (*ce));
 
 		/*
 		 * Get the physical address of the chain list.
@@ -1476,7 +1484,7 @@
 		 * set the end of list and end of buffer flags.
 		 */
 		while (seg < this_seg_lim) {
-			bzero(se, sizeof (*se));
+			memset(se, 0, sizeof (*se));
 			se->Address = dm_segs->ds_addr;
 			MPI_pSGE_SET_LENGTH(se, dm_segs->ds_len);
 			tf = flags;
@@ -1604,8 +1612,7 @@
 	raid_passthru = (sim == mpt->phydisk_sim);
 
 	CAMLOCK_2_MPTLOCK(mpt);
-	/* Get a request structure off the free list */
-	if ((req = mpt_get_request(mpt, /*sleep_ok*/FALSE)) == NULL) {
+	if ((req = mpt_get_request(mpt, FALSE)) == NULL) {
 		if (mpt->outofbeer == 0) {
 			mpt->outofbeer = 1;
 			xpt_freeze_simq(mpt->sim, 1);
@@ -1642,15 +1649,13 @@
 
 	/* Now we build the command for the IOC */
 	mpt_req = req->req_vbuf;
-	bzero(mpt_req, sizeof *mpt_req);
+	memset(mpt_req, 0, sizeof (MSG_SCSI_IO_REQUEST));
 
 	mpt_req->Function = MPI_FUNCTION_SCSI_IO_REQUEST;
 	if (raid_passthru) {
 		mpt_req->Function = MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH;
 	}
-
 	mpt_req->Bus = 0;	/* we don't have multiport devices yet */
-
 	mpt_req->SenseBufferLength =

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list