Linux device driver design