2
Calls the
simple_lock_try( )
routine to try to assert a lock with read
and write access for the resource that is associated with the specified
simple lock. The
el_start( )
routine calls
simple_lock_try( )
rather than
simple_lock( )
because
simple_lock_try( )
returns
immediately if the resource is already locked;
simple_lock( )
spins until the lock has been obtained. Make sure that you call
simple_lock_try( )
when you need a simple lock but the code cannot
spin until the lock is obtained.
In this example,
simple_lock_try( )
was used as an optimization.
If the simple lock is already held, then another thread is executing
somewhere in the driver and is either currently servicing the transmit
request queue or will service it soon. Therefore, the transmit request
that was put on the send queue prior to calling the
start
interface
will be handled shortly. In this case, the code does not need to wait for
the lock (because someone else will do the transmit) and can return to
the caller.
The argument to
simple_lock_try( )
is a pointer to a simple lock
data structure. The
if_el
device driver declares the simple lock data
structure by calling the
decl_simple_lock_data( )
routine, and it
stores a pointer to this data structure in the
el_softc
data structure.
3
If the
simple_lock_try( )
routine fails to assert the simple lock,
calls the
splx( )
routine to reset the CPU priority to the level that
the
s
variable specifies, then returns. Otherwise, the simple lock was
obtained.
9.1.2 Calling the el_start_locked Routine
The following code shows how the
el_start( )
routine calls the
el_start_locked( )
routine, which starts the transmit operation:
el_start_locked(sc, ifp);
1
1
Calls the
el_start_locked( )
routine, which performs the tasks that
are related to the start operation.
9.1.3 Releasing the Simple Lock and Resetting the IPL
The following code shows how the
el_start( )
routine releases the simple
lock and resets the IPL.
simple_unlock(&sc->el_softc_lock);
1
splx(s);
2
}
1
Calls the
simple_unlock( )
routine to release a simple lock for the
resource that is associated with the specified simple lock data structure.
9–2 Implementing the Start Section